《AI Agent 高级编程》6.1 为什么需要持久化执行:崩溃/重启/长任务改造
Agent 一次任务要跑几十步、跨小时甚至跨天,进程一崩内存里的进度就全没了。本节用一个 append-only 日志把多步任务改造成可持久化执行:真跑一个在第 3 步硬崩溃的任务,第二次运行从日志跳过已完成步骤、只重放未完成部分,并用对照实验证明「有日志」比「从头重跑」少花模型调用。
tag
Agent 一次任务要跑几十步、跨小时甚至跨天,进程一崩内存里的进度就全没了。本节用一个 append-only 日志把多步任务改造成可持久化执行:真跑一个在第 3 步硬崩溃的任务,第二次运行从日志跳过已完成步骤、只重放未完成部分,并用对照实验证明「有日志」比「从头重跑」少花模型调用。
告警要少而准:给出覆盖成功率、P95 延迟、单 run 成本、工具错误率、队列积压的规则表,讲 SLO 与错误预算(99% 成功率每月可消耗多少失败)与连续窗口门槛为何能压噪声。真跑一个极简告警求值器,喂正常与劣化两段序列,打印触发判定;末尾给从告警定位到具体 run 与工具的演练脚本。
把 13.1 的 span 数据聚合成四类指标:延迟分位(P50/P95/P99)、成功率、每 run 成本、按工具名分组的错误率,讲清平均值为何被长尾骗、直方图与摘要的差别、以及 run_id 当标签会炸掉时序库的基数问题;给出四块看板布局。真跑 200 次模拟 run,打印分位表与错误工具 Top 榜。
把一次 run 变成 span 树:agent.run 下挂 model.complete 与 tool.call,用 contextvars 传递当前 span 建立父子关系,并行工具的 span 并列成兄弟;日志走 JSON 行,带 trace_id/run_id/workspace_id。OTel 只装了 API 未装 SDK,故用标准库实现最小 span 模型并对齐 GenAI 字段名。
pipeline、debate、voting 用固定脚本展示信息怎么流动,不比较真实模型质量。LatencyModel 延时也是人工模拟,不能当真实性能测量。AGREEMENT 是人工演示标签,不是计算出的真实一致率;多数票也可能同错。选择拓扑应基于任务、独立质量样本、总调用与真实延时,而不是这组固定结果。
MessageBus 是进程内顺序 pub/sub,按发布序号记录历史。它不是持久化消息队列,也不提供重试、确认或跨进程投递。同一 handler 失败会中断当前发布链;递归发布循环需调用方自行限制。worker 的同步调用移到线程不等于线程会被取消,同一个 worker 并发使用仍可能共享模型状态。
把单个 Agent 拆成 supervisor 与 worker:Worker 是一个带专用 system 提示与工具子集的 Agent(检索员、计算员),Supervisor 负责把目标拆成子任务、派给合适的 worker 并汇总结果。用假模型脚本化一次路由决策,真跑「拆成子任务、各自执行、汇总」的完整流程并打印派发与回收,给出单 Agent 与 supervisor-worker 的取舍表。
按领域与学习阶段整理的在线电子书与创作手记。覆盖 Rust、Lua、TypeScript、Python、Java(Spring Boot)、Go、AI Agent、MMO 服务器开发(Go 主线 + Java 21 双栈对照,四卷本 180 篇)、游戏开发(含 Cocos 四卷本与《游戏引擎实现原理》四卷本)、SLG 游戏产品设计(产品架构与经济系统 + 数值平衡与商业化运营,两卷本 100 篇)、小游戏开发实战(市场品类与产品设计 + 引擎实现与体验打磨 + 上线变现与长线运营 + 商业运营实战 + 跨平台发行与出海,五卷本 250 篇)、游戏美术与技术美术(美术制作与视觉规范 + 技术美术与管线工程 + 风格与品类美术实战,三卷本 150 篇)、游戏设计(玩法机制与可执行规格 + 策略、涌现与体验度量 + 原型、可玩性与品类,三卷本 150 篇)、计算机图形学(几何、变换与光栅化 + 着色、光照与纹理 + 光线追踪与全局光照,三卷本 150 篇)、叙事策划与叙事工艺(叙事结构与可执行规格 + 叙事引擎与分支系统 + 叙事体验与路径度量,三卷本 150 篇)与文学创作,从阅读指南进入,或按全书目录查找章节。
打开本机 claude-agent-sdk 0.2.165 源码读 subagent 与 hook 调度:subagent 是 asdict 后的 AgentDefinition 随 initialize 送到 CLI,hook 注册成 callback_id,由 CLI 反向发 control_request 回调 Python。附 inspect 核对与 TS SDK 对照。
打开本机 pydantic-ai 2.55.0 源码读 run 循环:Agent 不是 while,而是 GraphBuilder 拼出的状态机(UserPromptNode→ModelRequestNode→CallToolsNode)。结构化输出校验失败抛 ModelRetry,_build_retry_node 造一个带 RetryPromptPart 的新请求节点。附真实重试调用链。
打开本机 langgraph 1.2.14 的源码读图执行器:StateGraph.compile 产出 CompiledStateGraph,PregelLoop 的 tick/after_tick 一轮就是一次超步,超步之间只做通道合并;每个超步结束调用 _put_checkpoint,检查点按 thread_id 落进 Checkpointer。
评测跑完只打印一张表,不会拦住任何东西。本节把评测变成质量门:与基线比对,总体指标掉超阈值、或某条样本由 PASS 变 FAIL,就让流水线 exit 1。真跑先验证「与基线持平」退出码 0,再注入「关掉引用产出」的退化使质量门失败退出码 1,打印逐样本差异,最后给出 GitHub Actions 接入形态(注明未在本机执行)。
CI 里调真模型不确定、要钱、要网络、会限流。本节把一次模型交互的请求与响应存成夹具,回放时按请求指纹匹配取响应:本机按 Anthropic Messages API 结构手工构造三条夹具真跑一遍完整 run,连跑两次逐字一致;再改问题制造夹具失配,验证回放器报错而非静默给错响应,最后给出夹具的存放与更新流程。
本节给 ResearchCopilot 建一个可版本化的评测集:JSON 存问题、期望要点与必须引用的来源,配套「加样本写理由、改期望留痕」的维护纪律;实现成功率、引用准确率、成本三个评分器,对 10 条样本真跑并打印逐条得分与汇总,最后给出自动打分与人工评审的分界表。
HumanGraph 用于本节单后继人工流程,与 WaveGraph 分开。暂停发生在敏感节点前;演示只记录模拟邮件参数,不向外部发送消息。状态与 token 只保存在本进程,示例调用方可信。真实审批需要验证身份、绑定不可篡改的操作参数、持久化一次性批准及恢复记录,不能把普通 dict/token 直接暴露到公网。
本节保留单后继 Graph,另写 WaveGraph 表达 fan-out。波内节点顺序执行,因此共享状态更新有顺序,不是线程并行。条件路径必须与 join 的要求一致;某前驱被条件跳过而永不到达时,本例会报缺失前驱。动态分支取消、跨轮关联、部分成功合并需要更完整调度协议。
循环式 Agent 适合开放式任务,但固定流程需要显式结构。本节手写 minagent 的最小图引擎:Node(名字加一个函数)、Edge(源到目标、可带条件)、Graph(add_node/add_edge/set_entry/run),节点间用 dict 状态传递数据。用假模型真跑一条分类→检索→综合的三节点线性链,打印每个节点的进出 state,并给出图编排与循环式 Agent 的取舍表。
用实际 minagent 交付、PydanticAI FunctionModel 与 smolagents CodeAgent 对照同一个离线检索任务,提供完整文件及重复运行断言;调用次数不替代质量、成本或性能实测。
smolagents 的 CodeAgent 让模型直接写 Python 代码来行动,而不是吐结构化工具调用。本节现场核对 1.26.0 的 API,用本地假模型驱动 CodeAgent 离线真跑,并实测 CodeAgent 与 ToolCallingAgent 在工具可见性上的差别。
OpenAI Agents SDK 用三个原语组织 Agent:handoff 委派、guardrails 护栏、tracing 追踪。本节现场核对 0.23.1 的 API 表面,离线跑通护栏函数与 span 捕获,并和卷一 minagent 的 supervisor/worker 模式逐一对照。