Contextual Retrieval#
Overview#
Contextual Retrieval 是一个进阶版的 RAG 技术, 能减少 AI 的幻觉, 增加获取到的 Context 的概率. 本文是一个非常精简的介绍, 详细的介绍请参考 Anthropic 的这篇文章 Introducing Contextual Retrieval.
How Does RAG Work#
要理解为传统的 Rag 是怎么工作的呢:
把文档拆分成 Chunk, 比如几百个 Token 一个 Chunk, 或者一个段落为一个 Chunk. 每个 Chunk 之间有一点 overlap.
对每个 Chunk 进行 Full Text Index, 使用 BM25 或者类似算法给每个 Term 不同的权重. 这个也是搜索引擎的底层算法, 主要基于词.
对每个 Chunk 进行 Text Embedding, 将其转化为向量, 以适配按照文本语义相关性进行搜索, 主要基于语义.
当一个 Query 进来后, 进行 Text Index 匹配和 Text Embedding 匹配, 甚至还可以进行 PageRank 等其他的匹配算法. 然后把每一项匹配的 Top K 结果拿过来一起比较, 选出最好的结果. 这个把多个匹配算法的结果融合比较的过程叫做 Reranking.
然后把最好的结果作为 Context 和原本的 Query 一起交给大模型进行分析并返回结果.
扩展阅读:
Rank Fusion = 用多个考试(数学、英语、编程)来评估学生,然后融合成绩决定谁更优秀。
Reranking = 在最初选出的 100 名学生中,进行更细粒度的评估(面试+实战测试),最终选出前 10 名。
Why RAG Sometime Doesn’t Work Well#
这个的解释直接看 Introducing Contextual Retrieval 文章中的 “The context conundrum in traditional RAG” 这一段就可以了. 简单来说就是分 Chunk 的时候这个 Chunk 本身就是一个孤立的信息而没有上下文, 导致最终的搜索结果会不好.
What is Contextual Retrieval#
这个技术的本质就是, 针对每一个 Chunk, 让 AI 结合全文生成一些 Context 并把这一小段 Chunk 放进去, 这样每个 Chunk 的核心信息都自带 Chunk. 这样做的代价就是每一个 Chunk 都要用 AI 生成一些 Context, 需要更多的计算资源 (Prompt Cache 可以大幅降低这个的成本), 并且每个 Chunk 的大小更大了, 你的 Vector Store 要存的东西也更多了. 但是这样做的好处就是你的 RAG 结果的相关度会好很多.
Choose The Right Model#
由于使用 Contextual Retrieval 会多出一步根据原文和 Chunk 生成总结和介绍性的 Context, 这就会带来额外的 Inference 开销. 并且由于这个任务的本质是文本分析和总结, 并不涉及到复杂的逻辑推理, 所以在选择模型的时候, 尽量选择不用那么强大的, 速度快, 价格低的模型. 为了方便比较, 我们就拿 Claude 3.5 Haiku 作为 Baseline 进行对比.
根据 Amazon Bedrock Pricing 上的数据, 我们比较几款模型. 并且以 200 篇平均长度在 1500 个词, 每个 chunk 为 400 个 token 作为基准进行了测试 (Google Sheet. 结果如下:
Key |
Value |
1 token = ? word |
0.75 |
document length (words) |
1,500 |
chunk tokens |
400 |
context tokens |
50 |
total number of document |
200 |
contextrual retrieval prompt tokens |
50 |
total number of document |
200 |
document tokens |
2,000 |
chunk per document |
5 |
input tokens per document |
12,250 |
output tokens per document |
250 |
total input tokens |
2,450,000 |
total output tokens |
50,000 |
model |
price per 1K input tokens |
price per 1K output tokens |
total input cost |
total output cost |
total cost |
Amazon Nova Micro |
0.000035 |
0.00014 |
0.08575 |
0.007 |
0.09275 |
Amazon Nova Lite |
0.00006 |
0.00024 |
0.147 |
0.012 |
0.159 |
Claude 3 Haiku |
0.00025 |
0.00125 |
0.6125 |
0.0625 |
0.675 |
Claude 3.5 Haiku |
0.0008 |
0.015 |
1.96 |
0.75 |
2.71 |
Jamba 1.5 Mini |
0.0002 |
0.0004 |
0.49 |
0.02 |
0.51 |
Llama 3.2 Instruct (1B) |
0.0001 |
0.0001 |
0.245 |
0.005 |
0.25 |
Mistral 7B |
0.00015 |
0.0002 |
0.3675 |
0.01 |
0.3775 |
这个计算没有使用 Batch Inference (价格减半), 也没有使用 Prompt Cache (2025 年 3 月这个还没有实装, 使用后成本能再降低 60% - 80%), 所以实际成本会更低.
这样看来使用这个技术的成本并不高, 但是能大幅提高准确率, 还是很划算的.
Use Prompt Cache for Contextual Retrieval#
既然我们知道如果 Prompt Cache 能够大幅降低成本, 那我们就来计算一下在不同的情况下到底能降低多少成本. 具体计算在这个 Google Sheet 中. 结果如下:
Document Size (Tokens) |
N Chunk |
No Cache |
With Cache |
Cost Saving |
Key |
Value |
800 |
2 |
6 |
4.5 |
25% |
Chunk Size (Tokens) |
400 |
2000 |
5 |
30 |
15 |
50% |
Prompt Cache Read Cost Multiplier |
0.25 |
4000 |
10 |
110 |
42.5 |
61% |
||
10000 |
25 |
650 |
200 |
69% |
||
20000 |
50 |
2550 |
712.5 |
72% |
||
40000 |
100 |
10100 |
2675 |
74% |
||
100000 |
250 |
62750 |
16062.5 |
74% |
经计算, 在 Contextual Retrieval 这个任务上, Prompt Cache 能节约 50-75% 的成本. 这个成本节约是非常可观的.
Reference#
Anthropic News - Introducing Contextual Retrieval: https://www.anthropic.com/news/contextual-retrieval
contextual-retrieval Python library: https://pypi.org/project/contextual-retrieval/
Anthropic 提供的用 Lambda 实现 Contextual Retrieval 的例子: https://github.com/anthropics/anthropic-cookbook/tree/main/skills/contextual-embeddings