跳到主要内容

开发指南:实现可生产的 Agent Loop Runtime

七天实战

本篇对应你在 Loop Engineering 子站 「从实验到系统」的工程部分;实现时请同步对照 Hermes 开发指南 的工具链与 DSH 开发指南 的 Session/插件边界。

导读

快速开始解决了「能跑的 ReAct」。开发指南解决五件事:

  1. 六类循环的 实现契约(接口、状态、停止)。
  2. 失败模式库(可检索、可告警)。
  3. 与 Harness 的 清晰分层(谁熔断、谁审批)。
  4. 并发、重试、checkpoint 的工程选择。
  5. 如何把 Loop 做成可测、可灰度的模块。

一、Loop Runtime 的推荐模块边界

模块输入输出单测重点
TopologySelector任务卡元数据拓扑枚举规则表
StepEngine状态 + 事件新状态迁移完备
BudgetAccountantusage 事件是否耗尽边界值
StopJudge状态快照reason优先级
ObservationPipeline原始 tool_result压缩文本 + 指纹截断不丢关键错误
WriteBackGate候选记忆允许/拒绝过滤策略
Tracer事件持久化记录字段必填

原则:Prompt 可以脏,状态机必须干净。把「下一状态」从「模型说了啥」里剥离出来。


二、ReAct / Tool Loop 深化

2.1 消息协议冻结

选定一种并全局唯一:

协议适用解析风险
OpenAI tool_calls多数云 API
Hermes <tool_call>本地对齐模型中(需修复 JSON)
Claude tool_useAnthropic

Loop 层只吃 规范化后的 Action{name,args};解析失败算 fatal 或「要求模型重发」专用步(计入预算)。

2.2 并行工具调用

当模型一次返回多个 tool_calls:

策略行为风险
串行按数组顺序慢但简单
受限并行只读工具并行,写工具串行推荐默认
全并行同时打写冲突、竞态

2.3 重试策略(工具层 vs 循环层)

  • 工具瞬时失败(429、超时):Harness 内短重试(1–2 次),指数退避。
  • 逻辑失败(404、断言失败):不要盲重试;交给 Loop 改参或 Replan。
  • 禁止:对同一指纹无限「再试一次」。

三、Plan–Execute 实现要点

3.1 计划对象

{
"plan_id": "p3",
"version": 2,
"steps": [
{"id": "s1", "goal": "定位失败测试", "tools_allow": ["read_file", "run_pytest"], "done_when": "pytest_output_contains_FAILED"},
{"id": "s2", "goal": "最小补丁", "tools_allow": ["read_file", "edit_file"], "done_when": "diff_non_empty"}
]
}

状态字段:current_step_idplan_versionreplan_countstep_attempt

3.2 Replan 触发器

触发条件动作
签名停滞同 error_signature ≥ N升 plan_version
步骤超时单步 steps 超限标记 blocked → replan
用户改目标外部事件强制 replan
工具权限拒绝Harness 403可能直接 fatal

振荡检测:若 plan_version 在 A↔B 间来回,直接失败并请求人审。


四、Reflection 与 Evaluator–Optimizer

4.1 Reflection 契约

反思模型输出必须 schema 化:

{
"verdict": "revise",
"issues": [{"severity": "factual", "detail": "API 名称未在原文出现", "fix": "删除或补引用"}],
"must_fix": true
}

verdict=pass 才允许成功停止;revise 则把 issues 注入下一轮。max_reflect_rounds 默认 1–2。

4.2 Evaluator–Optimizer 双进程思维

即使跑在同一机器,也要 逻辑隔离

角色权限输入输出
Optimizer可写产物上轮分数+评语新候选
Evaluator只读产物 + 只读测试候选score + rationale

刷分检测:score 上升但关键业务指标不变 → 标记 metric_gaming 失败。

4.3 何时用规则评测 vs LLM Judge

目标类型推荐传感器
编译/测试/格式确定性脚本
文风、温和毒性LLM Judge + 抽样人工
安全性规则 + 专用分类器,慎用被优化器可见的弱 Judge

五、多 Agent 编排环

5.1 编排器职责

编排器(Orchestrator)不是「另一个爱聊天的 Agent」,而是 带策略的调度器

  • 维护全局目标与预算池(给子 Agent 配额)。
  • 定义 handoff schema。
  • 检测传球环(A→B→A)。
  • 决定并行还是流水线。

5.2 Handoff 载荷

{
"from": "researcher",
"to": "writer",
"artifact_refs": ["notes.md"],
"claims": ["框架X用显式 max_iterations"],
"budget_left": {"steps": 6, "tokens": 20},
"do_not": ["重新全网搜索已完成主题"]
}

缺少 artifact_refs 的 handoff 应拒绝——防止「口头交接」。

5.3 拓扑选择

模式结构适用
主管–工人星型任务分解清晰
流水线链式调研→写→审
黑板共享存储多专家填同一工件
自由讨论全连接默认禁止上生产

六、Memory Write-back 工程

6.1 写回管道

过滤规则示例:拒绝无来源事实;拒绝密钥/PII;拒绝与当前用户指令冲突的「偏好」。

6.2 读入策略

  • 标注 memory_idcreated_atconfidence
  • 过期记忆降权或隔离区。
  • 冲突时:当前用户指令 > 高置信记忆 > 低置信记忆

七、失败模式库(开发期必读)

ID名称症状缓解
L01空转续聊无 tool 且无进展空回合计数熔断
L02指纹死环同参工具反复fingerprint
L03计划振荡plan A/B 跳replan 图检测
L04上下文中毒长 obs 后胡言压缩+关键摘要
L05假完成自称 done外部验收
L06评测被俘改测试/讨好 judge权限隔离
L07预算单维步数未到 token 爆多维预算
L08传球环多 Agent 互踢handoff TTL
L09写回污染错记忆复用门禁+回滚
L10重试放大429 风暴抖动退避+全局限流
L11影子成功测过但未部署真环境环境标记
L12人审饿死审批队列堵死环超时降级策略

把 ID 打进 Trace stop.reason 与监控标签,值班才能「按编号」处理。


八、Checkpoint 与恢复

长任务必须支持从 step K 恢复:

  1. 每步结束序列化:messages 摘要、planbudget 剩余、artifacts
  2. 恢复时校验工具版本与权限版本(Harness bundle hash)。
  3. 不允许静默跳过已执行的有副作用步骤——需幂等键。

九、可测性:哪些要单测、哪些要评测集

层级方法例子
纯函数单元测试Budget、StopJudge、fingerprint
契约合约测试handoff schema、plan schema
循环行为仿真环境mock 工具返回固定序列
质量黄金任务集20 个任务的成功率/花费
安全红队诱导改测试、越权路径

仿真环境比「真打 API」更适合回归:把 tool 做成有限状态机,断言「必在 ≤N 步停止」且「不出现 L02」。


十、性能与成本工程

杠杆做法注意
模型分级规划用强模型,执行用小模型接口一致
缓存同 query 搜索缓存设 TTL
早停分数平台期退出防假早停
批并行只读调研并行写串行
摘要每 K 步折叠历史保留目标与约束

成本看板字段:cost_per_successsteps_p50/p95stop_reason 分布。只看成功率会鼓励「砸预算」。


十一、与框架的关系(选型表)

方案优势风险建议
自研 200 行 Runtime清晰、可教缺生态学习与中小生产首选
LangGraph 等状态图可视化、持久化抽象泄漏图复杂时用
厂商 Agents SDK集成快停止语义不透明外包时仍自建验收
纯 Prompt 链不可控仅原型

无论选啥,StopJudge 与 Budget 尽量留在你自己的模块,不要完全交给黑盒。


十二、开发检查单(PR 门禁)

  • 新增拓扑有状态图与失败模式 ID
  • Stop 优先级单测覆盖
  • Trace schema 有版本号
  • 写工具与评测权限分离
  • 有 mock 仿真回归
  • 文档更新任务卡字段
  • 默认预算在配置而非硬编码魔法数
  • 与 Harness bundle 版本联调记录

十三、工作实例:文档站点「自动更新 changelog」Agent

目标:根据 git diff 生成 changelog 条目并通过 lint。
拓扑:Plan–Execute + 规则 Evaluator(markdown lint)+ 单次 Reflection。
预算:steps=15、tokens=60k、shell=10。
停止:lint 通过且 diff 仅触及 changelog;若模型改其它文件 → fatal。

步骤拆解:

  1. git diff → 压缩为文件列表。
  2. 计划:分组变更 → 起草 → lint → 提交预览。
  3. 内环禁止 git push(Harness 拒绝)。
  4. Trace 挂到 CI artifact。

这个实例刻意「无聊」——生产 Loop 的价值往往在无聊任务的稳定性,不在 Demo 炫技。


十四、日志与隐私

Trace 默认 脱敏:API Key、邮箱、Cookie、用户隐私字段。提供 debug=true 仅在本地打开全量。写回记忆前再跑一次脱敏。违规写盘应在 Harness 层拦截并记 L09。

开发期用合成数据跑仿真,避免把真实客户对话当测试夹具长期滞留。

完成开发指南后,用 GitHub 项目导读 去真实仓库里「找 Loop」,再用 最佳实践 对照生产。