Contextual Retrieval:更好的 RAG
在检索前先给 Chunk 加上下文,Anthropic 的 RAG 升级方案
本页解决的问题
先给结论「Contextual Retrieval:更好的 RAG」要解决的关键问题是什么?
在检索前先给 Chunk 加上下文,Anthropic 的 RAG 升级方案
让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。
写下一个问题:试完这个方法后,你能用什么证据回答它?
结论听起来很完整,却没有检查最关键的假设。
传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷:
Chunk 脱离上下文后变得模糊不清
在 Embedding 前,用 LLM 给每个 Chunk 加上上下文前缀
检索失败率降低幅度
没有免费的午餐
「传统 RAG 的核心问题」为什么能找到相关内容
「传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷」把检索问题从“把资料存起来”推进到“怎样找到真正相关的资料”。这一步决定了 RAG、推荐和以图搜图最后交给模型的输入质量。
相似度不是答案,召回之后还要核对
在「传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷」对应的流程里,Embedding 负责把对象放到可比较的语义空间,近邻索引负责减少搜索范围,最终的回答仍然依赖召回片段是否覆盖问题、距离指标是否合适,以及内容有没有过期。
先区分找得到和找得准
把「传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷」落成一次小测试:准备几条有明确答案的查询,记录召回的相关性、遗漏和无关结果,再决定是否需要换切分方式、索引或重排。
从「传统 RAG 的核心问题」走到「Contextual Retrieval 的核心思路」
「传统 RAG 的核心问题」先把问题落在「传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷」上;到了「Contextual Retrieval 的核心思路」,讨论继续推进到「在 Embedding 前,用 LLM 给每个 Chunk 加上上下文前缀 思路非常直观:在对 Chunk 做向量化之前,先用 LLM 阅读整篇文档,然后为每个 Chunk 生成一段简短的上下文描述作为前缀。这样每个 Chunk 在被检索时都自带了必要的语境信息。 BEFORE -- 裸 Chunk "The company's Q2 revenue increased by 3% over the previous…」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。
把这条判断带到下一个场景
检索系统也可以这样看:先确定什么算相关,再观察召回是否覆盖问题,最后检查排序、切分和时效性有没有把真正有用的内容挤出去。
- 「传统 RAG 的核心问题」:传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷
- 「Contextual Retrieval 的核心思路」:在 Embedding 前,用 LLM 给每个 Chunk 加上上下文前缀 思路非常直观:在对 Chunk 做向量化之前,先用 LLM 阅读整篇文档,然后为每个 Chunk 生成一段简短的上下文描述作为前缀。这样每个 Chunk 在被检索时都自带了必要的语境信息。 BEFORE -- 裸 Chunk "The company's Q2 revenue increased by 3% over the previous…
- 「成本权衡」:没有免费的午餐 预处理成本增加: 每个 Chunk 都需要一次额外的 LLM 调用来生成上下文前缀。对于大规模文档库,这个预处理成本不可忽视。 Prompt Caching 可以降低成本: 同一篇文档的不同 Chunk 共享相同的文档级上下文。利用 Prompt Caching,可以避免重复发送整篇文档内容。 适合高准确率场景: 如果你的 RAG 系统对准确率要求极高(如法律文档检索、医疗知识问答、金融合规查询),额…
最后的「成本权衡」把讨论落到「没有免费的午餐 预处理成本增加: 每个 Chunk 都需要一次额外的 LLM 调用来生成上下文前缀。对于大规模文档库,这个预处理成本不可忽视。 Prompt Caching 可以降低成本: 同一篇文档的不同 Chunk 共享相同的文档级上下文。利用 Prompt Caching,可以避免重复发送整篇文档内容。 适合高准确率场景: 如果你的 RAG 系统对准确率要求极高(如法律文档检索、医疗知识问答、金融合规查询),额…」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。
我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。
读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。
如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。
还没有这篇文章的讨论。