Thariq推文【Lessons from Building Claude Code: Prompt Caching Is Everything】精读

news2026/3/14 7:24:19
Prompt Caching 不是优化项而是 Agent 系统设计的起点最近读到一篇很有启发的文章Lessons from Building Claude Code: Prompt Caching Is Everything。它讨论的不是一个局部技巧而是一个很容易被忽略的系统级事实对于长会话、长上下文、频繁往返的 Agent 产品来说Prompt Caching 往往不是“锦上添花”的优化而是决定成本、延迟和产品形态的基础设施。如果一句话概括这篇文章的核心观点那就是Prompt cache 命中率会反过来塑造你的 prompt 结构、工具设计、模型切换策略甚至影响功能应该怎样实现。这篇文章主要讲了什么文章围绕 Claude Code 的工程经验分享了一个核心结论Prompt caching 的本质是前缀复用prefix match。也就是说只有当请求前面那一大段内容保持稳定时缓存才能命中。一旦前缀中某个位置发生变化后续内容的缓存收益就会被破坏。这直接带来一个非常反直觉的设计原则你不能把缓存当成底层能力接一下就完事了而应该从系统设计阶段就围绕“如何保持前缀稳定”来做架构。agent prompt架构如下文章具体展开了几个关键经验Prompt 的内容顺序极其重要应该把稳定内容放前面把动态内容放后面。不要轻易改 system prompt很多变化更适合通过消息注入。不要在会话中途切换模型否则缓存会失效。不要在会话中途增加或删除工具否则会破坏缓存前缀。像压缩上下文、做总结、启动子任务这类“分叉操作”也应该尽量复用原会话的前缀。这些经验看起来像实现细节但其实都在说明一件事Agent 的很多功能设计不应该只看“语义上对不对”还要看“缓存上稳不稳”。为什么 Prompt Caching 这么重要传统对话产品里一次请求的 prompt 相对较短即使有一些重复浪费也未必特别夸张。但 Agent 类产品不一样。Agent 往往会有这些特点system prompt 很长工具定义很多会话历史很长每一步都要多轮调用模型一个任务可能持续几十轮甚至上百轮在这种情况下如果每一轮都把大量重复 token 重新算一遍成本和延迟都会迅速膨胀。缓存命中得越好单次交互越便宜响应越快产品能给用户的额度和体验也越“慷慨”。Claude Code 团队甚至会监控 prompt cache hit rate并在命中率明显下降时当成事故处理。这说明在真实产品里缓存命中率已经不是可有可无的指标而是直接影响业务表现的核心指标。第一条经验Prompt 结构要为缓存而排布文章里最重要的工程原则之一就是静态内容放前面动态内容放后面。Claude Code 的大致组织方式是全局稳定的 system prompt 和 tools项目级上下文例如Claude.md会话级上下文当前对话消息这样安排的目的是让尽可能多的请求共享同一段前缀。这背后的启发非常强我们平时设计 prompt往往先考虑“模型好不好理解”但做 Agent 时还要增加一个维度叫“不同请求之间能不能最大化共享前缀”。文章还提到一些很容易忽略的缓存杀手例如在静态 system prompt 里放精确时间戳工具定义顺序不稳定工具参数在不同轮次中悄悄变化这些改动看上去很小但因为它们出现在前缀区域会让缓存命中率断崖式下降。第二条经验能用消息更新就不要改 System Prompt这是文章里一个特别实用的建议。很多时候系统里的信息会变化比如当前时间变了用户修改了文件系统状态切换了直觉上我们很容易去更新 system prompt。但问题是一旦你改了 prompt 前面的稳定部分就等于主动放弃了缓存。Claude Code 的做法是尽量把这些变化通过下一轮消息补进去而不是直接修改原本稳定的提示词。例如用类似系统提醒的消息告诉模型“现在是星期三”或者“某个文件刚刚被修改了”。这背后的思路非常值得借鉴让 system prompt 承担“长期稳定的规则”让 message 承担“临时变化的状态”。这不仅更利于缓存也能让提示词职责更清晰。第三条经验不要在会话中途切模型很多人会觉得复杂问题用大模型简单问题切到便宜小模型更省钱。但文章指出在长上下文场景里这件事常常恰恰相反。因为 prompt cache 是和具体模型绑定的。如果一个会话已经在某个模型上积累了大量缓存这时候切到另一个模型意味着你要重新构建整段上下文对成本的打击可能比继续用原模型更大。也就是说从单次调用看小模型更便宜但从整段会话看切模型可能更贵。这是一种很典型的“局部最优不等于全局最优”。文章给出的更好方案是如果确实需要换模型就通过子代理或子任务来做把主会话保持在原模型上让另一个模型去处理局部任务。这个建议非常像操作系统里的进程隔离思路不是把主上下文打碎重来而是把局部工作外包出去。第四条经验不要在会话中途增删工具这一条对做 MCP、函数调用、工作流 Agent 的人尤其重要。很多人会本能地觉得当前轮次需要什么工具我就给模型什么工具不需要的工具就先移掉这样更干净。但从缓存角度看这种做法代价很高。因为工具定义通常也在 prompt 前缀里只要你增删工具整个缓存前缀就变了。Claude Code 的解决方式很巧妙不要真的切换工具集而是把“状态切换”也建模成工具或消息。比如它们的 Plan Mode不是进入计划模式就换一套只读工具而是工具仍然保持不变通过EnterPlanMode/ExitPlanMode这样的工具表达状态切换再用系统消息告诉模型当前处于计划模式应该只做探索不做修改这样既保住了缓存也让状态机更一致。文章还提到另一个思路对于大量工具不要动态移除而是通过延迟加载、工具搜索、轻量 stub 等方式让“工具列表的骨架”保持稳定只有真正用到时再补充细节。这说明一个重要原则为了缓存稳定很多动态能力应该设计成“延迟展开”而不是“动态重写前缀”。第五条经验上下文压缩和总结也要做成 Cache-Safe文章中我觉得最有洞察力的一部分是它谈到了 compaction也就是上下文窗口不够用时对历史对话做总结压缩。直觉上这件事很简单另起一个请求把历史喂给模型让它总结一下再带着总结继续。但这里隐藏了一个大坑如果这个“总结请求”用的是另一套 system prompt、另一套工具或者干脆没有工具那么它和原会话的缓存前缀就完全对不上。这样一来你会为整段历史再次付费成本非常高。Claude Code 的做法是保持和父会话几乎一致的前缀复用相同的 system prompt、上下文和工具定义把“请帮我压缩总结”作为新的用户消息追加到末尾这样从 API 视角看它还是那条老会话的自然延续于是前缀缓存可以继续命中。这个经验非常有启发因为它其实不只适用于 compaction也适用于很多“旁路任务”对历史做总结执行技能或子任务生成中间摘要做 fork 分支探索凡是这类操作只要它们共享足够多的父上下文就应该尽量做成 cache-safe fork。这篇文章给我们的真正启示如果只看表面这篇文章像是在讲一套 prompt caching 的调优技巧但我觉得它真正传达的是更底层的方法论设计 Agent不要只从能力和语义出发还要从“可缓存性”出发。换句话说Prompt Caching 不是最后再加的一层性能优化而应该成为产品设计时的“约束条件”。它会影响prompt 怎么分层状态怎么表达工具怎么组织模型怎么协作长上下文怎么压缩功能切换怎么实现很多看起来“更自然”的实现方式在缓存层面可能都不是最优解。真正成熟的 Agent 系统往往不是语义上最直观的那种而是既满足语义又尽量保持前缀稳定的那种。如果我们自己做 Agent可以直接借鉴什么结合这篇文章我觉得至少可以马上落地下面几条实践1. 把 Prompt 分成稳定层和变化层稳定层包括核心 system prompt固定工具定义项目级说明文档变化层包括当前任务状态临时提醒文件变更用户最新输入目标是让稳定层尽量不变把变化都压到后面。2. 给缓存命中率做监控如果一个 Agent 产品已经进入真实使用阶段就应该监控cache hit rate平均输入 token 成本首 token 延迟因 prompt 变化导致的缓存失效比例否则你很可能只看到“模型越来越贵”却不知道问题出在系统设计上。3. 用消息表达状态不要频繁改工具和 Prompt像“进入规划模式”“当前时间更新了”“文件刚被改过”这类信息优先考虑system reminder状态消息显式状态工具而不是直接改前缀。4. 把复杂能力设计成子任务而不是打断主会话如果某一步适合小模型、专门模型或单独执行就用子 agent、handoff、fork 的方式处理不要轻易破坏主会话的缓存积累。5. 对总结、压缩、分叉任务做“前缀复用”设计任何旁路任务只要仍然依赖父会话就应优先复用父会话的前缀环境而不是临时起一个完全不同的调用模板。结语这篇文章最有价值的地方在于它提醒我们重新理解 Agent 工程里的“优化”。在很多传统系统里缓存是性能优化但在 Agent 系统里尤其是长上下文、多轮调用、强工具依赖的系统里缓存其实已经上升为产品可行性的条件之一。当一个系统的成本、延迟、额度策略都和缓存命中率强相关时你就不能把它当成底层黑盒而必须让它进入架构设计。所以如果你正在做自己的 coding agent、workflow agent或者任何长会话 AI 产品这篇文章最值得记住的一句话可能不是“prompt caching 很重要”而是把缓存当成系统设计的一部分而不是部署完成后才想起来补上的优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…