Aklman · Library

11 / 第十一章

生产部署 · 持久工作流、成本控制与运维.

从笔记本上跑通到真实流量 —— 持久化状态、重试策略、成本预算、监控告警。

MD海报

在你笔记本上跑通的研究助手,离生产还差一段。生产意味着真实流量、会崩的进程、会失控的账单、和你不看着它的时候。这一章讲把它从「能跑」推到「敢上线」的四件事:持久化状态、成本上限、监控告警,以及一个贯穿全书的收尾 —— 你敢不敢放它无人值守。

I

Agent 会中断 —— 持久化状态,让它能恢复.

一个长任务跑到一半,进程挂了、超时了、机器重启了 —— 不该从头再来。 第二章那个最小循环把状态全放在内存里:一崩就清零。生产 agent 要把每一步的状态持久化。durable execution(Temporal 这类框架)就是干这个的 —— 工作流的每一步落盘,崩了能从断点续,而不是重跑整个任务。1注 1Temporal —— 持久执行(durable execution)框架:把工作流每一步的状态持久化,进程崩溃 / 超时后能从断点恢复,而不是从头再来。长运行 agent 上生产的常用底座。对一个要跑十几分钟、调几十次工具的 agent,这是「能上线」和「一崩就白跑」的分界。 持久化也带来幂等的要求:恢复时可能重放一步,会动手的工具(下单、发邮件)要能识别「这步我做过了」,别重复执行。可恢复和不重复,是一对要一起设计的东西。

II

成本会失控 —— 预算和上限.

agent 循环天然烧钱:每一轮都是一次模型调用,跑偏的循环能在你不看时烧穿预算。 OWASP 把这单列为 LLM10 Unbounded Consumption。3注 3OWASP · Top 10 for LLM Applications(2025)· LLM10 Unbounded Consumption —— agent 循环天然会失控烧钱 / 算力;生产前必须设预算与上限。三道闸:max_steps(第二章就埋了)、每个任务的 token / 成本预算(超了就熔断)、以及用 prompt caching 把每轮不变的 system + tools 前缀缓存掉 ——cache read 只花基础输入 token 价的约 10%。2注 2Anthropic 文档 · Prompt caching —— 生产成本控制的一把手:缓存稳定前缀,cache read 仅约基础输入 token 的 10%。截至 2026-05。对一个每轮都重发同一份长 system 的 agent,这一项就能砍掉大半账单。 成本不是上线后才看的报表,是设计时就该有的上限。一个没有预算闸的 agent,等于把信用卡交给了一个会犯错的循环。

III

运维 —— 监控、告警、灰度回滚.

生产 agent 不是「上线就不管」,是持续运维。区别在于:出错了,你是先知道,还是用户先告诉你。 把第十章的 trace 接到生产监控上,盯三条线:成功率、成本、延迟。任意一条异常就告警 —— 成功率掉了、成本飙了,你要在用户投诉前知道。改 prompt、换模型这类改动,灰度上线(先放一小部分流量),留好回滚的路。2注 2Anthropic 文档 · Prompt caching —— 生产成本控制的一把手:缓存稳定前缀,cache read 仅约基础输入 token 的 10%。截至 2026-05。模型是会变的(厂商更新、你换版本),没有灰度和回滚,一次模型升级就可能悄悄让你的 agent 变笨。 这就引出生产 agent 真正的隐藏成本 —— 维护税。agent 不是「上线就一劳永逸」:它依赖的模型、API、工具都在变,光是维持它正常跑,据业界观察能吃掉三到五成的工程预算。4注 4Composio · 「Why AI Agent Pilots Fail in Production」(2026)—— 生产 agent 的「维护税」:模型 / API / 工具一直在变,据观察维持 agent 运行可吃掉三到五成工程预算;多数失败是治理失败(没定义成功、没熔断、没人审),不是技术失败。而且多数生产事故是治理失败,不是技术失败:没人定义「成功长什么样」,没有熔断,没有人审的触发点。所以上线前先答一个问题:这个 agent 值不值得你长期养,省下的人力够不够付这笔维护税? 维护税里最隐蔽的一笔,是你自己写的 workaround。每一个「绕过模型毛病」的补丁,都在 harness 里编码了一条假设 ——「模型做不到 X」—— 而模型在进步,假设会过期。Anthropic 把这条元教训写得很直白:「harness 编码的假设,会随模型进步而过时」。6注 6Anthropic · 「Scaling Managed Agents: Decoupling the brain from the hands」(2026-04-08)—— 把 agent 虚拟化为 session(append-only 日志)、harness(调模型、路由工具调用的循环)、sandbox 三件;容器(sandbox)因此成了可随时重建的「牲畜」,harness 与 session 才是持久的那部分;并写明元教训:「Harnesses encode assumptions that go stale as models improve」(harness 编码的假设,会随模型进步而过时)。一个具体的标本:Sonnet 4.5 是 Cognition 见到的第一个「知道自己上下文窗口」的模型 —— 临近上限它会「焦虑」,提前总结、抄近路收尾,哪怕其实还有大把余量;他们的缓解是在提示的头尾双端反复压制,外加一个歪招:开 1M token 的 beta 但只用到 200k,让模型以为余量充足,行为就正常了。7注 7Cognition · 「Rebuilding Devin for Claude Sonnet 4.5: Lessons and Challenges」(2025-09-29)—— 「context anxiety」的出处:Sonnet 4.5 是他们见到的第一个「知道自己上下文窗口」的模型,临近上限会提前总结、抄近路收尾,「哪怕其实还有大把余量」;缓解是双端激进提示,加「开 1M token beta 但只用到 200k」—— 让模型以为余量充足,行为即恢复正常。模型特异 workaround 的标本。这个补丁在下一代不焦虑的模型上就该删 —— 留着,它就成了没人敢动的迷信代码。所以两条纪律:给每个 workaround 标注它绕过的前提假设,一行注释就够;每季度、或每次换模型时,把这些假设拿出来重新质疑一遍,过期的删掉。 还有一层是「无人值守」本身的未知。有人把 agent 放进一个无任务、带持久记忆的持续循环里观察:18 次运行、6 个前沿模型,它们并不乱走,而是自发收敛出三种行为,且高度模型特异 —— 换一个模型,独处时的倾向就变。5注 5Szeider · 「What Do LLM Agents Do When Left Alone? Evidence of Spontaneous Meta-Cognitive Patterns」(2025,arXiv:2509.21224)—— 把 agent 放进无任务、带持久记忆的持续 reason+act 循环;18 次运行 × 6 个前沿模型,自发收敛出三种行为,且高度模型特异(有的模型每次都落入同一种)。长程自主的边界参考。所以放它长程自主之前,先知道你这台模型独处时会做什么;这也是为什么前面那些预算闸、人闸、trace 一个都不能省。 把「无人值守」再往前推一步,就是 2026 年已成主流形态之一的后台 agent:不开着终端盯,而是 fire-and-forget —— 任务派出去,它在云端沙箱里跑完,带着结果回来找你验收。Devin 这类产品、各家编码 agent 的云端形态都在此列。它的工程问题和你本地这台交互式助手不一样,Cognition 的 Walden Yan 在《The Age of Async Agents》里点得很具体:环境要预热 —— 把装好依赖、拉起服务的沙箱做成快照,任务来了直接恢复,而不是每次冷启动装十分钟;凭据要收窄 ——「那台机器上只放作用域最小的 secrets」,你不在旁边,泄露没有第二双人眼兜底;隔离要升档 ——「Docker 容器不是真正的安全边界」,跑不可信负载常要上真正的 VM,第七章那条强度谱在这里整体右移一格;验收要设计 —— 完成通知、对 diff 与运行证据的审查流:streaming 那章给用户的实时进度,在这里变成给验收者的事后证据。8注 8Latent Space · 「The Age of Async Agents」(Walden Yan · Cognition、Cole Murray · OpenInspect,2026-05-28)—— 后台 agent 的工程问题域:沙箱快照与 repo 预热(「任务回来时恢复沙箱状态」)、最小作用域凭据(「那台机器上只放作用域最小的 secrets」)、隔离上限(「Docker 容器不是真正的安全边界」,常需完整 VM)、以及 agent 回应自己 PR 评论的验收流。循环还是同一个心脏;两种形态的差别,全在这些外围件上。

IV

失败工程 + 网关:让每一次故障都有既定动作.

生产不是「不出故障」,是「每一种故障都有既定动作」。持久化管的是崩了能恢复;这一节管的是各种没崩但出问题的情况 —— 慢、错、限流、模型退化。 一套标准的可靠性动作,agent 一个都不能少:超时(每个工具、每次模型调用都要有上限,卡住的下游不能拖死整个循环)、重试带退避(瞬时错误退避重试,但要有次数上限 —— 呼应第三章「别无限重试」)、幂等(重试和恢复都可能重放一步,动手工具要能识别「我做过了」,第一节讲过)、熔断(一个下游连续失败就快速失败,别让每个请求都去撞那堵墙、把线程池耗光)、优雅降级(依赖挂了给一个退而求其次的答案,而不是整个崩掉)。这些不是 agent 专属,是分布式系统的老本行 —— 但 agent 把它们变得更要紧,因为一个循环里串了好几次外部调用,任何一次都可能是那个失败点。 加一样 agent 特有的:模型 fallback 路由。模型会被限流、会超时、会有一天突然退化。生产 agent 要能在主模型不可用时切到备用模型,而不是把错误抛给用户。这自然引出model gateway —— 在你的工作流和具体模型之间加一层:换模型、按成本/复杂度路由、统一记成本和限速,全在这一层做,工作流代码一行不改。这一层不是给 agent 独享的,它是下一章要讲的控制平面的一格 —— 每个 agent 都从它经过。 网关还负责拆一颗更隐蔽的雷:单一厂商假设。各家 API 的语义并不相同,而且不同在你以为相同的地方。缓存是最好的对照:Anthropic 要你显式打 cache_control 断点,cache read 约为基础输入价的 10%,TTL 5 分钟或 1 小时;2注 2Anthropic 文档 · Prompt caching —— 生产成本控制的一把手:缓存稳定前缀,cache read 仅约基础输入 token 的 10%。截至 2026-05。OpenAI 对超过 1024 token 的前缀「自动缓存、无需改代码」,折扣与存续期按模型代各不相同。9注 9OpenAI 文档 · Prompt caching —— 「对符合条件的请求自动生效,无需改代码」,前缀 ≥1024 token 起缓存,折扣与缓存存续期按模型代不同 —— 与 Anthropic 的显式 cache_control 断点、约 10% cache read 语义并不相同,是「缓存语义因厂商而异」的一手对照。截至 2026-07。工具调用的请求形状也各家各异 —— 第三章那两个 Tab 早就并排摆给你看过。这些差异不隔离在网关这一层,就会渗进工作流代码,攒成一笔隐性技术债:等你真要换模型 —— 降本、合规、或上一段那种 fallback —— 才发现「换」等于重写。所以两个动作趁早:provider 差异全部收进网关,工作流只面对「一个会调工具的模型」这个抽象;再把第十章的 golden set 乘上你在乎的几家模型,做成一张回归矩阵进 CI ——「换模型不等于重写」是要用矩阵持续证明的性质,不是网关装好那天就永久成立的性质。 还有成本的另一面 ——FinOps。第二节的预算硬闸防的是失控;FinOps 管的是日常经济性:按请求、按租户算成本,按成本与复杂度路由(简单任务别喂旗舰模型),用缓存和批处理压单价。企业里成本不是一个总数,是一张能按租户、按任务类型切开的账 —— 这样你才知道哪类任务在亏钱、哪个租户是噪声邻居。cost-of-pass(第十章)在这里再次出场:它给「这一层值不值」一个能横向比的数。 动手 · 把你的 agent 推到「敢上线」:
01

加一道预算硬闸

给单次任务设 token / 成本上限,超了就停并报错 —— 验证一个故意跑偏的循环会被熔断,而不是烧穿。
02

让一次被杀的运行能恢复

把任务状态持久化,跑到一半 kill 掉进程,重启后确认它从断点续、且没重复执行已做过的动手步骤。
03

接一条告警

对成本或失败率设一条告警,跑一周真实任务 —— 你现在有了一个能在你不看时还在你掌控里的 agent。

从 20 行的循环, 到你敢放它无人值守。.

From a 20-line loop to trusting it unattended..

Aklman Library

讨论

讨论.

评论区初始化中…