← 返回

检索增强生成 (RAG)

RAG(Retrieval-Augmented Generation)让 LLM 能访问外部知识,解决知识截止和幻觉问题。

为什么需要 RAG?

LLM 有两个局限:

RAG 通过检索相关文档,然后让 LLM 基于这些文档回答,解决这两个问题。

RAG vs Fine-tuning

场景 RAG Fine-tuning
私有知识 ✅ 最佳选择 ❌ 效果差
知识更新 ✅ 实时更新 ❌ 需重新训练
领域知识 ✅ 外挂知识库 ✅ 融入模型
风格/格式 ❌ 不适用 ✅ 最佳选择

RAG 流程

用户提问
    ↓
1. 问题转向 (可选)
2. 检索相关文档
3. 重新排序 (可选)
4. 生成回答
5. 答案验证 (可选)

核心组件详解

1. 文档切分 (Chunking)

长文档需要切成小块,太小丢失上下文,太大检索精度低。

推荐 chunk 大小: 500-1000 字
重叠: 100-200 字 (保留上下文)

切分策略:

2. Embedding 模型

每个 chunk 转成向量存储。

3. 向量数据库

数据库 类型 适用场景
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: 检索不到相关文档怎么办?

学习资源