把整段流程一次性交给 StepAmoo 跑完,问题不在于模型能力,而在于出错时没人拦、事后没人能说清哪一步跑偏。更稳的做法是把任务切成两种段:连续执行段交给 StepAmoo 自动跑,人工确认段只留在少数几个卡点上,每一步都写一条中间记录。这样人工介入次数可控,复盘也能按记录指到具体节点。
可行分工:不产生外部影响的步骤连续自动执行,只在不可逆、对外发送、影响他人数据这三类节点停下来等人工放行;每个节点写入一条含步骤名、输入摘要、输出摘要、时间、确认状态的记录。复核时拿记录与执行计划比对,先查漏步和错序,再看输出摘要与确认人。边界是:摘要记录不能替代原始数据,人工放行也不等于人工复核了结果的正确性。
把流程切成执行段与确认段
先按业务动作把任务拆成节点,再给每个节点标一个执行方式。下面是一条通用链路,节点名换成自己任务里的名称即可,标“自动”的节点可以连续跑,标“人工”的节点必须停住等确认。
- s1 读取源数据:只读拉取,不回写任何系统 → 自动
- s2 清洗与去重:字段规整、重复项合并 → 自动
- s3 分类与判断:打标签、判优先级 → 自动(首次上线建议人工抽看一小批样本)
- s4 生成处理结果:产出草稿、建议或待写数据 → 自动
- s5 规则校验:必填项、取值范围、条数与输入是否对得上 → 自动
- s6 人工放行:看摘要和样本,决定是否继续 → 人工
- s7 写入或对外发送:提交到外部系统、发给他人 → 自动,但只认 s6 的放行结果
- s8 归档并生成运行摘要:写记录、拼出本轮清单 → 自动
切分的关键是让连续段尽量长、卡点尽量少。s1 到 s5 之间不触碰外部系统,可以一口气跑完;整条链路里真正需要人看屏幕的只有 s6 一处。如果发现自己每隔一步都要确认,通常说明任务拆得太碎,或者自动段里混进了写操作,先把写操作挪到卡点之后。
标出必须人工放行的节点
判断一个节点要不要人工接手,用三条标准,命中任意一条就设卡点,都不命中的直接自动执行:不可逆(删除、覆盖、提交后无法撤回)、对外发送(消息、邮件、工单回复会到达组织外部或客户手里)、影响他人数据(改写别人负责的字段、变更共享表、触发他人流程)。
反过来说,只在内部产生中间结果、随时可以重跑的步骤,不值得设卡点。把卡点放在 s7 之前而不是 s7 之后,是因为 s7 一旦执行就进入上面三类里的至少一类。
节点分工可以写在计划文件里,StepAmoo 出计划时带上这段标记,人工确认时只读这一段就知道该看什么:
plan_id: feedback-batch
steps:
- id: s1_read
mode: auto
- id: s3_label
mode: auto
sample_check: true # 首轮人工抽看样本
- id: s7_send
mode: human
reason: 对外发送
require: [s3_label.output, s5_check.output]
approve_scope: 本批次条数与收件范围执行前先确认两件事:reason 字段写的是上面三条标准里的哪一条,approve_scope 写的是人这一眼到底批了什么范围。范围写不清,放行就变成形式。
给每步留一条可回看的记录
中间结果不能靠记忆。建议每完成一个节点追加一条记录,一行一个节点,格式统一,不要等到任务结束才汇总:
{
"plan_id": "feedback-batch",
"step_id": "s3_label",
"step_name": "分类与判断",
"mode": "auto",
"input_digest": "sha256:xxxx | 条数 128 | 字段 id/text/channel",
"output_digest": "sha256:xxxx | 命中 3 类 | 未命中 9 条",
"started_at": "<ISO8601>",
"ended_at": "<ISO8601>",
"confirmed_by": null,
"parent_step": "s2_clean"
}几个约定值得先定下来:输入输出都存摘要加少量摘录,不存全文,摘录要够判断“数对不对、形对不对”;时间统一时区,否则跨天记录会排错序;人工节点把 confirmed_by 和放行范围写上,自动节点留 null;parent_step 保住链路关系,缺了它后面查错序会很吃力。
隔天按记录定位偏差
复盘时不要从“感觉它做得不对”开始,而是拿记录和计划对一遍。计划里有节点清单,记录里有实际执行的 step_id 序列,两者一比,偏差通常落在三类里:
- 漏步:计划有、记录里没有。用集合差查最快:
comm -23 <(jq -r '.steps[].id' plan.yaml | sort) <(jq -r '.step_id' run.jsonl | sort -u)。常见的漏是校验类节点被跳过,或者人工节点实际上没人确认过。 - 错序:节点都在,但顺序和计划不一致。把记录按
started_at排一遍,与计划顺序对照,重点看“先发送后校验”“先写回后打标”这类颠倒。 - 输出不符预期:顺序对、步骤全,但结果不对。这时直接读该节点的
output_digest摘录,比如条数从 128 变成 137、未命中项从 9 条变成 40 条,说明问题出在这个节点本身,而不是最后一环。
三类偏差分开查,能把“笼统归因于模型不行”拆成可处理的动作:漏步补配置,错序改依赖声明,输出不符预期则回到该节点调输入或调提示词。记录只做定位用,真要查明原因还得回到该节点的原始输入,所以摘录里那几个数字要留准。