RAG(Retrieval-Augmented Generation)让 LLM 能访问外部知识,解决知识截止和幻觉问题。
LLM 有两个局限:
RAG 通过检索相关文档,然后让 LLM 基于这些文档回答,解决这两个问题。
| 场景 | RAG | Fine-tuning |
|---|---|---|
| 私有知识 | ✅ 最佳选择 | ❌ 效果差 |
| 知识更新 | ✅ 实时更新 | ❌ 需重新训练 |
| 领域知识 | ✅ 外挂知识库 | ✅ 融入模型 |
| 风格/格式 | ❌ 不适用 | ✅ 最佳选择 |
用户提问
↓
1. 问题转向 (可选)
2. 检索相关文档
3. 重新排序 (可选)
4. 生成回答
5. 答案验证 (可选)
1. 文档切分 (Chunking)
长文档需要切成小块,太小丢失上下文,太大检索精度低。
推荐 chunk 大小: 500-1000 字 重叠: 100-200 字 (保留上下文)
切分策略:
2. Embedding 模型
每个 chunk 转成向量存储。
text-embedding-3-smallbge-base-zh, m3e-basetext-embedding-3-large3. 向量数据库
| 数据库 | 类型 | 适用场景 |
|---|---|---|
| Pinecone | 云服务 | 快速上线,无需运维 |
| Weaviate | 开源 | 自托管,功能丰富 |
| Chroma | 开源 | 轻量级,本地开发 |
| Milvus | 开源 | 大规模,生产级 |
| pgvector | PostgreSQL 扩展 | 已有 PG 集成 |
4. 检索策略
1. HyDE (Hypothetical Document Embeddings)
1. LLM 生成"假设的理想答案" 2. 用这个答案来检索(而非原始问题) 3. 检索精度显著提升
2. 多轮查询扩展
用户问题: "怎么减肥?" 扩展查询: - "减脂方法" - "瘦身技巧" - "饮食控制" → 用多个查询检索,召回更全
3. 融合检索 (Hybrid Search)
最终得分 = α × 语义相似度 + (1-α) × 关键词得分 α 通常在 0.5-0.7 之间
4. 父子检索
小块检索 → 返回父块 平衡:检索精度 + 上下文完整性
LangChain
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
# 加载文档
loader = TextLoader("doc.txt")
docs = loader.load()
# 切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(docs)
# 创建向量库
vectorstore = Chroma.from_documents(
documents=splits,
embedding=OpenAIEmbeddings()
)
# 检索 + 生成
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(),
retriever=retriever
)
result = qa_chain.invoke("你的问题")
Q: chunk 大小怎么选?
Q: 检索不到相关文档怎么办?