读完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 Embeddings | 3.7% | -35% |
| + Contextual Embeddings + Contextual BM25 | 2.9% | -49% |
| + Contextual Embeddings + Contextual BM25 + Reranking | 1.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 长度和成本。