检索增强生成(RAG)总览
先说结论
检索增强生成(Retrieval-Augmented Generation, RAG)是指在 LLM 生成回答之前,先从外部知识库中检索相关文档片段,将其作为上下文注入提示词,从而提升回答的准确性、时效性和可追溯性。
QUESTION 面试高频:RAG 的核心价值是什么? RAG 的核心价值是用外部知识库弥补 LLM 的三大缺陷:知识时效性不足(训练数据有截止日期)、事实可靠性差(容易产生幻觉)、领域知识薄弱(通用训练难以覆盖垂直领域)。相比微调,RAG 的优势在于无需重新训练模型、知识可实时更新、来源可追溯。
RAG vs 微调 vs 预训练
| 维度 | 预训练 | 微调(SFT/RLHF) | RAG |
|---|---|---|---|
| 知识更新 | 需重新训练 | 需重新微调 | 实时更新知识库 |
| 成本 | 极高(百万级) | 中等(万级) | 低(千级) |
| 知识可追溯 | 否 | 否 | 是 |
| 幻觉风险 | 高 | 中 | 低 |
| 适用场景 | 基础能力构建 | 行为/风格定制 | 知识密集型问答 |
| 知识注入方式 | 模型参数 | 模型参数 | 上下文窗口 |
QUESTION 面试高频:RAG 和微调如何选择? 不是二选一,而是互补。微调改变模型的"行为模式"(如输出格式、推理风格),RAG 提供"事实知识"。最佳实践是:先 RAG 解决知识问题,再微调优化行为模式。二者结合(RAG + FT)效果优于单独使用。
RAG 管线核心组件
离线索引阶段:
文档 → 加载 → 分割(Chunk) → 嵌入(Embed) → 存入向量数据库
在线查询阶段:
用户查询 → 查询嵌入 → 向量检索(Top-K) → 重排序(Rerank)
↓
LLM ← 拼接上下文 + 查询 ← Top-N 结果
↓
生成回答
| 组件 | 功能 | 常见选择 |
|---|---|---|
| 文档加载器 | 从数据源提取原始内容 | PDF Parser, Web Scraper, DB Connector |
| 文本分割器 | 将文档拆分为适合检索的片段 | Recursive, Semantic, Fixed-size |
| 嵌入模型 | 将文本转换为向量表示 | OpenAI text-embedding-3, BGE, Cohere |
| 向量数据库 | 存储和检索向量 | Pinecone, Weaviate, Milvus, Qdrant, Chroma |
| 检索器 | 根据查询检索相关文档 | Dense, Sparse, Hybrid |
| 重排序器 | 对检索结果精排 | Cross-Encoder, Cohere Rerank, ColBERT |
| 生成器 | 基于检索上下文生成回答 | GPT-4o, Claude, Qwen 等 LLM |
RAG 演进阶段
| 阶段 | 名称 | 特点 | 关键技术 |
|---|---|---|---|
| Naive RAG | 基础 RAG | 简单的索引-检索-生成管线 | Dense Retrieval + LLM |
| Advanced RAG | 高级 RAG | 针对特定瓶颈优化检索和生成 | Hybrid Search, Reranking, Query Rewriting |
| Modular RAG | 模块化 RAG | 各组件可独立替换和组合 | 路由、自适应检索、多路召回 |
| Agentic RAG | 智能体 RAG | Agent 自主决定检索策略 | Self-RAG, CRAG, 多工具协同 |
QUESTION 面试高频:Naive RAG 的主要问题是什么? Naive RAG 存在三大问题:检索质量差(召回不全、排序不准)、生成质量差(上下文过长导致信息过载、幻觉)、全链路缺乏反馈(没有评估和纠错机制)。Advanced RAG 通过 Hybrid Search、Reranking、Query Rewriting 等手段逐步解决这些问题。
设计时真正要权衡什么
- Chunk 大小:小块(128-256 Token)检索精确但上下文不足;大块(512-1024 Token)上下文丰富但可能引入噪声。通常 512 Token + 50-200 Token 重叠是好的起点。
- 检索数量(Top-K):K 值大覆盖广但噪声多;K 值小精准但可能遗漏。经验值:先检索 Top-20,重排后取 Top-5。
- 嵌入模型选择:通用嵌入(OpenAI、Cohere)开箱即用但领域适配差;微调嵌入领域适配好但需要额外训练数据和维护成本。
- 向量库选择:托管服务(Pinecone)运维省心但成本高;自建(Milvus)灵活但运维复杂。
- 重排序开销:Cross-Encoder 重排效果最好但每对 (query, doc) 都要过一遍 Transformer,延迟和成本显著。需要权衡重排文档数量。
如果要对外讲,可以怎么概括
"RAG 的本质是用检索来弥补 LLM 知识的时效性和准确性不足。基础 RAG 的管线是'加载-分割-嵌入-检索-重排-生成',但决定 RAG 系统质量的不是某一环节的极致优化,而是全链路的协调设计。在 Chunk 策略上,Recursive Character Splitting 是最稳妥的起点,512 Token + 100 Token 重叠适用于大多数场景;在检索策略上,Hybrid Search(Dense + Sparse)应作为标配;而重排序是性价比最高的单点优化。高级技巧方面,我特别关注 GraphRAG 解决全局性问题、Contextual Retrieval 解决 Chunk 上下文丢失、以及 Self-RAG 让模型自主决定是否检索。在实际项目中,我的建议是先搭基线、量化评估、再针对性优化。"
最后记几条
- RAG 与微调互补而非替代:微调改行为,RAG 补知识,二者结合效果最佳。
- 重排序是 ROI 最高的优化:比换嵌入模型、调 Chunk 策略、换向量库的提升都明显。
- Hybrid Search 应该是默认选择:Dense + Sparse 的融合检索在绝大多数场景优于单一策略。
- RAG 演进路线:Naive → Advanced → Modular → Agentic,每一阶段解决上一阶段的核心瓶颈。
- 评估比优化更重要:没有量化评估的 RAG 优化是盲人摸象。先建立评估管线,再做任何优化。
参考资料
- Lewis, P. et al. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (NeurIPS 2020)
- Gao, Y. et al. "Retrieval-Augmented Generation for Large Language Models: A Survey" (2024)
- Asai, A. et al. "Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection" (ICLR 2024)
- Edge, D. et al. "From Local to Global: A Graph RAG Approach to Query-Focused Summarization" (微软)
- Anthropic Blog: "Contextual Retrieval" (2024)