正在刊行长文 · Essay
2026-08-30所有内容
随机比特 · Random Bits

工具没变,只换了顺序:提示词缓存为何会失去复用

2026-08-30AI Engineering / Systemsrbits.uk
工具没变,只换了顺序:提示词缓存为何会失去复用

Agent 重启或扩容后,工具一个没有增删,缓存读量却可能下降。排查者通常先检查 schema、模型与路由,却容易忽略 tools[] 的顺序。只要顺序漂移,客户端就已经向模型服务发送了另一段有序前缀。

为验证这一点,我们固定了 8 个工具的名称、描述和 schema,也固定模型、消息、tool_choice 与其余请求字段,只把数组最前面的 search_repository → read_file 换成 read_file → search_repository;对照结果显示,两组都是同一批 8 个工具,集合摘要同为 c2f82261…,有序工具摘要却从 84d4bd6b… 变成 543ddfa7…。两份规范化载荷同为 7566 字节,前 399 个 UTF-8 字节相同,第 400 个字节出现差异;5 项确定性检查全部通过。

对 OpenAI 与 Claude 文档所描述的前缀缓存,工具定义是有序前缀,不是无序集合。

相同工具集合仍可能形成不同输入

一个简化类比是,同一副扑克牌只改变排列,牌一张没少,牌序却已经不同。这个类比只解释“集合相同不等于序列相同”;OpenAI 与 Claude 的公开规则比较渲染后的有序前缀,并不是直接拿客户端 JSON 的 SHA-256 判定命中。

本地摘要的价值,是定位客户端装配缺陷。集合摘要不变,说明能力清单没有增删;有序摘要变化,说明实际发出的工具顺序发生漂移。它不能证明服务商缓存 miss,也不能换算费用、延迟或命中 token。线上尝试的首个推理请求返回 HTTP 402,completed_calls 为空数组,因此没有可用于判断命中率的服务商 usage 样本。

这种漂移可能产生于插件目录扫描、集合遍历、并发注册或多服务合并。单次运行未必出现异常,进程重启、扩容或插件加载时序变化后,不稳定顺序才可能显现。

8 个固定工具只交换前两项后,有序前缀从首个换位处产生分叉

不同服务商规则的适用边界

OpenAI 当前文档明确说,可缓存对象包含完整 rendered context,tool definitions 也在其中;工具的名称、描述、schema 和 ordering 都会影响 cached prefix。prompt_cache_key 只辅助把相同前缀路由到可能持有缓存的机器,不能让不同内容强行共用缓存。

Claude 文档进一步明确,请求前缀按 tools → system → messages 排列,并做有序的精确前缀匹配;添加、删除或重排工具定义都会破坏原有复用。这里的“失效”不是物理删除旧条目,而是新请求从首个分歧起不能继续复用;实际可读长度仍受缓存断点、最低长度、TTL 和路由影响。

Gemini 只公开强调共同或相似前缀,以及不可变的显式 CachedContent。其隐式缓存没有公开 tools[] 排序的具体匹配规则,所以不能把 OpenAI、Claude 的结论写成三家统一机制。

基于三层身份的修复验收

MCP 2026-07-28 的 Tools 规范已经给出协议动机。底层工具集合不变时,服务端 SHOULD 以确定顺序返回工具,便于客户端缓存列表并改善 LLM Prompt Cache 命中。注意是建议而非强制;客户端合并多个 MCP 服务、权限过滤或重新序列化时,仍可能再次打乱顺序。

修复验收分为三层。

集合身份用于判断能力集合是否变化。对规范化后的工具集合计算与顺序无关的摘要;真正增删工具或修改 schema 时,它就应该变化。

有序载荷身份用于判断有序前缀是否变化。先验证工具身份唯一,再按确定性全序排列;多服务聚合可使用配置中的稳定 server ID、tool name 与 schema version 组成排序键。随后记录实际发出载荷的摘要。这个 hash 是诊断信号,不是厂商缓存键。

排序应放在最终请求装配边界,而不只放在某个工具服务内部;否则上游虽稳定,客户端后续的合并和过滤仍可能重新制造另一种顺序。排序规则也应版本化,避免重构在未经察觉时改变同名工具的优先级。

服务商回执用于判断缓存是否实际命中。OpenAI 检查 cached_tokens,Claude 检查 cache_read_input_tokenscache_creation_input_tokens;先串行发送 A、再重复 A,随后换序为 B、再重复 B,并确保满足对应模型的最低长度和 TTL 条件。

工具注册表经稳定排序和双摘要诊断后,最终由服务商 usage 回执验收缓存命中

固定顺序不是为了掩盖能力变化,而是为了避免在能力定义未发生变化时生成另一份新前缀。先核对集合,再核对有序载荷,最后检查 usage;三层结果一致,修复才算闭环。其他服务商是否采用相同规则,仍须回到各自文档与 usage 实测。

资料依据:OpenAI Prompt CachingClaude 缓存失效规则MCP 2026-07-28 ToolsGemini Context Caching 与开放书稿《深入理解 AI Agent》第 2 章

随机比特公众号二维码
公众号 · 随机比特
从 AI 工具热闹里拆工程真相

写边界、控制面、上下文、成本与安全。