Skip to content

长上下文与 CAG:全文问答与 KV 缓存复用 ​

长上下文问答可以把任务所需的完整资料直接放入模型上下文,由模型阅读并回答。对于能放入上下文的有限知识集,这条路径可以省去逐次检索;如果许多问题使用同一份资料,还可以复用模型处理这份资料时产生的计算结果。

CAG(Cache-Augmented Generation,缓存增强生成)将这两步结合起来:预先处理固定资料并保存其 KV Cache,收到问题后加载缓存,继续处理问题并生成答案。长上下文决定资料能否完整输入;KV 缓存减少反复处理同一资料前缀的计算。

从全文问答到 KV 缓存复用 ​

例如,差旅助手只负责一本员工手册,所有使用者都有权阅读,而且每天都有人反复提问。直接全文问答时,每个请求都包含相同的手册,以及不同的问题。

Transformer 在处理输入时,会计算每层注意力所需的 key/value 状态。将这些状态保存为 KV Cache 后,后续 token 就可以使用它们。CAG 原论文把固定知识放在问题之前,预先计算这段前缀的 KV,供多个问题复用。

把手册记为固定知识前缀,流程可以写成:

text
离线:指令 + 带来源标识的固定手册 → 预计算知识前缀 KV
在线:加载前缀 KV + 本次问题 → 生成答案
结束:丢弃本次问题和答案新增的 KV,保留固定前缀

同一本手册可以回答许多不同问题:每次从同一份前缀 KV 开始,处理当前问题并生成新答案。缓存的内容是手册对应的模型状态,问题和答案仍然逐次计算。

CAG 节省的是稳定前缀的重复预填充,并取消这条路径上的在线检索。它仍然要处理新问题、读取缓存并生成答案。KV 本身占用内存或显存,较长前缀也会影响后续生成计算,不能把命中缓存理解为长资料没有成本。

哪些资料适合直接放入上下文 ​

“放得下”需要同时计入资料、问题及指令,以及留给输出的空间。若资料已经占满窗口,实际请求仍可能被截断。模型也不保证正确利用每个位置的内容;例外条款、旧版本和相似数字同时出现时,全文输入仍会答错。

资料还应覆盖任务需要的事实。如果手册只有境内规则,全文输入也无法补出境外规定,系统仍需补查或说明缺少资料。缓存复用不会扩大知识范围。

资料库太大时,可以先用 RAG 选出相关文档,再交给长上下文模型阅读。例如先检索差旅制度及其修订说明,再阅读完整章节,比较 2025 和 2026 年的变化。更具体的长文档检索设计见 LongRAG。

三类缓存存的东西不同 ​

Prompt caching 复用的是重复提示词前缀的计算状态。常见实现要求前缀 token 匹配;模型、分词和运行配置也需要兼容。系统指令或前缀中间的内容变化,可能使后面的缓存无法复用。CAG 可以利用这类机制,让知识前缀成为主要的重复内容;普通 RAG 也可以缓存稳定指令,并在其后追加不同检索结果。

检索结果缓存保存“这个查询在某个索引版本下命中了哪些文档”。命中后可以跳过部分搜索,仍需组装上下文和生成答案。答案缓存保存已经生成的回复;其中按问题语义相似度寻找旧答案的方式,通常称为语义缓存。

三者的错误也不同。提示词缓存错配可能带入错误前缀;检索缓存过期可能继续返回撤回的制度;语义缓存可能把“2025 年境内”与“2026 年境内”的相似问法视为同一个问题,直接返回旧期限。因此,即使问题相似,也必须检查年份、适用范围、权限和知识版本。

缓存复用的条件 ​

每个独立请求都应从固定知识前缀开始。若员工甲问完后直接沿用不断增长的会话状态,员工乙的请求就会包含前一个人的问题和答案。原论文通过截断新增 token 对应的 KV 恢复缓存;服务实现也可以用独立请求状态或前缀副本隔离不同请求。

知识前缀应记录文档版本、有效范围和来源位置。制度更新后,要使旧前缀退出当前问答路径,并按需要重建缓存;保留旧版本用于历史比较时,必须明确标注年代。新制度生效与缓存重建之间若存在延迟,系统就需要临时检索最新条款,或者暂停相关回答。

缓存可复用也不等于用户有权读取它。请求必须先确认用户有权访问整个知识前缀,再把它交给模型。不同权限集合需要各自可见的资料包;权限撤销后,即使底层计算缓存仍存在,也不能继续让请求引用它。用提示词要求模型“忽略无权内容”无法替代这一步。

当每个用户看到的文档组合都不同,或者资料持续更新时,可复用的前缀会变少。此时按请求执行权限过滤和检索往往更容易维护。另一种组合是缓存所有用户可读的稳定手册,在后面追加经过鉴权的最新通知;要同时保留通知的优先级和生效范围,避免把冲突留给模型猜测。

分开测冷请求和热请求 ​

第一次请求或缓存失效后的请求,需要付出构建、加载缓存的成本;连续查询同一知识包才可能享受较多复用。只测缓存已经驻留的请求,会低估发布新版本、重启和低频资料包的代价。

可以用同一组问题比较“检索后生成”“全文直接生成”“全文前缀缓存后生成”,同时记录答案与引用是否正确、首次响应时间、完整响应时间、缓存命中量和资源占用。成本统计还应摊入前缀构建、存储、失效重建以及检索索引维护,不能只比较在线调用次数。

小而稳定、权限一致、反复被查询的资料包适合采用这类方案。资料增长到无法完整输入、更新频繁或用户可见范围差异很大时,应重新比较按请求检索的成本与维护难度。

原始资料 ​

持续学习,持续实践。