跳转到内容

Contextual Retrieval

Contextual Retrieval 指一种改造 RAG 检索前处理的方法:在对 chunk 建 embedding 索引和 BM25 索引之前,先给每个 chunk 自动生成一小段解释其文档语境的上下文,再把这段上下文 prepend 到 chunk 上。它的目标是减少 chunk 被切碎后丢失实体、时间、场景和文档位置等关键信号的问题。

  • 传统 RAG 的主要脆弱点之一,是 chunk 在被独立索引后失去了原文上下文,导致“语义上相关但定位不准”或“字面匹配不到真正答案”的失败召回。
  • Contextual Retrieval 的核心不是改变用户 query,而是改变被索引的 chunk 表示。
  • Anthropic 在这篇文章里把它拆成两部分:Contextual EmbeddingsContextual BM25
  • 前者是把补了上下文的 chunk 再送去做 embedding;后者是用同样补了上下文的 chunk 去建立 BM25 索引。
  • 这样做的好处是,semantic retrieval 和 lexical retrieval 都能看到更多原本在 chunking 时丢失的文档信号。
  • 它和“给整篇文档加通用摘要”不同,因为它强调的是 chunk-specific context,而不是一个所有 chunk 共用的 document summary。
  • 在实现上,它通常需要模型同时读取 whole documentcurrent chunk,生成一段简短、只为改善检索服务的 contextual text。
  • 它天然适合与 Embeddings + BM25 + reranking 叠加使用,因为这几层分别在补不同类型的召回误差。
  • 从更大视角看,它也可以被看成 Context engineering 在 retrieval 阶段的一种特化版本:不是管理主对话上下文,而是在离线索引阶段把未来可能需要的语境提前编码进 chunk。
  • 它也和 Agent scaffold 相连,因为很多 agent 系统是否“检索得准”,并不只取决于模型能力,还取决于预处理、索引和 reranking 这层 retrieval scaffolding。

ℹ️ Conflict:

  • contextual retrieval 提高的是召回概率,不是对所有任务都保证端到端回答更好;如果召回后排序、截断或生成阶段处理得差,整体收益仍可能被吃掉。
  • 它会增加离线预处理复杂度、索引体积和更新成本,因此在频繁变化的知识库里需要权衡。
  • 对小知识库来说,直接整库进 prompt 可能比构建复杂 RAG pipeline 更简单,因此 contextual retrieval 并不是普适默认值。
  • Anthropic, “Introducing Contextual Retrieval”, 2024-09-19.
  • 原文摘录:[llm-wiki/raw/anthropic/Introducing Contextual Retrieval](/raw/anthropic/Introducing Contextual Retrieval.md)