优化 Agent 推理延迟与成本、诊断首 token 变慢或缓存命中率下降时使用——KV Cache 前缀不变性原则、三条铁律、五种破坏缓存的错误上下文管理模式、Chat Template 与历史思维链回传策略、缓存作为架构约束(缓存边界、子 Agent 字节级对齐、替换字符串冻结)。
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-kv-cache-design-72453c41f4d1 ,按照其中的说明把「kv-cache-design」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
KV Cache 把前文 token 的键值对(K/V)缓存下来,下一轮只计算新增部分。前提是要复用的 token 前缀保持不变——若序列从某位置开始不同,首个不同 token 及其后的 KV 状态需重新计算,此前位置不受影响。跨请求的对应机制叫 Prompt Cache。一行看似无害的动态代码,可能让整条推理链路慢一个量级。
cached_tokens 命中率低reasoning_content / thinking block)的回传与跨模型轨迹迁移USER: ... ASSISTANT: ... 的根本问题是偏离训练格式,会削弱多步思考能力。[ system prompt ][ tool definitions ] 静态前缀,字节级稳定,跨请求/用户/会话缓存
[ user / assistant / tool ... ] 轨迹,只追加不修改
[ 状态栏 / 新工具 schema / 动态信息 ] 追加到末尾
system、user、assistant、tool 等特殊 token 划分每条消息的边界和角色。不同模型家族(Qwen、Llama、Gemma)格式不同,服务端自动转换,开发者不需要手写,但必须知道它的存在。<think> 内的历史思考保留下来以保证多步思考连贯,但 Chat Template 检测到新的用户查询时默认「用户换了个话题」,清理之前的思考。若工具结果被错误标记为 user 消息,就会误触发清理——相当于模型正算到一半,草稿纸被人收走了。content,不回传 reasoning_content(训练时历史 CoT 从不出现在输入里)。tools,两个 user 消息之间的每条 assistant 消息(哪怕该轮未调用工具)都必须原样回传 reasoning_content,否则 API 直接返回 400。Kimi K2、GLM-5 采用同样协议。| 模式 | 后果 | 正确做法 |
|---|---|---|
| 动态系统提示词(时间戳) | 前缀从时间戳处全失效,TTFT 从 0.5s 涨到 3-5s | 时间作为 user 消息追加末尾,或需要时用工具获取 |
| 动态用户配置(余额/额度) | 每轮改写前缀,缓存全失效 | 用专门的状态管理机制按需获取 |
| 工具定义动态排序 | 从首个变动的工具起全部失效(每个工具定义可达数百 token) | 固定顺序——实验表明固定顺序对模型选工具能力几乎无影响,性能提升显著 |
| 滑动窗口历史 | 破坏前缀一致性 + 丢失关键工具结果 | 改用压缩/状态栏,见 context-compression |
| 文本格式化(USER:/ASSISTANT:) | 偏离训练格式:重复执行已完成操作、忽略工具结果、该调工具时输出文本 | 用标准结构化消息 |
Current time: {{now}}:这是最高频的错误。某团队客服 Agent 每天 10 万次对话,加了一行时间戳后首 token 延迟从 0.5 秒涨到 3-5 秒,月度推理账单几乎翻倍。chapter2/kv-cache/ — 实验 2-3:ReAct Agent 在 correct 与五种反模式(dynamic_system / shuffled_tools / dynamic_profile / sliding_window / text_format)下的 KV Cache 对比,测量 TTFT、缓存命中率与 token 用量;支持 --report 离线对比和 --cache-price-ratio 成本估算。book/chapter2.md「KV Cache 友好的上下文设计」