为什么需要 RAG
大语言模型存在两个固有局限:知识截止日期和私有数据盲区。RAG(Retrieval-Augmented Generation)通过在推理时动态检索外部知识库,将相关文档片段注入 Prompt,让模型"看到"实时或私有数据后再作答。
RAG 工作原理
用户提问
↓
[Query Embedding] → 将问题转为向量
↓
[向量检索] → 在知识库中找 Top-K 相似文档
↓
[Prompt 组装] → 将文档片段 + 原始问题拼入 Prompt
↓
[LLM 生成] → 基于检索到的上下文回答
↓
最终答案
核心组件
| 组件 | 常用方案 | 说明 |
|---|---|---|
| 文档加载 | LangChain Loaders | 支持 PDF/Word/Markdown/网页 |
| 文本切分 | RecursiveCharacterTextSplitter | 按语义边界切分,chunk_size 推荐 512 |
| Embedding 模型 | text-embedding-3-small / BGE-M3 | 本地可用 BGE 中文模型 |
| 向量数据库 | Chroma / Qdrant / FAISS | Chroma 适合本地,Qdrant 适合生产 |
| LLM | GPT-4o / DeepSeek / Ollama | 本地完全私有用 Ollama |
实战:Python 搭建本地知识库
安装依赖
pip install langchain langchain-openai chromadb pypdf文档加载与切分
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader("company_docs.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50, # 相邻 chunk 重叠,避免信息截断
separators=["\n\n", "\n", "。", "!", "?"]
)
chunks = splitter.split_documents(docs)
print(f"切分为 {len(chunks)} 个片段")
向量化并存入 Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectordb = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
vectordb.persist()
print("知识库构建完成")
检索增强问答
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", temperature=0)
retriever = vectordb.as_retriever(search_kwargs={"k": 4})
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
result = qa_chain.invoke("公司的年假政策是什么?")
print(result["result"])
来源文档
for doc in result["source_documents"]:
print(f"来源:{doc.metadata['source']} 第{doc.metadata['page']}页")
检索优化策略
| 策略 | 方法 | 效果 |
|---|---|---|
| 混合检索 | 向量检索 + BM25 关键词检索 | 提升召回率 |
| 重排序 | Cohere Rerank / BGE-Reranker | 提升精准度 |
| HyDE | 先生成假设答案再检索 | 处理抽象问题 |
| 查询扩展 | LLM 生成多个相关查询 | 提升覆盖率 |
小结
RAG 的核心在于"先找后答"——通过高质量的文本切分和向量检索,确保 LLM 获得准确的上下文。生产环境中建议使用混合检索 + 重排序组合,并定期更新向量库以保持知识的时效性。