Contextual Retrieval
上下文检索会在每个文本块前添加一段由 LLM 编写的说明,指出该文本块在文档中的位置,从而让嵌入和 BM25 找到正确段落。
上下文检索是一种用于检索增强生成(RAG)的索引技术:大型语言模型(LLM)会读取每份完整文档,并撰写一段简短说明(通常为 50 到 100 个令牌),以说明某个文本块在文档中的位置和作用。在嵌入该文本块并将其加入关键词索引之前,会先把说明附加到文本块前面,因此搜索可以匹配单靠该文本块无法表达的信息。Anthropic 于 2024 年 9 月推出了上下文检索。
它要解决的问题#
RAG 流水线会将文档拆分为文本块,使其既能精准嵌入,又能让多个文本块放入模型的上下文窗口中;但从文档中截取的文本块往往会丢失使其可被检索到的信息。Anthropic 举例说明,一份财务文件中的文本块写道:“该公司的收入较上一季度增长了 3%。”它既没有指出公司名称,也没有说明具体季度,因此,无论是嵌入还是关键词搜索,都无法将其与询问 ACME 公司 2023 年第二季度收入的问题匹配。上下文检索会将其保存为:“该文本块摘自一份关于 ACME 公司 2023 年第二季度表现的 SEC 文件;上一季度收入为 3.14 亿美元。该公司的收入较上一季度增长了 3%。”
目标裁剪会像文本块一样丢失上下文。Ultralytics 的目标裁剪解决方案会在图像或视频上运行 YOLO26,并将每个检测结果分别保存为文件,例如 crop_1.jpg、crop_2.jpg 等。因此,裁剪图像中虽然有卡车,却没有说明它来自哪个摄像头、地点或场景。为每个裁剪图像添加简短前缀,描述其来源帧,例如摄像头名称、时间,以及周围检测到的其他目标,就能恢复上下文,便于进行关键词和语义搜索。
上下文检索的工作方式#
对于每个文本块,LLM 都会接收完整文档和该文本块,并被要求“给出简短精炼的上下文说明,帮助确定该文本块在整个文档中的位置,以提高该文本块的搜索检索效果”。Anthropic 使用了带有提示缓存的 Claude 3 Haiku:每份文档只需处理一次,便可供其中所有文本块重复使用;一次性成本为每百万个文档令牌 1.02 美元。经过上下文化处理的文本块会进入嵌入索引(“上下文嵌入”)和 BM25关键词索引(“上下文 BM25”)。查询时,系统会搜索两个索引并合并结果,如同混合搜索,然后由重排序器为排名前 150 的候选结果评分,并将最佳的 20 个文本块放入提示中。
分别对带有和不带上下文的示例文本块进行嵌入,可以看出这对向量搜索的影响:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Anthropic's example chunk and the context an LLM wrote for it from the full filing
chunk = "The company's revenue grew by 3% over the previous quarter."
context = "This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million."
other = "Globex Corporation reported that Q2 2023 revenue fell 2% on weaker demand."
query = "How did ACME's revenue change in Q2 2023?"
candidates = {"plain chunk": chunk, "contextual chunk": f"{context} {chunk}", "Globex chunk": other}
# Cosine similarity of the query to each indexed text
scores = model.similarity(model.encode(query), model.encode(list(candidates.values())))[0]
for name, score in zip(candidates, scores):
print(f"{name}: {score:.2f}")不带上下文的文本块与问题的匹配分数为 0.49,与一段有关其他公司的文本块分数相同。添加上下文后,该文本块的分数升至 0.83,并以明显优势排名第一。
上下文检索与相关技术的比较#
- 延迟分块:通过嵌入模型的注意力机制,让每个分块的嵌入包含文档上下文,无需为每个分块单独调用 LLM。存储的分块文本保持不变,因此关键词搜索没有任何收益。
- 语义分块:决定分块从哪里开始、在哪里结束。它可以与上下文检索结合使用,由上下文检索补充每个分块未明说的内容。
- 标题和章节标题前缀:一种成本更低、历史更久的做法,即在每个分块前添加相同的文档标题或章节标题。上下文检索会为每个分块撰写不同的注释。
- 上下文工程:一种更广泛的实践,旨在决定推理时哪些内容进入模型的上下文窗口。上下文检索在更早的环节发挥作用,决定哪些内容会被编入索引。
实测效果#
Anthropic 将检索失败率定义为 1 减去 recall@20,即相关分块未出现在前 20 条结果中的查询所占比例。基准流水线在 5.7% 的查询中失败。上下文嵌入将失败率降至 3.7%,降低了 35%;再加入上下文 BM25 后,失败率降至 2.9%,降低了 49%。对合并后的结果进行重排序后,失败率降至 1.9%,比基准降低了 67%。










