—— 委托策略与失败降级)
【Agent工程】9—— 委托策略与失败降级文章目录【Agent工程】9—— 委托策略与失败降级1. 子卡片之外还要定委托策略1.1 策略与提示词的分工2. 串行与并行委托的选型2.1 并行只读的安全条件2.2 串行链路上的中间产物3. 主卡片上的委托策略字段3.1 策略码与验收对齐3.2 策略模板与子卡片模板4. 子 Agent 失败后的决策4.1 降级字段写入终态4.2 可重试与不可重试错误5. 预算扣减归属5.1 max_delegations 与重试的区别5.2 协调开销6. 贯穿示例工单升级串行与 notify 降级6.1 并行只读的反例6.2 human_takeover 与 degraded 的选用7. 可运行示意策略执行与降级7.1 子任务重试与 on_failure7.2 并行只读合并8. 与验收和 trace 对齐8.1 与第 7 篇状态机衔接8.2 评测集建议用例9. 四个常见误区9.1 与第 6 篇 pending 的衔接10. 适用边界10.1 从第 8 篇迁移10.2 观测指标10.3 配置评审清单11. 术语速查12. 小结与下一篇摘要第 8 篇固定了子 Agent 分工与委托子卡片边界。子卡片解决「能做什么」本篇解决「怎么委托、失败怎么办」。主卡片应声明串行或并行、重试上限、预算扣减归属与降级策略子 Agent 失败时不应拖死主链路。贯穿示例继续用工单助手。适合读完 【Agent工程】8—— 子 Agent 分工与委托边界、准备把多 Agent 协调写成可配置策略的工程师。读完可以独立完成为主任务配置 delegation 策略并实现子失败后的降级路径。1. 子卡片之外还要定委托策略第 8 篇的委托子卡片收窄了工具、scope 与 budget但主 Agent 仍要回答三个运行时问题多个子任务按什么顺序跑——串行还是并行子 Agent 失败是否重试、重试几次、扣谁的 budget重试耗尽后主任务如何继续——降级、人工还是失败结案这些答案不应散落在提示词里而应写入主卡片的delegation委托策略块与 allowed_tools、acceptance 同级。策略是编排层的配置不是模型临场发挥。前文见 【Agent工程】7—— 单 Agent 任务闭环、【Agent工程】8—— 子 Agent 分工与委托边界。本篇在子卡片边界之上补协调与失败处理。1.1 策略与提示词的分工提示词可以描述「先改优先级再起草通知」的业务顺序但是否允许并行、失败重试几次、降级字段叫什么必须由 delegation 配置固定。否则模型会在失败后自行「再试一次」或口头宣布降级审计与验收无法对齐。2. 串行与并行委托的选型模式适用不适用串行 serial后一步依赖前一步输出写操作有顺序无依赖的只读可并行时硬串行并行 parallel多个只读子任务、结果可独立合并多个写同一 ticket_id工单升级默认串行先update_ticket_priority再签通知起草子卡片再主链路 pending。若并行跑「改 priority」与「起草 notify」可能出现文案基于旧 priority 起草的竞态。串行模式下主 Agent 应在 artifacts 中记录每一步完成时间戳与输出摘要方便复盘「notify 起草时 priority 是否已可见」。时间戳不必暴露给模型但应写入 trace 供运维查询。2.1 并行只读的安全条件并行委托前检查子卡片均为只读max_write_calls0scope 无写交集或写 scope 均为空有merge_policy合并策略例如按 sub_id 合并字典、冲突时报错不满足以上条件时编排器应拒绝 parallel回退 serial。2.2 串行链路上的中间产物串行委托时前一步输出应写入主 context 的artifacts中间产物后一步子卡片通过引用读取而不是让模型从聊天里「回忆」上一步结果。例如 notify 起草子 Agent 读取artifacts.priority_updatedtrue与工单快照减少上下文漂移。3. 主卡片上的委托策略字段示例{delegation:{mode:serial,max_delegations:3,sub_tasks:[{sub_id:notify-draft-1,template:notify_draft,max_retries:1,retry_budget_from:sub,on_failure:degrade_notify}],merge_policy:sequential_append}}字段含义modeserial 或 parallelmax_delegations主任务最多签发几次子 Agentmax_retries该子任务失败后重试次数retry_budget_from重试扣主budget 还是子budgeton_failure重试耗尽后的策略码merge_policy并行时如何合并子结果on_failure建议用枚举策略码例如degrade_notify、abort_main、human_takeover。编排器根据码写入final_state降级字段供第 3 篇验收读取。3.1 策略码与验收对齐主卡片 acceptance 应显式允许或拒绝降级例如{acceptance:{priority_equals:urgent,notify_required:true,allow_notify_degraded:true}}若allow_notify_degradedfalse则on_failuredegrade_notify后总验收仍应失败避免「策略允许降级、验收却不认」的双标。3.2 策略模板与子卡片模板sub_tasks里可用template指向预置子卡片模板如notify_draft运行时填入具体 scope 与 budget。模板统一 max_retries 与 on_failure避免主 Agent 每次手写不一致策略。模板变更应走配置评审与注册表变更类似。4. 子 Agent 失败后的决策推荐顺序可重试错误超时、限流在max_retries内重签同构子卡片不可重试错误scope 拒绝、工具禁用直接进入on_failure重试耗尽执行on_failure不再 spawn 新子 Agent子 Agent 的failed不等于主任务failed。主 Agent 根据策略码决定 degraded 或 abort。4.1 降级字段写入终态on_failurefinal_state 建议字段degrade_notifynotify_degradedtrue,notify_fail_reasonabort_mainstatusfailed, 保留子 tracehuman_takeoverawait_manualtrue, 附子结果摘要降级必须可验收、可审计不能只改对话文案。4.2 可重试与不可重试错误错误类型retryable说明超时、429 限流是在 max_retries 内重试scope_violation否直接 on_failure 或 abortdisabled_tool否配置问题重试无意义子 budget 用尽否换策略或降级不无限签新子卡片错误分类应集中在网关层映射不要交给模型判断「要不要再试一次」。5. 预算扣减归属retry_budget_from行为sub重试只扣子卡片剩余步数主 budget 不变main每次重试也扣主 budget防止子 Agent 用重试拖垮主链路split首次扣子重试扣主常用折中主 Agent 签发子卡片时应记录{budget_snapshot:{main_remaining_steps:7,sub_allocated_steps:4}}汇总 trace 时核对主步数 各子步数 ≤ 主卡片初始上限允许配置少量协调开销。5.1 max_delegations 与重试的区别max_delegations不同 sub_id 或重新拆子任务的次数max_retries同一 sub 模板失败后的重复执行次数两者都要封顶。否则主 Agent 可能在「换名重试」绕过 max_retries。5.2 协调开销主 Agent 拆任务、merge trace、跑总验收也消耗步数。主 budget 应预留coordination_reserve协调预留例如总步数 12 中预留 2 给编排其余再分给子 Agent。子 Agent 不应默认占满主 budget 的全部余额。6. 贯穿示例工单升级串行与 notify 降级步骤策略行为1modeserial改 priority 完成后才签 notify-draft 子卡片2子 Agent 起草失败max_retries1重试一次仍失败3on_failuredegrade_notify写入notify_degradedtrue4主 Agent 不再 pending notify进入总验收5priority 通过、notify 走降级项 → statusdegraded值班仍可在人工队列补发通知系统状态诚实反映「自动链路未完成 notify」。6.1 并行只读的反例若主 Agent 并行派两个只读子任务「查 T-1024」「查关联 T-2048」merge_policy 合并两份快照后供起草使用。任一子任务失败时可降级为「仅基于 T-1024 起草」并在 trace 记录缺失的子结果。6.2 human_takeover 与 degraded 的选用场景更合适策略通知文案起草失败、priority 已改degrade_notify子 Agent 越权或数据不可信human_takeover主目标未达成且无降级口径abort_main策略码选错会导致值班流程混乱该降级的进了人工队列该人工的却被标成 degraded 自动关单。7. 可运行示意策略执行与降级7.1 子任务重试与 on_failurefrom__future__importannotationsfromtypingimportAnydefrun_sub_with_policy(sub_spec:dict[str,Any],run_sub_once:callable,)-dict[str,Any]:对单个子任务按 max_retries 执行耗尽后返回 on_failure。max_retriessub_spec.get(max_retries,0)attempts0last_errorNonewhileattemptsmax_retries:resultrun_sub_once()ifresult.get(ok):return{ok:True,result:result,attempts:attempts1}last_errorresultifnotresult.get(retryable,False):breakattempts1return{ok:False,on_failure:sub_spec.get(on_failure,abort_main),last_error:last_error,attempts:attempts1,}defapply_on_failure(policy:str,final_state:dict[str,Any],sub_error:dict[str,Any],)-dict[str,Any]:ifpolicydegrade_notify:final_state[notify_degraded]Truefinal_state[notify_fail_reason]sub_error.get(reason,sub_failed)return{status:degraded,final_state:final_state}ifpolicyabort_main:return{status:failed,final_state:final_state}ifpolicyhuman_takeover:final_state[await_manual]Truereturn{status:await_manual,final_state:final_state}return{status:failed,final_state:final_state}if__name____main__:spec{sub_id:notify-draft-1,max_retries:1,on_failure:degrade_notify,}calls{n:0}defflaky_sub():calls[n]1ifcalls[n]2:return{ok:False,retryable:True,reason:timeout}return{ok:True,draft:升级原因产线停机}outrun_sub_with_policy(spec,flaky_sub)ifnotout[ok]:finalapply_on_failure(spec[on_failure],{priority:urgent},out[last_error])print(final)assertfinal[status]degraded7.2 并行只读合并defmerge_parallel_readonly(results:list[dict[str,Any]],merge_policy:str,)-dict[str,Any]:ifmerge_policy!dict_merge:raiseValueError(unsupported merge_policy)merged:dict[str,Any]{}foriteminresults:ifnotitem.get(ok):continuedataitem.get(data)or{}overlapset(merged)set(data)ifoverlap:raiseValueError(fmerge conflict on keys:{overlap})merged.update(data)return{ok:True,data:merged}if__name____main__:parallel_results[{ok:True,sub_id:read-1024,data:{ticket_1024:{priority:high}}},{ok:True,sub_id:read-2048,data:{ticket_2048:{priority:low}}},]print(merge_parallel_readonly(parallel_results,dict_merge))生产环境应将retryable与 HTTP/工具错误码映射表维护在配置中避免模型判断是否重试。联调时建议用同一主卡片跑四条路径子一次成功、子重试后成功、子耗尽走 degrade、parallel merge 冲突。四条轨迹的 status 与 final_state 应可回归断言。8. 与验收和 trace 对齐总验收除第 8 篇 delegations 检查外建议增加检查点期望retry_count不超过 sub_spec.max_retrieson_failure 落地final_state 含对应降级字段degraded 一致性statusdegraded 时 acceptance 允许降级并行 merge无未处理的 merge conflictartifacts 传递串行后步可读前步产物trace 建议记录attempts、on_failure是否触发、retry_budget_from实际扣减。8.1 与第 7 篇状态机衔接子失败触发degrade_notify后主 status 应从 running 转入 degraded而不是停在 running 等人工猜。await_manual 与 degraded 区分清楚前者自动项已过、缺人工后者自动项含降级通过。8.2 评测集建议用例用例断言子超时重试 1 次后成功attempts2, statusdone子重试耗尽notify_degradedtrueparallel 只读 merge 冲突编排器报错不 silent 覆盖allow_notify_degradedfalsedegraded 策略仍导致总验收失败9. 四个常见误区误区典型表现更稳妥的做法并行写同一对象两子 Agent 改同一 ticket写操作串行重试无上限成本线性涨max_retries budget失败不降级主链路卡死on_failure 写终态子失败仍标 done验收失真status 由总验收驱动还有一种隐蔽做法每次失败换 sub_id 绕过 max_retries。应把重试计数挂在template或parent sub 逻辑键上而不是仅看 sub_id 字符串。9.1 与第 6 篇 pending 的衔接on_failuredegrade_notify 只影响「是否自动发通知」不替代 pending 机制。若子起草成功、主 Agent 仍要走 notify pending策略上应先完成子任务再进入第 6 篇高危写确认。降级的是「通知未自动完成」不是跳过审批链。10. 适用边界本篇方法适合已使用子卡片与 delegation trace需要明确失败与降级契约主任务要在子失败时仍可结案degraded本篇不覆盖跨服务分布式事务与 Saga——需单独事务设计子 Agent 再委托的多层链——后续篇目运行时队列、限流——运行时单元展开策略字段应先在小流量工单场景验证再推广到批量任务。10.1 从第 8 篇迁移主卡片增加delegation块默认 modeserial、max_retries0为一个子任务配置 on_failuredegrade_notify观察 degraded 验收再开 parallel 只读试点配好 merge_policy每加一种模式评测集加一条对应失败/降级用例。10.2 观测指标指标用途子任务重试率策略是否过松on_failure 触发次数降级是否过多parallel merge 冲突率并行条件是否过宽degraded 占比业务是否接受指标从 delegation trace 汇总便于与第 7 篇闭环指标一起看。10.3 配置评审清单上线新 delegation 策略前建议核对项问题mode是否存在写并行on_failure是否与 acceptance 一致max_retries是否与 retry_budget_from 匹配merge_policy并行冲突是否可观测评测集是否覆盖降级路径11. 术语速查术语含义委托策略 delegation主卡片上关于串并行、重试、降级的配置modeserial 或 parallelon_failure子任务重试耗尽后的策略码retry_budget_from重试时扣主或子 budgetmerge_policy并行子结果合并规则degrade主任务降级结案终态带降级标记12. 小结与下一篇第 8 篇定边界本篇定策略mode默认 serial并行仅限只读且可 mergemax_retries与on_failure成对配置耗尽必落地终态retry_budget_from明确扣减归属防止成本失控验收承认或拒绝降级与策略码一致下一篇继续编排单元失败重试的幂等约束、同一工具多次调用的安全边界与工具面、运行时衔接。编排单元三篇79可对照记忆第 7 篇定单 Agent 闭环阶段第 8 篇定子卡片权限子集本篇定串并行、重试与降级策略。缺任一层多 Agent 系统要么回退单 Agent要么在失败时行为不可预测。系列导航上一篇【Agent工程】8—— 子 Agent 分工与委托边界下一篇【Agent工程】10—— 失败重试与幂等边界撰写中