什么是 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 其他方案

RAGFine-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 的全部核心逻辑。当然,每一步都有很多细节和优化空间——这就是后面几章要讲的内容。

要点总结

  1. RAG = 检索 + 生成。 先找到相关信息,再让 LLM 基于这些信息回答。解决了知识截止和幻觉问题。
  2. RAG 适合知识库大、需要更新、需要溯源的场景。 小文档量可以直接用长上下文。
  3. RAG 的三个核心组件:文档处理、检索、生成。 每个环节都影响最终效果。
  4. RAG 和 Fine-tuning 解决不同的问题。 RAG 补充知识,Fine-tuning 改变行为。两者可以结合使用。