读完Anthropic contexual retrieval 总结


一、这篇blog到底在说什么

Anthropic 发现了传统 RAG 的一个核心痛点: chunk 脱离原文后语义丢失

经典例子:原始 chunk 是 "The company's revenue grew by 3% over the previous quarter."——哪家公司?哪个季度?这些信息在分块时被切掉了,导致检索时向量相似度计算失效。

他们的解决方案极其简洁: 在 embedding 之前,用 LLM 给每个 chunk 加一段上下文前缀 。就是把整个文档和当前 chunk 一起喂给 Claude,让它生成一段 50-100 token 的上下文描述,拼在 chunk 前面再做 embedding。

二、Appendix II 的实验数据告诉我们什么

**PDF **里展示的是跨领域(代码库、小说、学术论文、ArXiv 论文)的评估示例。几个关键观察:

1. 评估数据集设计是精髓

每个示例都有 Query → Golden Answer → Golden Chunk → Context 四元组。这不是随便凑的——它在告诉你:如果你要做 RAG 评估,你必须有 “标准答案应该来自哪个 chunk” 的 ground truth。没有这个,你的评估指标就是瞎算。

2. 他们选的领域有代表性

代码库(精确匹配极重要)、小说(需要跨段落理解人物关系)、学术论文(充满专业术语和引用链)——这三种场景分别测试了 RAG 的不同弱点。你的作品①也应该用至少 2 种不同类型的文档做评估,别只用一种。

3. Context 字段就是 Contextual Retrieval 的核心产出

看 PDF 里每个例子的 Context 字段——它都是一段自然语言描述,解释这个 chunk 在整篇文档中的位置和角色。比如代码库的那个例子,Context 说的是 “这段代码是 BasicConfigurator 类的实现,属于 Log4cxx 日志库”。这段信息被拼在 chunk 前面后,embedding 向量就能捕捉到 “这是日志配置相关的代码” 这个语义,而不只是一堆函数签名。

三、量化结果(从主文章提取的核心数据)

方法Top-20 检索失败率相比 baseline 降低
传统 embedding(baseline)5.7%
+ Contextual Embeddings3.7%-35%
+ Contextual Embeddings + Contextual BM252.9%-49%
+ Contextual Embeddings + Contextual BM25 + Reranking1.9%-67%

这组数据对你极其重要——它就是你作品①评估报告的 benchmark 参照系。

四、我的 RAG 最佳实践思路(资深工程师视角)

基于 Contextual Retrieval + 2026 年的生产经验,以下是我推荐的完整 RAG 架构思路:

第一原则:先判断你是否真的需要 RAG

Anthropic 自己说得很清楚:如果知识库小于 200K token(约 500 页),直接把全文塞进 prompt + 用 prompt caching,比 RAG 更简单、更准确。2026 年 context window 已经很大了(Claude 200K,GPT-4o 128K),很多场景根本不需要 RAG。

面试时被问到 “什么时候用 RAG” 你的回答应该是 :小知识库用长 context + prompt caching,大知识库或频繁更新的数据用 RAG,需要改变模型行为模式用 fine-tuning,生产系统通常是混合使用。

第二原则:检索质量决定一切——Generation 再好也救不了垃圾检索

Anthropic 的数据证明了一件事: 检索层的每一个优化都有量化的回报 。你的架构应该把 80% 的精力放在检索优化上,而不是 prompt 调优上。

我推荐的检索 pipeline(按层叠加)

Layer 1: Contextual Chunking(必做)
  用 LLM 给每个 chunk 加上下文前缀
  → 单独就能降低 35% 检索失败率

Layer 2: Hybrid Search(必做)
  向量检索(语义匹配)+ BM25(精确关键词匹配)+ RRF 融合
  → 解决 "向量检索抓语义但漏关键词" 的问题

Layer 3: Reranking(强烈推荐)
  用 cross-encoder 或 Cohere Reranker 对 top-k 结果重排序
  → 把总检索失败率从 2.9% 压到 1.9%

Layer 4: Query Transformation(视场景)
  查询改写 / HyDE / Multi-query
  → 处理模糊查询或用户表达不清的情况

第三原则:Contextual Retrieval 的成本控制

你可能会想:给每个 chunk 都调一次 LLM 生成上下文,成本岂不是爆炸?Anthropic 的方案是 prompt caching :把整个文档缓存一次,后续每个 chunk 的 context 生成只花增量 token。根据他们的计算,假设 800 token 的 chunk、8K token 的文档, 每百万文档 token 只需 $1.02 。这在生产中是完全可接受的,因为这是一次性的索引时成本,不是运行时成本。

你的实现策略

# 伪代码:Contextual Retrieval 的核心逻辑
CONTEXT_PROMPT = """
<document>
{whole_document}
</document>
<chunk>
{chunk_content}
</chunk>
请用简短的上下文描述这个 chunk 在整个文档中的位置和角色。
只输出上下文描述,不要其他内容。
"""

# 1. 对每个文档,先用 prompt caching 缓存整个文档
# 2. 对该文档的每个 chunk,调用 LLM 生成 context(命中缓存)
# 3. contextualized_chunk = context + "\n\n" + original_chunk
# 4. 对 contextualized_chunk 做 embedding 和 BM25 索引

第四原则:评估必须有 ground truth

PDF 里的评估方式给你的启示:你必须手动或半自动地构建一个评估数据集,包含:

  • Query :用户可能问的问题
  • Golden Chunk :正确答案应该来自哪个 chunk
  • Golden Answer :期望的回答

没有这个,Ragas 和 DeepEval 的指标就是空中楼阁。至少要有 50-100 条这样的评估数据。

第五原则:分块策略不是一刀切

PDF 的实验涵盖了代码、小说、论文等不同类型。每种类型的最佳分块策略不同:

  • 代码 :按函数/类分块(保持逻辑完整性)
  • 结构化文档 :按章节/段落分块(尊重文档结构)
  • 非结构化长文本 :semantic chunking(基于语义相似度阈值切割)

第六原则:Top-K 的选择有讲究

Anthropic 的实验用了 top-5、top-10、top-20 三种设置。他们发现 top-20 配合 reranking 效果最好 。原因是:先用宽松的 top-K 把可能相关的 chunk 都捞上来,然后用 reranker 精选出真正最好的几个。

我的建议 :检索时取 top-20,reranking 后保留 top-5 送入 LLM。这样既保证了 recall,又控制了 context 长度和成本。