RAG知识库实战教程:从零搭建企业级知识库
什么是RAG
RAG(Retrieval-Augmented Generation)= 检索增强生成
原理:
用户提问 → 检索相关文档 → 把文档+问题一起给LLM → 生成回答
例子:
用户问:"公司的退货政策是什么?"
检索到:《退货政策文档》第3章
LLM根据文档生成: "根据公司政策,商品签收7天内可无理由退货..."
为什么需要RAG:
- LLM不知道你的私有数据(公司文档、产品手册、内部知识)
- 微调太贵且需要持续更新
- RAG可以实时更新知识,成本低
商业价值:
- 企业知识库问答系统:¥10000-¥50000/套
- 客服机器人:替代人工客服,月省¥20000+
- 文档搜索引擎:比传统搜索智能100倍
- 培训助手:新员工培训自动化
方案1:RAGFlow(推荐)
安装
# Docker一键部署
docker compose -f docker-compose.yml up -d
# 或源码安装
git clone https://github.com/infiniflow/ragflow.git
cd ragflow
pip install -r requirements.txt
核心功能
RAGFlow特色:
├── 深度文档解析(PDF/Word/Excel/PPT)
├── 自动分块(智能切分,不是简单按字数)
├── 多种检索模式(向量/关键词/混合)
├── 可视化管理界面
└── API接口
使用流程
# 1. 创建知识库
import requests
BASE_URL = "http://localhost:9380"
# 创建Dataset
resp = requests.post(f"{BASE_URL}/api/v1/datasets", json={
"name": "产品手册",
"chunk_method": "intelligent", # 智能分块
"parser_config": {
"layout_recognize": True, # 自动识别文档结构
}
})
dataset_id = resp.json()["data"]["id"]
# 2. 上传文档
files = [
"product_manual.pdf",
"faq.docx",
"price_list.xlsx",
]
for f in files:
requests.post(
f"{BASE_URL}/api/v1/datasets/{dataset_id}/documents",
files={"file": open(f, "rb")}
)
# 3. 检索+生成
resp = requests.post(f"{BASE_URL}/api/v1/chats", json={
"question": "产品A的退货政策是什么?",
"dataset_ids": [dataset_id],
})
print(resp.json()["data"]["answer"])
方案2:Dify(最简单)
安装
# Docker部署
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d
# 访问 http://localhost:3000
创建知识库应用
步骤:
1. 登录Dify Web界面
2. 创建"知识库" → 上传文档
3. 创建"应用" → 选择"聊天助手"
4. 关联知识库
5. 发布应用
全程无代码!
API调用
import requests
# Dify API
resp = requests.post(
"http://localhost:3000/v1/chat-messages",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"inputs": {},
"query": "产品A的退货政策是什么?",
"response_mode": "streaming",
"user": "user-123",
}
)
方案3:自建RAG(最灵活)
核心代码
# rag_system.py - 500行搞定
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader
from langchain.chains import RetrievalQA
from langchain.llms import Ollama
class RAGSystem:
def __init__(self, model_name="qwen2.5:14b"):
self.embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-large-zh-v1.5" # 中文embedding
)
self.llm = Ollama(model=model_name)
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
)
self.vectorstore = None
def load_documents(self, file_paths: list[str]):
"""加载文档"""
documents = []
for path in file_paths:
if path.endswith(".pdf"):
loader = PyPDFLoader(path)
elif path.endswith(".docx"):
loader = Docx2txtLoader(path)
else:
continue
documents.extend(loader.load())
# 分块
texts = self.text_splitter.split_documents(documents)
# 向量化存储
self.vectorstore = Chroma.from_documents(
texts,
self.embeddings,
persist_directory="./chroma_db"
)
print(f"已加载 {len(texts)} 个文本块")
def query(self, question: str) -> str:
"""查询"""
if not self.vectorstore:
return "请先加载文档"
# 检索
retriever = self.vectorstore.as_retriever(
search_type="mmr", # 最大边际相关性
search_kwargs={"k": 5}
)
# 生成
chain = RetrievalQA.from_chain_type(
llm=self.llm,
retriever=retriever,
return_source_documents=True,
)
result = chain.invoke({"query": question})
return result["result"]
# 使用
rag = RAGSystem()
rag.load_documents(["manual.pdf", "faq.docx"])
answer = rag.query("退货政策是什么?")
print(answer)
高级优化
1. 混合检索
# 向量 + 关键词混合检索
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever
# BM25关键词检索
bm25_retriever = BM25Retriever.from_documents(texts)
bm25_retriever.k = 5
# 向量检索
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# 混合
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6] # 关键词40%,向量60%
)
2. 重排序
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
# 用Cohere重排序
compressor = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=ensemble_retriever,
)
3. 多轮对话
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True,
)
chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory,
)
商业化案例
案例1:企业知识库
客户:中型制造企业(500人)
需求:员工查询产品手册、流程规范、FAQ
技术:RAGFlow + Qwen2.5-14B
报价:¥30000(一次性)+ ¥3000/月(维护)
案例2:智能客服
客户:电商平台
需求:替代5个人工客服
技术:Dify + GPT-4o
报价:¥20000(部署)+ ¥5000/月
节省:人工客服¥25000/月 → AI客服¥5000/月
案例3:法律助手
客户:律师事务所
需求:查询法律法规、案例、合同模板
技术:自建RAG + 法律数据
报价:¥50000
下节预告
下一课:n8n/Dify自动化工作流——让AI帮你做重复性工作。
评论