🏠 总目录 📚 资料库检索与 RAG

Introducing Contextual Retrieval(上下文检索)

📄 来自 Claude 官方博客
原文标题
Introducing Contextual Retrieval(上下文检索)
原文链接
https://www.anthropic.com/engineering/contextual-retrieval
作者
Daniel Ford 等(Anthropic)
发布日期
2024-09-19
⚠️ 本页是原文的中文结构化整理笔记(保留架构、数据、案例、结论),并非逐字翻译。具体参数与功能名更新很快,落地前请点击上方链接核对原文。

10 分钟 | 🔍 给每个分块补上它丢失的语境

🎯 一句话

传统 RAG 把文档切块后,每个块都失去了它原本所处的语境——「该公司营收增长 3%」里的「该公司」指谁,块里根本没有。⭐ 上下文检索的做法:给每个块前面加一段简短的定位说明再做索引

📑 本页目录

传统 RAG 系统在编码信息时会丢失上下文,导致检索失败。在切块(chunk)被嵌入和索引之前先给每个块加上解释性上下文,可以大幅提升检索准确率。

什么是上下文检索

这是一种预处理技术:不再直接编码孤立的文本块,而是先给每个块补充「针对该块的解释性上下文」。它解决的根本问题是——孤立的文本块常常缺乏足够的周边信息,既无法被正确理解,也无法被正确检索到

例:一个原始块写着「营收增长了 3%」,加上上下文后会变成明确说明是哪家公司、哪个时间段、相对什么基线的完整表述。

两个核心组件

1. 上下文嵌入(Contextual Embeddings)

用 Claude 为每个块生成简短的上下文说明(通常 50-100 token),拼接在块前面,然后再转成语义向量。

2. 上下文 BM25(Contextual BM25)

同样的上下文信息也加到词法索引之前。BM25 用精确词项匹配,能抓住语义嵌入可能错过的精确标识符(如错误码、技术规格)。两种方式通过排序融合(rank fusion)结合,实现全面检索。

基准数据

以「1 减去 recall@20」衡量(即相关文档未出现在前 20 个检索结果中的比例):

方案 失败率 相对降幅
基线 5.7%
上下文嵌入 3.7% ↓35%
上下文嵌入 + 上下文 BM25 2.9% ↓49%
再加重排序(Reranking) 1.9% ↓67%

成本: 使用 prompt caching 时,生成上下文化块的预处理成本约为每百万文档 token $1.02——规模化下经济可行。

什么时候才需要它

实用阈值: 知识库小于 20 万 token(约 500 页)时,直接用 prompt caching 把整个库放进提示词即可。超过这个规模,才需要上下文检索。

实施要点

  1. 切块策略: 根据具体用例优化块大小、边界和重叠
  2. 嵌入模型: 测试中 Gemini 和 Voyage 的嵌入表现更好
  3. 自定义提示词: 官方提供了通用的上下文化提示词,但针对领域定制效果更佳
  4. 检索数量: 取 20 个块的效果优于 5 个或 10 个
  5. 重排序: 加一步重排序(测试用 Cohere reranker)能进一步提升准确率,但有延迟代价
  6. 务必用上下文化后的块跑评估,确认下游性能确实改善

结论

多种技术相互叠加、效果可累积: - 嵌入 + BM25 优于单用嵌入 - 专门的嵌入服务商(Voyage、Gemini)持续优于其他选项 - 传更多块(20 > 10 > 5)能提升表现 - 加上下文信息大幅提升检索准确率 - 重排序进一步优化结果

「这些收益全部可以叠加」——策略性组合使用即可。


✅ 检查点

  1. 传统分块检索丢失了什么?举个例子。
  2. 上下文检索具体怎么做?
  3. 它的成本在哪?为什么还是划算的?
👀 答案
  1. 丢失了块所处的语境。例:一份财报被切块后,某块内容是「该公司当季营收增长 3%」——「该公司」是谁、「当季」是哪一季,块里都没有,检索时就匹配不上「A 公司 2024 年三季度营收」这样的查询。
  2. 在索引之前,给每个块前面加一段简短的定位说明(如「本段出自 A 公司 2024 年三季度财报的营收章节」),然后对「说明+原文」整体做嵌入和索引。⭐ 关键是这段说明由模型根据整篇文档生成,所以它知道块在全文里的位置。
  3. 成本在于索引阶段要为每个块额外调用一次模型生成说明。划算是因为:这是一次性的离线成本,而检索质量的提升是长期的;而且配合提示缓存,整篇文档只需载入一次,后续每个块的说明生成都能复用缓存,实际开销远低于朴素估算。

🛑 可以停在这里

走神救援
传统 RAG 分块后每个块都失去了原本的语境——「该公司当季营收增长 3%」里「该公司」是谁、「当季」是哪季,块里根本没有,于是匹配不上「A 公司 2024 年三季度营收」这样的查询。⭐做法:索引前给每个块前面加一段简短定位说明(「本段出自 A 公司 2024 三季度财报的营收章节」),对「说明+原文」整体做嵌入;关键是这段说明由模型根据整篇文档生成,所以它知道块在全文里的位置。成本是索引阶段每块多调一次模型,划算因为这是一次性离线成本而检索质量提升是长期的,且配合提示缓存整篇文档只载入一次,实际开销远低于朴素估算。