主题
RAG(检索增强生成)
RAG(Retrieval-Augmented Generation)是解决 LLM "幻觉"和"知识过期"问题的最有效方案。
什么是 RAG
LLM 的痛点:
- 训练数据有截止日期(不知道最新信息)
- 无法访问私有数据(公司内部文档)
- 会编造答案(幻觉)
RAG 的解决方案:让 LLM 在回答前,先查资料
传统 LLM:
用户问 → LLM 直接答(可能瞎编)
RAG:
用户问 → 先检索相关资料 → 把资料给 LLM → LLM 基于资料回答RAG 工作流程
┌───────────┐
│ 1. 建立知识库 │
│ 文档 → 切片 → 向量化 → 存入向量数据库 │
└───────────┘
↓
┌───────────┐
│ 2. 用户提问 │
│ 问题 → 向量化 → 在向量库中检索相关片段 │
└───────────┘
↓
┌───────────┐
│ 3. 增强生成 │
│ 问题 + 检索到的片段 → LLM → 最终答案 │
└───────────┘核心步骤详解
1. 文档切片(Chunking)
把文档切成小块,太大则检索不精准,太小则丢失上下文:
python
# 常见策略
- 按固定字数切分(如每 500 字一块)
- 按段落切分
- 按语义切分(保留完整意思)
- 滑动窗口(相邻块有重叠)2. 向量化(Embedding)
把文本转换成向量(数字数组),语义相似的文本向量也相似:
python
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("什么是 RAG?")
# vector: [0.123, -0.456, ..., 0.789] 1536 维3. 向量检索
用户提问 → 转成向量 → 在向量库中找最相似的文档片段:
python
# 语义相似,不是关键词匹配
查询:"怎么部署 Docker?"
检索结果:包含"Docker 部署步骤"、"Docker 安装教程"的片段
(即使没有完全匹配"怎么部署"这个词)4. 生成回答
把检索到的片段作为上下文,让 LLM 基于这些资料回答:
python
prompt = f"""
根据以下资料回答问题,不要使用资料以外的信息。
如果资料中没有答案,请说"不知道"。
资料:
{retrieved_docs}
问题:{user_question}
回答:
"""技术栈
| 组件 | 常用选择 |
|---|---|
| Embedding 模型 | OpenAI text-embedding-3、BGE、M3E |
| 向量数据库 | Milvus、Pinecone、Chroma、Qdrant |
| LLM | GPT-4、Claude、本地模型 |
| 框架 | LangChain、LlamaIndex |
简单实现(LangChain)
python
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
# 1. 构建向量库
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
loader = TextLoader("company_docs.txt")
documents = loader.load()
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(documents)
vectorstore = Chroma.from_documents(docs, OpenAIEmbeddings())
# 2. 创建 RAG 链
qa = RetrievalQA.from_chain_type(
llm=ChatOpenAI(),
retriever=vectorstore.as_retriever()
)
# 3. 提问
answer = qa.run("公司的年假政策是什么?")RAG 优化技巧
1. Hybrid Search(混合检索)
向量检索 + 关键词检索,各有优势:
python
# 向量检索:语义相似("怎么部署" ≈ "部署步骤")
# 关键词检索:精确匹配(必须包含"Docker")
# 两者结合,效果最好2. Rerank(重排序)
检索到 20 个候选,用更精确的模型重新排序,取 Top 5:
python
# 第一遍:快速检索(向量相似度)
candidates = vectorstore.similarity_search(query, k=20)
# 第二遍:精确重排(Cross-Encoder)
reranked = rerank_model.rank(query, candidates, top_k=5)3. 元数据过滤
给每个文档片段加上元数据,检索时先过滤:
python
# 只检索"技术文档"类型的文档
results = vectorstore.similarity_search(
query,
filter={"doc_type": "tech_doc"}
)RAG vs Fine-tuning
| 维度 | RAG | Fine-tuning |
|---|---|---|
| 知识更新 | 实时(更新文档即可) | 需要重新训练 |
| 成本 | 低(只用 API) | 高(需要 GPU) |
| 幻觉 | 少(有资料依据) | 仍可能有 |
| 适用场景 | 知识库问答 | 改变模型行为/风格 |
建议:优先用 RAG,解决不了再考虑 Fine-tuning,或者两者结合。