什么是 RAG
LLM 的知识问题
LLM 有两个根本性的知识缺陷:
知识截止:模型的知识停留在训练数据的截止日期。2024 年 1 月训练的模型不知道 2024 年 2 月发生了什么。你问它最新的新闻,它要么承认不知道,要么自信地编造一个。
幻觉:模型会自信地给出看起来合理但完全错误的信息。它不是在"查找"答案,而是在"生成"最可能的文本——这两者有本质区别。
RAG:给 LLM 配一个搜索引擎
RAG(Retrieval-Augmented Generation,检索增强生成)的核心思想很简单:
在模型回答之前,先从外部知识库中检索相关信息,把这些信息塞进 Prompt 里,然后让模型基于这些信息来回答。
用一个类比:如果说 LLM 是一个知识渊博但可能记错细节的专家,RAG 就是在他回答之前先帮他查一下参考资料。
RAG 的工作流程
用户提问
↓
将问题转换为向量(Embedding)
↓
在向量数据库中搜索最相关的文档片段
↓
将检索到的文档片段 + 原始问题一起发给 LLM
↓
LLM 基于提供的上下文生成回答
一个具体的例子。假设你有一个公司内部知识库:
用户:"我们的退款政策是什么?"
1. 将问题转为向量
2. 在知识库中找到最相关的文档:
- "退款政策.md" → "用户可在购买后 30 天内申请全额退款..."
- "客服流程.md" → "退款审核周期为 3-5 个工作日..."
3. 将这些文档和问题一起发给 LLM:
"根据以下参考资料回答用户的问题。
参考资料:[退款政策文档...]
问题:我们的退款政策是什么?"
4. LLM 基于文档生成回答:
"根据公司政策,用户可在购买后 30 天内申请全额退款,
审核周期为 3-5 个工作日。"
RAG vs 其他方案
| RAG | Fine-tuning | 长上下文 | |
|---|---|---|---|
| 知识更新 | 实时(更新知识库即可) | 需要重新训练 | 实时(放入上下文) |
| 实现难度 | 中等 | 高 | 低 |
| 成本 | 向量数据库 + 检索 | 训练成本 | 长上下文 token 费用高 |
| 知识量 | 可以很大(百万文档) | 有限(训练数据量) | 受上下文窗口限制 |
| 可溯源 | ✅ 可引用来源 | ❌ 无法溯源 | ✅ 可引用来源 |
| 适用场景 | 知识库问答、文档搜索 | 风格/格式定制 | 少量文档分析 |
什么时候用 RAG
- 知识库很大(超出上下文窗口)
- 知识需要频繁更新
- 需要引用来源(可溯源性)
- 需要基于私有数据回答问题
什么时候不用 RAG
- 问题不需要外部知识(纯推理、代码生成)
- 文档量很小,能直接放进上下文
- 需要模型改变行为方式而不是知识(用 Fine-tuning)
RAG 的核心组件
一个 RAG 系统由几个关键部分组成:
1. 文档处理(Ingestion)
把原始文档(PDF、网页、Markdown 等)处理成可检索的格式:
- 解析文档
- 切分成小块(Chunking)
- 转换为向量(Embedding)
- 存入向量数据库
2. 检索(Retrieval)
根据用户查询找到最相关的文档片段:
- 将查询转为向量
- 在向量数据库中搜索相似向量
- 可能还会用关键词搜索作为补充
- 对结果排序和筛选
3. 生成(Generation)
将检索到的信息和用户问题一起发给 LLM:
- 设计合适的 Prompt 模板
- 处理"找不到相关信息"的情况
- 让模型引用来源
后面的章节会逐一深入每个组件。
一个最小的 RAG 示例
用伪代码展示 RAG 的核心逻辑:
# 1. 准备阶段:处理文档
documents = load_documents("./knowledge_base/")
chunks = split_into_chunks(documents, chunk_size=500)
embeddings = embed(chunks) # 转为向量
vector_db.store(chunks, embeddings)
# 2. 查询阶段
query = "我们的退款政策是什么?"
query_embedding = embed(query)
relevant_chunks = vector_db.search(query_embedding, top_k=3)
# 3. 生成阶段
prompt = f"""根据以下参考资料回答问题。如果资料中没有相关信息,请说"我不确定"。
参考资料:
{format_chunks(relevant_chunks)}
问题:{query}"""
answer = llm.generate(prompt)
这就是 RAG 的全部核心逻辑。当然,每一步都有很多细节和优化空间——这就是后面几章要讲的内容。
要点总结
- RAG = 检索 + 生成。 先找到相关信息,再让 LLM 基于这些信息回答。解决了知识截止和幻觉问题。
- RAG 适合知识库大、需要更新、需要溯源的场景。 小文档量可以直接用长上下文。
- RAG 的三个核心组件:文档处理、检索、生成。 每个环节都影响最终效果。
- RAG 和 Fine-tuning 解决不同的问题。 RAG 补充知识,Fine-tuning 改变行为。两者可以结合使用。