实践

如何设计一个可维护的自动化 Agent 工作流

把任务分流、状态、工具权限、执行记录和失败升级设计成一套可续接的执行系统。

作者:黄撑 更新于 2026-07-26
本文目录 5 节 · 点击展开

自动化 Agent 最容易失控的原因,不是模型不够聪明,而是任务、状态、工具权限和失败处理混在了一起。这篇文章把它们拆成一套执行控制系统:先分流,再记账;先授权,再执行;每一步都可验证、可追踪、可续接。

AGENT EXECUTION SYSTEM · FIELD GUIDE一个可维护的工作流,不靠记住所有步骤,而靠让每个状态都有去处。
  1. 01 任务分流
  2. 02 状态账本
  3. 03 工具边界
  4. 04 闭环记录
  5. 05 失败升级

先让任务走进正确的执行通道

同一个“帮我处理一下”的请求,可能只是一次可逆的小修,也可能会跨多个阶段、产生外部副作用。先决定流程重量,才能避免小任务被流程拖慢,也避免大任务靠对话记忆硬撑。

01 · TASK ROUTING

先决定流程重量,再开始执行

工作流不是越完整越好。用任务规模、状态风险和副作用三个信号,选择刚好够用的执行方式。

新任务进入
Q1 · 规模 能否在一个清晰动作里完成并验证? 例如补一句文案、修一个样式、改一个局部判断。
Q1 = 是 ROUTE A

直接执行

不为了“小事”制造额外状态。

  • 最小改动
  • 局部验证
Q2 · 状态 是否必须分阶段推进,且中断后难以只靠当前上下文续接? 跨文件本身不等于高状态风险;关键是任务能否分段验收,以及是否需要稳定记录下一步。
Q1 = 否 · Q2 = 是 ROUTE C

建立 TASK.md

把每次继续执行所需的事实外置。

  • 阶段与进度
  • 风险与验收
Q1 = 否 · Q2 = 否 ROUTE B

轻量 brief

用一页目标、边界和验证点,保持执行可读。

  • 目标明确
  • 不留长期负担

这不是审批流程。它只回答一个问题:为下一次继续执行,必须留下多少状态? 能局部验证的任务直接做;有少量协作但不依赖长期状态的任务写 brief;只有必须分阶段验收、会中断续接或需要稳定记录风险与下一步时,才建立 TASK.md。文件多不等于一定要建状态文件。

用状态账本让大任务可以暂停后继续

TASK.md 不是聊天记录,也不是把每个念头都存下来。它是执行状态的事实来源:记录目标、当前位置、下一步和仍未关闭的风险。续接时仍要读取当前代码、项目规则和 git diff,确认外部事实没有在任务中断期间变化。

02 · STATE LEDGER

把“记忆中的进度”变成可交接的状态

适用于迁移、重构、规则调整、批处理和任何不能一次完成的任务。

输入任务目标

最终效果、范围和验收标准。

当前执行阶段

当前阶段、已完成动作、下一步。

边界风险待确认

不可逆动作、依赖和人工判断。

输出验收记录

实际改动、验证方式与遗留项。

TASK.md execution state ledger
目标 / 验收完成后怎样算对阶段 / 进度现在在第几步,下一步是什么
续接基线重读当前代码、规则与 diff风险 / 待确认哪里必须停下来确认
更新节奏:每完成一个可验收阶段再写入账本,而不是等整件事结束才回忆发生过什么。

小改一个函数、删几行规则或补一处文案时,不要为了“规范”新建状态文件。状态文件本身也有维护成本;它只应在任务会中断、会分批或会被他人接手时出现。

把模型判断和工具副作用放在两层

Agent 可以规划、比较和解释,但工具应该只做边界清晰的确定动作。真正可维护的设计,不是把工具包装得越来越深,而是让每次调用都回答四件事:谁授权、输入是什么、写到了哪里、结果怎样验证。

03 · AUTHORITY SPLIT

判断可以灵活,执行必须可追踪

把“思考”和“产生副作用”拆开,才能定位失败,也能限制自动化越权。

AGENT LAYER

模型负责形成可审查的计划

  • 归纳输入和上下文
  • 选择流程和工具
  • 标出不确定性与人工确认点

输出应是明确意图,而不是隐式副作用。

意图参数授权
TOOL LAYER

工具负责可验证的原子动作

  • 读取、写入、点击、发送、落盘
  • 返回结构化结果与错误
  • 保留动作对象和执行时间

工具不替模型猜业务,也不静默吞掉异常。

所有副作用:记录动作并验证真实结果既有授权内:可修改文件或本地落盘,不重复请求确认额外确认:越权、外部发送、批量高风险或不可逆操作

例如,网页自动化不要只返回“已完成”。它至少应返回目标元素、实际动作、页面反馈和异常信息;文件写入也要返回路径、变更摘要和可复核的结果。这样日志才是在描述事实,而不是在给成功贴标签。

每次执行都要形成一条可复盘的闭环

执行闭环的关键不是增加更多步骤,而是让每个阶段的输出成为下一阶段的输入。结果未验证时,它只是候选结果,不能被当作完成;需要人工判断时,工作流必须显式停在闸门前。

04 · EXECUTION LOOP

从请求到记录,不留“已经做了什么”的黑箱

这条轨道可以用于浏览器、文件、数据处理和内容生成等不同工具。

01读取目标、上下文、约束
02计划动作、边界、预期结果
03执行调用一个可定位的工具动作
04验证检查真实结果,而非调用成功
05记录写回状态、日志和下一步
验证不通过回到计划,缩小假设或切换工具验证通过记录事实,再进入下一阶段

一个实用的日志条目不必很长:任务 ID → 工具动作 → 对象 → 结果 → 验证证据 → 下一步。保持格式稳定,才便于后续检索、排错和人工复核。

失败不是结束,而是一次有分级的升级

错误信息不等于失败处理。真正的失败处理要先隔离影响,再决定能否重试、能否回退,还是应该把带上下文的判断交给人。批量任务尤其不能把“一个失败”扩大成“整批状态不明”。

05 · FAILURE ESCALATION

先守住状态,再决定重试、回退或交给人

每条失败路径都要有明确落点,避免异常被装饰器、重试循环或模糊提示吞掉。

事件工具返回异常或结果验证失败

先记录任务、对象、错误和已完成范围。

可重试?短暂网络、页面加载、限流

有限次数重试;每次记录条件与结果。

重试
可回退?已授权且可逆的局部动作

按明确对象执行回退并再次验证,不扩大修改或删除范围。

回退
需人工?业务判断、越权或不可逆影响

带上证据、选项和建议,而不是只报错。

人工确认
批量任务的隔离原则逐项处理就逐项落盘;整批处理就明确批次边界。失败项必须可重放,成功项不能因重试而重复执行。

最终,工作流的可靠性不来自“永不失败”,而来自失败时仍能说清:影响到什么、留下了什么状态、下一步由谁处理。

TAKEAWAY把自动化当成一套执行系统:任务有路由,状态有账本,工具有权限,结果有证据,失败有出口。