Introducing Contextual Retrieval(上下文检索)
- 原文标题
- Introducing Contextual Retrieval(上下文检索)
- 原文链接
- https://www.anthropic.com/engineering/contextual-retrieval
- 作者
- Daniel Ford 等(Anthropic)
- 发布日期
- 2024-09-19
🎯 一句话
传统 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 把整个库放进提示词即可。超过这个规模,才需要上下文检索。
实施要点
- 切块策略: 根据具体用例优化块大小、边界和重叠
- 嵌入模型: 测试中 Gemini 和 Voyage 的嵌入表现更好
- 自定义提示词: 官方提供了通用的上下文化提示词,但针对领域定制效果更佳
- 检索数量: 取 20 个块的效果优于 5 个或 10 个
- 重排序: 加一步重排序(测试用 Cohere reranker)能进一步提升准确率,但有延迟代价
- 务必用上下文化后的块跑评估,确认下游性能确实改善
结论
多种技术相互叠加、效果可累积: - 嵌入 + BM25 优于单用嵌入 - 专门的嵌入服务商(Voyage、Gemini)持续优于其他选项 - 传更多块(20 > 10 > 5)能提升表现 - 加上下文信息大幅提升检索准确率 - 重排序进一步优化结果
「这些收益全部可以叠加」——策略性组合使用即可。
✅ 检查点
- 传统分块检索丢失了什么?举个例子。
- 上下文检索具体怎么做?
- 它的成本在哪?为什么还是划算的?
👀 答案
- 丢失了块所处的语境。例:一份财报被切块后,某块内容是「该公司当季营收增长 3%」——「该公司」是谁、「当季」是哪一季,块里都没有,检索时就匹配不上「A 公司 2024 年三季度营收」这样的查询。
- 在索引之前,给每个块前面加一段简短的定位说明(如「本段出自 A 公司 2024 年三季度财报的营收章节」),然后对「说明+原文」整体做嵌入和索引。⭐ 关键是这段说明由模型根据整篇文档生成,所以它知道块在全文里的位置。
- 成本在于索引阶段要为每个块额外调用一次模型生成说明。划算是因为:这是一次性的离线成本,而检索质量的提升是长期的;而且配合提示缓存,整篇文档只需载入一次,后续每个块的说明生成都能复用缓存,实际开销远低于朴素估算。
🛑 可以停在这里
⚡ 走神救援
⭐传统 RAG 分块后每个块都失去了原本的语境——「该公司当季营收增长 3%」里「该公司」是谁、「当季」是哪季,块里根本没有,于是匹配不上「A 公司 2024 年三季度营收」这样的查询。⭐做法:索引前给每个块前面加一段简短定位说明(「本段出自 A 公司 2024 三季度财报的营收章节」),对「说明+原文」整体做嵌入;关键是这段说明由模型根据整篇文档生成,所以它知道块在全文里的位置。成本是索引阶段每块多调一次模型,划算因为这是一次性离线成本而检索质量提升是长期的,且配合提示缓存整篇文档只载入一次,实际开销远低于朴素估算。