第 5 章 AI AgentAgentic Patterns上下文

第 5 章 上下文预算治理:把 token 当成钱来管

上下文是一笔会悄悄变大的账单

前四章我们讲了怎么让单个 Agent 干得更好、怎么让它学会检查、怎么把活分出去。现在进入一个更隐蔽、也更"要命"的话题:上下文(context)管理

先看一个真实的烦恼。

你给 Agent 配置了一堆"常驻"内容:指令文件、记忆索引、技能说明、hook 配置……每一样单独看都不大,也就几百个 token。但问题是——它们每个 session、每一轮对话,都要跟着送进模型一次。这就是所谓的"幽灵 token"(ghost tokens):你根本感觉不到它们存在,但每一轮都在为它们付钱。

一个生产工作区发现,这类常驻上下文的基线每周悄悄上涨约 20%。没有单次明显的大变化,但积累下来,质量下降、成本攀升,而且没有任何东西会大声报警——问题就这么温水煮青蛙地恶化下去。

更糟的是无人值守的定时任务:它们半夜跑,没人看着,一个任务的 token 胃口变大,可能连续跑几周都没人发现。

这一章讲三个模式,专门对付"上下文账单失控":

  1. Context Budget as a Governed Resource(上下文预算治理):像管钱一样管上下文——测量、盯趋势、设上限。
  2. Context Window Anxiety Management(上下文焦虑管理):对付模型自己的"怕用完"心理。
  3. Prompt Caching(提示词缓存):让重复的内容不重复付钱。

模式一:上下文预算治理(Context Budget as a Governed Resource)

问题

如开头所说:常驻上下文在悄悄积累,没有一个地方在"记账",出了问题也没人报警。

方案

把上下文预算当成像钱一样的受治理资源:测量它、追踪它的趋势、给它设上限。具体四步:

第一步:建一个基线计数器

把每一个常驻来源都量一遍:指令文件、记忆索引、技能描述、hook 命令字符串……每个来源单独记录。粗略估算就够了(比如"字符数除以 4"),重要的是持续记录,留下历史。

基线 = 求和(估算token(来源) for 来源 in 所有常驻来源)
记录(基线, 按来源细分)

if 基线 > 过去4-8周中位数 * (1 + 警戒幅度):
    报警(增长最快的来源)

第二步:盯趋势,而不只是设上限

绝对上限只能拦住"灾难",拦不住"悄悄积累"——而悄悄积累才是最常见的失败方式。所以报警条件应该是:基线超过前 4-8 周中位数一定幅度(比如 10%-25%)。按来源细分是让报警"可行动"的关键:总数只告诉你"长了",细分告诉你"该删谁"。

第三步:给无人值守的跑批设硬上限

每一个定时调用的 Agent 任务,都带上一个花费上限(类似 --max-budget-usd 的开关),大小设为正常一轮的 10-50 倍。这是防跑飞的保险带,不是用来精调的工具。

第四步:从结构上限制"发散"

运行任何多 Agent 工作流之前,先估算 Agent 数量,给每一层设上限。如果一个工作流的 Agent 数量会随着发现的数据(claim、文件、匹配结果)增长,那它就是一个"成本炸弹"——必须在设计上就拦住。

还有两个配套动作:给记忆和索引文件设明确的容量上限(比如多少行、多少 KB,超了就迁移到按主题拆分的文件);给压缩过程留一条常驻指令,告诉运行时哪些东西必须保留(带理由的决策、进行中的编辑、未解决的问题),哪些可以丢弃,防止压缩时把关键信息悄悄删了。

证据

  • 证据等级:medium(中等)。
  • 最有价值的发现:一个生产工作区当场抓住了约 20% 的周环比基线跳升,并当天定位到三个增长来源——这就是"按来源细分"的价值。
  • 还有一个教训:一个研究型工作流单次运行 fan-out 超过 100 个 Agent,之后才开始设预算上限和 fan-out 边界。

怎么用

  • 只要有任何文件会被自动加载进每个 session,或有任何 Agent 无人值守运行,就该用这个模式。
  • 从基线计数器开始(一个下午的活),把趋势报警挂到已有的周期性复查上(每周审计是天然的宿主),最后再给定时任务加预算上限。
  • 按来源细分是回报最高的部分:总数告诉你长了,来源告诉你删什么。

取舍

  • 好处:成本和质量都可控;问题在变成灾难前就被发现。
  • 代价:需要一点持续的维护(记录、审计);阈值是经验值,要按自己的情况调。

模式二:上下文焦虑管理(Context Window Anxiety Management)

问题

这是个很有意思的现象,来自 Cognition AI(做 Devin 的公司)的观察:模型自己会有"上下文焦虑"

像 Claude Sonnet 4.5 这类模型,会"意识到"自己接近上下文窗口的极限,然后开始提前收尾——主动总结进度、急着把任务结束掉,哪怕其实还有足够的空间。具体表现:

  • 任务提前完成,走捷径。
  • 明明还有上下文,却草草收工。
  • 严重低估还剩多少 token 容量。
  • 自己给自己压力"该收尾了",而不是继续干活。

方案

用策略性的预算管理和激进的提示词,对抗这种焦虑驱动的行为:

1. 上下文缓冲策略

开一个大上下文窗口(比如 1M token 的 beta),但实际只用到 200k。这相当于给模型一段心理上的"跑道"——它知道自己离天花板还远,就不那么焦虑了。

2. 激进的"反提示"

在对话开头明确告诉模型:"你还有很多上下文,不要急着完成任务。"在对话结尾再加一句:"慢慢来,上下文不是约束。"直接压过它想总结、想收尾的冲动。

3. Token 预算透明化

明确告诉模型当前可用的 token 预算,定期安抚它"还有多少余量",对抗它低估可用空间的天性。

# 缓解上下文焦虑的配置思路
def 设置上下文焦虑管理():
    上下文缓冲 = 启用大上下文(1M token)
    实际限制 = 把使用上限卡在(200k token)

    提示词前缀 = "你有充足的上下文,不要赶进度..."
    提示词后缀 = "慢慢来,上下文不是约束..."

证据

  • 来自 Cognition AI(2025 年 9 月关于 Devin + Sonnet 4.5 的经验分享),是生产一线的观察。
  • 证据等级偏 emerging(新兴),但现象真实且普遍。

怎么用

  • 当你的 Agent 出现"任务提前结束""明显走捷径""在还有余量时草草收尾"时,考虑用这个模式。
  • 模型越强、上下文越大,越值得配上缓冲策略。
  • 结合下一章的压缩模式一起用:既给足跑道,又控制实际用量。

取舍

  • 好处:减少任务提前收尾;让模型在长任务里保持专注。
  • 代价:要开着大窗口(可能涉及额外配置);"反提示"需要针对具体模型调。

模式三:提示词缓存(Prompt Caching)

问题

长会话的 Agent 有个隐蔽的性能杀手:每一次调用,都要把整个对话历史重新发给 API。随着对话变长,这些静态内容被一遍遍重复处理——没有缓存的话,推理成本和延迟会呈二次方增长

你可能想用"服务端状态"来优化,但有些场景不允许(比如零数据留存策略 ZDR),或者中途改配置(换沙箱、换工具、换工作目录)会破坏缓存。

方案

核心洞察:提示词缓存只对"完全一致的前缀"生效。如果本次请求的前 N 个 token 和上一次请求完全一样,缓存的计算结果就能直接复用。

所以策略是:永远追加新消息,而不是修改已有消息;并精心排列消息顺序,最大化缓存命中率。

排列原则很简单:

  1. 静态内容放最前(所有请求都一样,永远命中缓存):
    • 系统消息
    • 工具定义(顺序要保持一致!)
    • 开发者指令、项目指令
  2. 变化内容放最后(每次请求都不一样):
    • 用户消息
    • 助手消息
    • 工具调用结果(一轮轮追加)

缓存是在 token 级别工作的,不是消息级别——它逐 token 检查前缀匹配,与消息边界无关。所以只要前缀严格一致,就能命中。

证据

  • 来自 OpenAI Codex 团队(Michael Bolin)对 Agent 循环的工程总结。
  • 这是各大推理服务商(Anthropic、OpenAI)都提供的基础能力,实践验证充分。

怎么用

  • 把"静态在前、动态在后"当成 Agent 提示词的标准结构。
  • 工具定义的顺序一旦定下就别随便改——改顺序 = 缓存全失效。
  • 中途要改配置(沙箱、工具)时,意识到这会打断缓存,尽量安排在会话边界。

取舍

  • 好处:长会话成本显著下降、延迟降低。
  • 代价:需要约束消息结构;对"每次内容都不同"的短任务没什么用。

三个模式怎么选

场景 推荐模式
常驻上下文在悄悄膨胀,没人记账 Context Budget 治理
Agent 长任务提前收尾、走捷径 上下文焦虑管理
长会话成本二次方上涨 Prompt Caching
有无人值守的定时 Agent Context Budget 治理(必做)

三个模式是互补的:预算治理管"总量"和"趋势",焦虑管理管"模型心理",缓存管"每一轮的成本"。它们可以同时用。

实践清单

  • 给所有常驻上下文来源建基线计数器,按来源细分记录
  • 设趋势报警(周环比中位数 +10%-25%),而不是只设天花板
  • 每个定时任务带花费上限(正常一轮的 10-50 倍)
  • 多 Agent 工作流先估算 Agent 数量,每层设上限
  • 记忆/索引文件设行数/KB 上限,超限迁移到按主题拆分
  • 压缩时明确"必须保留"和"可以丢弃"的内容
  • 长任务给模型"上下文还很充足"的安抚,开缓冲
  • 提示词按"静态在前、动态在后"排列,工具定义顺序固定

本章小结

  • 上下文是 Agent 最宝贵的资源,但会悄悄膨胀——要像管钱一样管:测量、盯趋势、设上限。
  • 模型自己会有"上下文焦虑",会提前收尾——用缓冲和反提示对抗。
  • Prompt Caching 只对"完全一致的前缀"生效——静态在前、动态在后,工具顺序固定。
  • 三管齐下,让上下文账单不再失控。

下一章,我们讲"装不下了怎么办"——上下文压缩与精选:自动压缩、精选代码窗口、语义过滤、大文件渐进披露。

📑 Agent 模式实战:生产级 AI Agent 的工程模式

1 第 1 章 什么是 Agent 模式 2 第 2 章 规划-执行-观察:先想清楚,再动手 3 第 3 章 反思闭环:让 Agent 学会检查自己的作业 4 第 4 章 委派:让主 Agent 学会把活分出去 5 第 5 章 上下文预算治理:把 token 当成钱来管 6 第 6 章 上下文压缩与精选:装不下怎么办 7 第 7 章 上下文最小化:别让脏东西留在脑子里 8 第 8 章 记忆体系:让 Agent 记得住过去 9 第 9 章 学习沉淀:让 Agent 和团队一起变聪明 10 第 10 章 工具接口哲学:让 Agent 能用、好用、用得起 11 第 11 章 工具发现:让 Agent 在几百个工具里找到对的 12 第 12 章 执行环境:Agent 在哪动手、怎么动手 13 第 13 章 代码执行与沙箱:先写码,再跑码 14 第 14 章 结构化输出与契约:让 Agent 的输出能接住 15 第 15 章 验证循环:Agent 怎么检查自己的作业 16 第 16 章 评测基建:怎么系统地检验 Agent 17 第 17 章 可观测性:看见 Agent 在想什么、在干嘛 18 第 18 章 韧性工程:扛得住部分失效 19 第 19 章 威胁模型:先看风险长什么样,再谈防御 20 第 20 章 控制流隔离:把"谁做决定"和"谁执行"分开 21 第 21 章 权限与审批:谁有权干什么、谁点头 22 第 22 章 凭据与出口:Agent 手里的钥匙和门 23 第 23 章 多智能体信任:多个 Agent 之间怎么互信、怎么审计 24 第 24 章 反馈信号设计:给 Agent 的是信号,不是更大的提示词 25 第 25 章 评测驱动的改进:让 Agent 在真实使用和对抗测试里变强 26 第 26 章 强化学习:把反馈变成训练信号 27 第 27 章 复合式进化:让 Agent 系统越用越值钱 28 第 28 章 多智能体协调:让一群 Agent 一起干活不掉链子 29 第 29 章 模型路由:谁用哪个模型,怎么用得起 30 第 30 章 推理搜索结构:让 Agent 多想想,而不是一条道走到黑 31 第 31 章 控制谱系:从自动补全到完全自主的滑动条 32 第 32 章 团队与产品:把 Agent 变成团队资产,而不是个人玩具
← 返回本书大纲