如果你把 RAG 理解成“把文档切块,存进向量库,查询时捞几段塞给大模型”,那只能做出一个能跑的 Demo。
真正可用的 RAG,不是一个向量库,而是一条证据链:
问题从哪里来,证据从哪里找,为什么选中这些证据,证据之间有没有冲突,最终答案的每一句话能不能回到来源。
很多 RAG 项目第一版都长得差不多:PDF/Word/网页入库,切 Chunk,算 Embedding,存向量库,用户提问时取 Top-K,再拼进 Prompt。这个流程没错,但它只覆盖了“能检索”,没有覆盖“证据可信”。
坏 RAG 的问题通常不是模型不会回答,而是证据链在中间断了:
- 文档解析把表格拆坏了,答案需要的字段根本没进库;
- Chunk 切得太碎,“它增长了 3%”这种句子失去了公司、年份、季度;
- 纯向量检索召回了语义像、但事实不对的片段;
- Top-K 太大,把噪声也塞进上下文;
- Prompt 没有要求“资料不足时拒答”,模型开始补脑;
- 没有评测集,系统上线后只能靠用户投诉发现问题。
一、RAG 的本质:参数记忆 + 非参数记忆
RAG 这个方向最早在 2020 年的论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中系统提出。它的核心思想是:大模型自身的参数是一种“参数记忆”,外部可检索知识库是一种“非参数记忆”。
翻译成开发者语言就是:
- 模型参数负责语言理解、推理和组织表达;
- 外部检索系统负责提供最新、私有、可追溯的事实;
- 生成结果必须受到检索证据约束。
SFT 更像是改变模型的行为习惯和任务能力;RAG 更像是在回答前打开资料库。企业内部知识、产品文档、制度手册、代码仓库、客服 FAQ,这些东西变化快、长尾多、需要引用来源,不适合全部塞进模型参数里。
一句话概括:
SFT 解决“模型会不会这样做”,RAG 解决“模型有没有可靠资料可查”。
二、一条完整的 RAG 证据链
我更建议把 RAG 拆成两条链路看:离线索引链路和在线回答链路。
离线链路负责“证据入库”:数据接入、文档解析、数据清洗、Chunk 切分、元数据绑定、向量化与关键词索引、入库。
在线链路负责“证据使用”:Query 理解、初筛召回、融合排序、Rerank、Context Packing、Grounded Generation、Citation、Evaluation。
这条链路里,向量数据库只是第 6 步附近的一个组件。把它等同于 RAG,就像把数据库等同于整个后端系统。
三、Chunk 不是切饼,而是在保留语义现场
RAG 最容易被低估的地方是 Chunk。
太小的问题是语义断裂:“同比增长 18%。”这句话如果离开公司名、指标名、年份、地区,几乎没有任何证据价值。
太大的问题是噪声过多:一个 2000 token 的 Chunk 里只有 80 token 与问题相关,其余内容都会挤占上下文窗口,还可能干扰模型判断。
比较稳的工程策略是:
- FAQ:一个问答对就是一个 Chunk;
- 技术文档:按标题层级、段落和代码块切;
- 长报告:用父子文档策略,小块用于检索,大块用于生成;
- PDF 表格:优先保留行列关系,不要只抽纯文本;
- 代码 RAG:按函数、类、模块和调用关系切,不能按字符硬切;
- 权限场景:每个 Chunk 必须绑定租户、用户组、文档级权限。
Anthropic 在 Contextual Retrieval 里指出,传统 RAG 把文档切成小块时会丢掉上下文。他们的做法是在每个 Chunk 前加一段简短的上下文说明,再做 Embedding 和 BM25 索引。这个思路很有启发:Chunk 不只是文本片段,它应该知道自己来自哪份文档、哪一节、讨论哪个对象。
四、为什么生产里很少只用纯向量检索?
向量检索擅长“语义相似”,但它不总是擅长“精确命中”。
比如用户问:TS-999 报错怎么处理?
纯向量检索可能召回很多“报错处理”“故障排查”“错误码说明”的内容,但错过唯一包含 TS-999 的文档。
生产 RAG 通常会走 Hybrid Search:
- Dense Retrieval:向量检索,负责语义相似;
- Sparse Retrieval:BM25/关键词检索,负责精确词、编号、术语;
- Metadata Filter:先按租户、权限、产品、时间过滤;
- RRF 或融合排序:合并多路结果;
- Rerank:把“看起来相关”的结果变成“真的适合回答”的证据。
Elastic 官方文档建议用 RRF 做混合检索排序;Azure AI Search 文档也详细解释了 RRF 如何把多路排序结果融合成一个统一排序。这背后的工程判断很朴素:不要相信单一路径能覆盖所有问题。
五、Rerank 是把“召回结果”变成“可用证据”的关键层
Embedding 检索通常是 Bi-Encoder:Query 编一次,文档编一次,然后算相似度。它快,适合大规模召回,但判断不够细。
Rerank 通常更像 Cross-Encoder:把 Query 和候选 Chunk 放在一起判断相关性。它慢一些,但更准。
常见组合是:
向量/BM25 初筛 Top 50
↓
Rerank 精排 Top 5-10
↓
拼入上下文窗口
↓
模型基于证据回答
这里有个取舍:召回越大,覆盖率越高,但延迟和成本上升;Top-K 越大,资料越多,但噪声也越多。不要拍脑袋调参数,应该拿评测集跑。
六、RAG 的 Prompt 不是“请根据资料回答”这么简单
生产里的 RAG Prompt 至少要管住四件事:
- 证据边界:只能使用检索资料,不要把常识和猜测混进去;
- 冲突处理:当资料冲突时,按时间、版本、权威来源排序;
- 引用格式:每个关键结论都要能回到文档、章节或链接;
- 拒答策略:资料不足时明确说明缺少什么,而不是编一个答案。
还要注意一个安全问题:检索出来的文档和系统 Prompt 共享同一个上下文窗口。如果文档里出现“忽略之前指令”这类内容,模型可能被间接 Prompt Injection 影响。LangChain 的 RAG 文档专门提醒了这个问题,建议把检索内容明确标记为数据,而不是指令。
七、RAG 怎么评估?不要只看答案“像不像”
RAG 如果没有评测,很容易陷入玄学调参。
| 维度 | 看什么 | 常用指标 |
|---|---|---|
| 检索召回 | 正确证据有没有被找回来 | Recall@K、MRR、nDCG |
| 检索精度 | 找回来的内容是不是噪声太多 | Context Precision |
| 生成忠实度 | 回答是否被证据支持 | Faithfulness / Groundedness |
| 答案相关性 | 是否真正回答了问题 | Answer Relevance |
| 工程指标 | 是否可上线 | 延迟、成本、失败率、缓存命中率 |
LangSmith 的 RAG 评估教程把检索质量、回答质量、Groundedness 分开评估;Google Cloud 的 RAG 文章也强调,不做透明评估会导致“静默失败”:系统看起来能回答,但错误长期没人发现。
八、从开源项目和大厂实践里看 RAG 的演进
看开源项目和大厂博客,会发现一个趋势:RAG 正在从“向量检索 Demo”变成“上下文基础设施”。
LangChain 把 RAG 放进 Agent/Chain 编排里,强调索引和检索生成是两段流程,同时提醒间接 Prompt Injection 风险。
LlamaIndex 更像数据框架,围绕 Document、Node、Index、Query Engine 建抽象。
Haystack 强调 Pipeline:Document Store、Retriever、Ranker、Generator 都是可替换组件。
RAGFlow 把重点放在 deep document understanding,强调复杂格式文档、可解释 Chunk、引用溯源。
Microsoft GraphRAG 用图结构承载实体关系,适合全局总结、多跳关系、复杂数据发现。
Uber 的 Enhanced Agentic RAG 很值得看。他们的内部 on-call Copilot 从传统 RAG 演进到 Agentic RAG,引入 LLM-powered agents 做前置和后置步骤,公开文章里提到可接受答案比例相对提升 27%,错误建议相对降低 60%。
九、一个最小可落地的 RAG 方案
如果今天从零做一个内部知识库问答,我不会一开始就上 GraphRAG、多 Agent、复杂工作流。
我会先做一个足够扎实的最小闭环:
- 选一个明确场景,比如“内部制度问答”或“产品 FAQ”;
- 整理 50-100 个真实问题,人工标注期望答案和来源文档;
- 文档解析先保守,确保标题、段落、表格和页码不丢;
- Chunk 使用递归切分 + 元数据,FAQ 用 Q-A 对作为 Chunk;
- 检索使用 Hybrid Search:向量 + BM25 + metadata filter;
- 初筛 Top 30-50,再 Rerank 到 Top 5-10;
- Prompt 强制引用来源,资料不足必须拒答;
- 做一个评测脚本,持续看 Recall@K、Groundedness、答案相关性;
- 记录 bad case:没召回、召回错、证据冲突、模型编造;
- 每次只改一个变量:Chunk、Embedding、Top-K、Rerank、Prompt。
十、最后总结
RAG 不是向量数据库。
向量数据库只是证据仓库的一种实现,RAG 真正要解决的是:
- 如何把外部知识变成可检索的证据;
- 如何从海量证据里找出正确片段;
- 如何让模型只基于证据回答;
- 如何在资料不足或冲突时不胡说;
- 如何用评测持续证明系统真的变好了。
如果说 Tool Use 是在给 Agent 设计权限边界,Context Engineering 是在管理注意力预算,那么 RAG 就是在给大模型建立证据链。
没有证据链的 RAG,只是把资料塞给模型。
有证据链的 RAG,才是可以上线、可以追责、可以持续优化的知识系统。
参考资料
- Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, NeurIPS 2020:proceedings.neurips.cc/paper/2020/…
- OpenAI Retrieval Guide:developers.openai.com/api/docs/gu…
- OpenAI File Search Guide:developers.openai.com/api/docs/gu…
- Anthropic Contextual Retrieval:www.anthropic.com/engineering…
- Elastic Hybrid Search:www.elastic.co/docs/soluti…
- Azure AI Search RRF:learn.microsoft.com/en-us/azure…
- Microsoft GraphRAG:github.com/microsoft/g…
- RAGFlow:github.com/infiniflow/…
- LangChain RAG Docs:docs.langchain.com/oss/python/…
- LlamaIndex RAG Docs:developers.llamaindex.ai/python/fram…
- Haystack:github.com/deepset-ai/…
- LangSmith RAG Evaluation:docs.langchain.com/langsmith/e…
- Google Cloud RAG Evaluation Blog:cloud.google.com/blog/produc…
- Uber Enhanced Agentic RAG:www.uber.com/ro/en/blog/…