前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9264
  • Cursor Agent 环境预构建:启动速度提升 3 倍
  • Simon Willison测评:DeepSeek V4 Pro推理能力差异化显著
  • 四步法区分Flaky Test与真实回归
  • AI工具调用测试夹具设计的四大原则
  • EXL2量化:分数位宽如何实现精确显存匹配
  • ExecuTorch移动端推理:三阶段导出流程详解
  • LLM输出快照测试失败不等于回归
  • 事件流处理架构核心:分区与状态的成本推导
  • OpenCode 评测:终端原生 AI 编程 Agent 体验
  • AWS ECS自动扩缩容:正确用队列深度替代CPU利用率
  • AI Agent 内容工厂实战:19 个 Agent 日产 53 篇内容
  • LLM 测试去 flaky:按根因分组而非按测试名
  • AI 编程双车道工作流:量大任务用便宜模型,重大判断需人工审核
  • AI 输出日期格式暗坑:DD/MM 与 MM/DD 歧义为何难发现
  • Claude Chrome扩展升级:侧边栏对话与全平台历史同步
  • LLM 从简历提取工作经历的结构化schema设计
  • LLM 从简历提取学历的结构化schema设计
  • 模型别名指向的模型下线后会发生什么
  • Cursor 推出专用 AI Agent Git 托管服务 Origin
  • LLM 多轮对话截断策略的迁移实践
  • Context Caching 迁移的真实要求
  • Prompt 变更 Code Review 审查清单:六个关键维度
  • Cloudflare Vectorize 定价与维度计费陷阱详解
  • Anthropic引入AI输出水印,部分用户不满
  • Claude各模型知识截止日期详解:训练数据与可靠 cutoff 的差异
  • Claude Message Batches API:24小时窗口内50%折扣的异步批处理
  • Claude API强制输出JSON的规范做法:不用JSON Mode
  • Claude交错思考模式:工具调用后如何继续推理
  • Claude Extended Thinking原理:budget_tokens与max_tokens共享配额
  • Claude API 并行工具调用机制与禁用选项详解
  • ShieldFont:用字体特征对抗AI爬取
  • KEDA 按队列长度扩缩容 Celery 工人
  • CodeRabbit 推变更管理:PR 成 SDLC 瓶颈
  • Celery + Redis 队列化 K8s 推理架构实战
  • 用合同测试拦截第三方 API 破坏性变更
  • AI 能否生成真正的粤语而非书面中文
  • MCP 协议让 AI 操控 Minecraft:61 个工具覆盖移动/建造/战斗
  • Eval 分数骗人:AI 模型金丝雀指标应看 token 消耗/截断率/工具调用
  • 引用文献解析的正确姿势:分段策略比单次全量提取更可靠
  • 本地跑 BGE 向量模型:normalize_embeddings 是关键参数
  • 供应链攻击泄露数千亿字节凭证:2500 名 AI 包用户中招
  • AWS Bedrock 按token计费常见陷阱:单位换算与实时查询方法
  • Bedrock 知识库+S3 文档实战:分块策略与同步链路详解
  • Anthropic Chrome插件升级为Cowork模式
  • 分类模型准确率骤降诊断:指向数据输入问题
  • 跨API迁移异步轮询循环的六个假设
  • AST解析:代码静态分析的正确打开方式
  • 流式测试:正确断言chunk结构而非最终字符串
  • LLM做算术不靠谱:模型迁移后的精确度陷阱
  • AWS API Gateway WebSocket与HTTP流式的核心差异解析
  • AWS API Gateway四层限流机制详解:被忽视的隐形上限
  • 已加载 51 / 9264
8.0
热点
AI SCORE
编程提效2026-08-13 06:46

Context Caching 迁移的真实要求

dev.to · AI#LLM#上下文缓存#成本优化
Editor brief · 编辑速览

区分隐式前缀缓存(OpenAI)与显式块缓存(Anthropic/Google)两种设计,指出迁移方向不对称,显式迁隐式主要是删除工作。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

两种缓存体系

Provider 主流实现约莫两种设计,迁移工作量的大小取决于你正在跨越哪一种。

隐式前缀缓存

Provider 会对请求开头部分做 hash,若之前已计算过且匹配则复用。没有 API surface:无需设置字段、无需创建或删除任何东西,唯一的出错可能就是 prompt 的形态。OpenAI 文档描述了这种自动缓存机制,以最小长度以上的共同前缀为匹配依据,命中情况在 usage 对象中回传。函数库在自动 prompt 缓存中覆盖了这一机制。

显式缓存

你需要标记要缓存的内容。Anthropic 的文档描述了 per-block 的 cache_control 标记,每个请求有有限数量的断点,每个断点缓存其之前的所有内容。Google 的 Gemini API 文档则记录了另一种明确的形态:一种你创建并设置 TTL 的 cached-content 资源,随后在后续请求中按 handle 引用。

迁移方向是不对称的。显式到隐式基本就是删除——去掉标记、保留 prompt 结构,如果前缀足够长且稳定,收益仍在。隐式到显式是困难的方向,因为旧 provider 为你做的决定(可复用部分在哪里结束)现在必须由你来做,而且只能放在固定的小数几个位置,一旦做错就什么都缓存不到。

稳定前缀的真正含义

两种体系的所有设计都要求缓存区域在每次请求间 byte-identical。不是语义等价——是字面上完全一致。实际结果是关于顺序的一条规则:每个请求中会变化的部分必须放在不变的部分之后,没有任何例外,因为 prompt 前面哪怕只有一个字节不同,其后的所有内容都会失效。

破坏它的事情几乎总是意外而非有意为之:

系统 prompt 顶部的时间戳或日期。这是最常见的原因。"Today is 12 August 2026, 09:41" 放在系统 prompt 顶部,缓存命中率就是零;精确到天也只会得到一个在午夜重置的命中率。

租户或用户 ID 被插入了序言部分。把它移到最后,或移入 user turn。

工具定义以非确定性顺序序列化。工具 schema 通常是前缀的一部分,如果它们从迭代顺序不稳定的 map 构建,或者被不固定 key 顺序的 JSON 编码器序列化,那么字节在不同进程间就会不同,尽管内容是一样的。排序 key 并显式修复顺序。

检索到的文档顺序不一致。RAG context 天生是可变的;错误在于把它放在静态指令之前而非之后。

少样本示例是每次请求采样的。随机示例选择和缓存直接对立。二选一。

一个有用的迁移前练习耗时一小时:捕获几百个真实的出站请求体,计算它们之间的最长公共前缀长度,然后与目标 provider 的最小可缓存长度比较。如果公共前缀比下限还短,再怎么配置都不会产生命中,工作重心应该放在重构 prompt 而非缓存 API 上。

下限、断点与 TTL

三个数字共同决定了一个结构上正确的设置是否真正生效,而且这三个数字在不同 provider 和不同模型间都不一样。

最小可缓存长度。缓存不会在低于某个 token 下限时启动。撰写本文时,OpenAI 文档记录了大约一千 token 以上的 prompt 自动缓存,Anthropic 文档记录了按模型不同的最小可缓存前缀长度,较小的模型比较大的模型需要更长的前缀。一个 prompt 在一个 provider 那里轻松超过下限,在另一个那里可能就低于下限。

断点预算。显式设计限制了一个请求可以承载的缓存标记数量。当你从隐式 provider 迁过来时,你没有任何标记,必须选择放置位置:通常一个放在工具定义之后,一个放在静态指令块之后,让可变内容不被缓存。

生命周期。短生命周期缓存——以分钟计,通常每次命中时刷新——相对于你设置的 TTL 显式创建的缓存。这是决定你的流量模式是否受益的关键数字。

本节中的每个数字都是 provider 参数,已经变过不止一次,以后还会变。 sizing 之前先读目标 provider 的缓存参考以了解当前的下限、断点限制和 TTL;下面的算术是跨时间依然成立的部分。

TTL 与到达率的交互值得记录。如果共享前缀的请求以 rate lambda 独立到达,且缓存在最后一次使用后存活 T,那么一个给定请求发现 warm cache 的概率是前一个请求在 T 内到达的概率。在泊松到达假设下——这是个假设,对突发批量流量不成立——结果是:

P(hit) = 1 - exp(-lambda * T)

lambda = 1/minute,  T = 5 minutes   ->  1 - exp(-5)     = 0.993
lambda = 1/minute,  T = 1 minute    ->  1 - exp(-1)     = 0.632
lambda = 1/hour,    T = 5 minutes   ->  1 - exp(-1/12)  = 0.080

第三行是让人中招的那个。低流量租户无论 prompt 结构多完美,从短生命周期缓存中几乎得不到任何好处,这意味着缓存经济是按租户而非按应用计算的。如果你的流量在租户间分布不均,要把忙的和闲的分开建模。

经济账变了形状

隐式设计通常对缓存的输入打折,不额外收取填充缓存的费用;显式设计通常对写入收取溢价,对读取大幅打折。这是不同的决策问题,而且只有第二个才有盈亏平衡点。

设 P 为可缓存前缀的 token 大小,n 为一个缓存生命周期内使用它的请求数,w 为写入乘数,r 为读取乘数,两者都相对于普通输入价格表示。那么:

uncached cost   = n * P
cached cost     = w * P + (n - 1) * r * P

cached < uncached  when  w + (n - 1) * r  <  n
                          n * (1 - r)     >  w - r
                          n               >  (w - r) / (1 - r)

with w = 1.25 and r = 0.1  (the multipliers Anthropic documents
at the time of writing for a write and a read):
                          n > 1.15 / 0.9 = 1.28

so the second read inside the lifetime already pays.

这个结果是有用的,而且它是稳健的:对于任何远低于一的读取乘数和任何接近一的写入乘数,盈亏平衡点在两次读取以下。因此显式缓存的风险不在于溢价太高——而是你写入了永远不会被读取的缓存,因为 TTL 先过期了或者前缀没有你想象的那么稳定。每一次浪费的写入都等于 w 倍普通价格,什么都没换回来。

这就是为什么上面的命中率公式和盈亏平衡公式必须一起用。两者相乘:缓存下每个请求的期望成本是 P * (r * p_hit + w * (1 - p_hit)),且当 w 大于 1 时,存在一个命中率,低于它缓存还不如不缓存。求解得 p_hit > (w - 1) / (w - r),对于上面的乘数约为 0.22。大约低于五分之一的请求命中时,显式缓存反而在烧钱。

迁移后证明命中

因为不会报错,唯一的证据在 usage 对象里,而且字段名各不相同。OpenAI 在 usage.prompt_tokens_details.cached_tokens 下报告缓存的输入 token。Anthropic 报告两个独立字段,usage.cache_creation_input_tokens 和 usage.cache_read_input_tokens,信息量更大——你可以分别看到写入和读取,上面的浪费写入问题可以直接量化为没有匹配读取的写入。

把这个做成断言而非仪表盘。加一个冒烟测试,连续快速发送两次相同 prompt,要求第二次响应报告非零的缓存计数;在每次 prompt 改动后对每个 provider 绑定跑这个测试。一次把可变 token 移到断点上方的 prompt 编辑看起来是一个正常的 commit,却会静默地成倍增加你的输入账单,而这个测试是唯一能在当天捕捉它的东西。

在那里还要检查两件事。缓存按 model string 隔离,所以模型版本升级会使所有缓存失效,新版本头几分钟看起来会很贵——这是预期的,不是回归。而且缓存按组织或项目隔离,所以在多租户系统中共享前缀默认是跨租户共享的,这很高效,但应该是你的数据处理审查有意做出的决定而非继承下来的。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
LLM 多轮对话截断策略的迁移实践
下一篇
Prompt 变更 Code Review 审查清单:六个关键维度