
当Agent还在"边想边做"时,聪明的工程师早已把"想"和"做"拆成了两个车间——这就是智能调度Agent的终极秘密:计划与执行解耦,不是架构炫技,而是工程生存的必修课。本文将带你穿透第7章的核心脉络,看清为什么"先规划后动手"能让你的Agent从"人工智障"进化为"智能管家",以及这套方法论如何重塑你的AI应用开发思维。
#mermaid-svg-DKQIcTQmtR0tbTBA{font-family:Microsoft YaHei;font-size:14px;fill:#fff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DKQIcTQmtR0tbTBA .error-icon{fill:#96CEB4;}#mermaid-svg-DKQIcTQmtR0tbTBA .error-text{fill:#69314b;stroke:#69314b;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DKQIcTQmtR0tbTBA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DKQIcTQmtR0tbTBA .marker{fill:#4ECDC4;stroke:#4ECDC4;}#mermaid-svg-DKQIcTQmtR0tbTBA .marker.cross{stroke:#4ECDC4;}#mermaid-svg-DKQIcTQmtR0tbTBA svg{font-family:Microsoft YaHei;font-size:14px;}#mermaid-svg-DKQIcTQmtR0tbTBA p{margin:0;}#mermaid-svg-DKQIcTQmtR0tbTBA .label{font-family:Microsoft YaHei;color:#fff;}#mermaid-svg-DKQIcTQmtR0tbTBA .cluster-label text{fill:#69314b;}#mermaid-svg-DKQIcTQmtR0tbTBA .cluster-label span{color:#69314b;}#mermaid-svg-DKQIcTQmtR0tbTBA .cluster-label span p{background-color:transparent;}#mermaid-svg-DKQIcTQmtR0tbTBA .label text,#mermaid-svg-DKQIcTQmtR0tbTBA span{fill:#fff;color:#fff;}#mermaid-svg-DKQIcTQmtR0tbTBA .node rect,#mermaid-svg-DKQIcTQmtR0tbTBA .node circle,#mermaid-svg-DKQIcTQmtR0tbTBA .node ellipse,#mermaid-svg-DKQIcTQmtR0tbTBA .node polygon,#mermaid-svg-DKQIcTQmtR0tbTBA .node path{fill:#FF6B6B;stroke:#FF6B6B;stroke-width:1px;}#mermaid-svg-DKQIcTQmtR0tbTBA .rough-node .label text,#mermaid-svg-DKQIcTQmtR0tbTBA .node .label text,#mermaid-svg-DKQIcTQmtR0tbTBA .image-shape .label,#mermaid-svg-DKQIcTQmtR0tbTBA .icon-shape .label{text-anchor:middle;}#mermaid-svg-DKQIcTQmtR0tbTBA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DKQIcTQmtR0tbTBA .rough-node .label,#mermaid-svg-DKQIcTQmtR0tbTBA .node .label,#mermaid-svg-DKQIcTQmtR0tbTBA .image-shape .label,#mermaid-svg-DKQIcTQmtR0tbTBA .icon-shape .label{text-align:center;}#mermaid-svg-DKQIcTQmtR0tbTBA .node.clickable{cursor:pointer;}#mermaid-svg-DKQIcTQmtR0tbTBA .root .anchor path{fill:#4ECDC4!important;stroke-width:0;stroke:#4ECDC4;}#mermaid-svg-DKQIcTQmtR0tbTBA .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-DKQIcTQmtR0tbTBA .edgePath .path{stroke:#4ECDC4;stroke-width:2.0px;}#mermaid-svg-DKQIcTQmtR0tbTBA .flowchart-link{stroke:#4ECDC4;fill:none;}#mermaid-svg-DKQIcTQmtR0tbTBA .edgeLabel{background-color:#45B7D1;text-align:center;}#mermaid-svg-DKQIcTQmtR0tbTBA .edgeLabel p{background-color:#45B7D1;}#mermaid-svg-DKQIcTQmtR0tbTBA .edgeLabel rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-DKQIcTQmtR0tbTBA .labelBkg{background-color:rgba(69, 183, 209, 0.5);}#mermaid-svg-DKQIcTQmtR0tbTBA .cluster rect{fill:#96CEB4;stroke:hsl(152.1428571429, 0%, 59.8039215686%);stroke-width:1px;}#mermaid-svg-DKQIcTQmtR0tbTBA .cluster text{fill:#69314b;}#mermaid-svg-DKQIcTQmtR0tbTBA .cluster span{color:#69314b;}#mermaid-svg-DKQIcTQmtR0tbTBA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei;font-size:12px;background:#96CEB4;border:1px solid hsl(152.1428571429, 0%, 59.8039215686%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DKQIcTQmtR0tbTBA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fff;}#mermaid-svg-DKQIcTQmtR0tbTBA rect.text{fill:none;stroke-width:0;}#mermaid-svg-DKQIcTQmtR0tbTBA .icon-shape,#mermaid-svg-DKQIcTQmtR0tbTBA .image-shape{background-color:#45B7D1;text-align:center;}#mermaid-svg-DKQIcTQmtR0tbTBA .icon-shape p,#mermaid-svg-DKQIcTQmtR0tbTBA .image-shape p{background-color:#45B7D1;padding:2px;}#mermaid-svg-DKQIcTQmtR0tbTBA .icon-shape .label rect,#mermaid-svg-DKQIcTQmtR0tbTBA .image-shape .label rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-DKQIcTQmtR0tbTBA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DKQIcTQmtR0tbTBA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DKQIcTQmtR0tbTBA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
智能调度Agent全章总结
核心矛盾识别
解耦架构设计
工程价值落地
实战避坑指南
未来演进方向
为什么边想边做会崩
人类 vs AI的任务处理差异
Planner模块设计
Executor模块设计
状态机与上下文管理
可观测性提升
容错与回滚机制
性能与成本优化
常见反模式
调试技巧
测试策略
多Agent协作
动态规划能力
人机协同边界
目录速览
嗨,大家好呀,我是你的老朋友精通代码大仙。接下来我们一起学习 《大模型应用开发_动手做AI_Agent》,震撼你的学习轨迹!
“磨刀不误砍柴工”——这句老话你肯定听过无数遍。但真到了写Agent的时候,你是不是又忍不住让大模型"边想边干"?
输入一个复杂任务,期待它像老司机一样行云流水:分析需求→调用工具→处理结果→继续下一步。结果呢?要么卡在半路循环往复,要么工具调得飞起却离目标越来越远,最惨的是某一步出错了,整个链条崩得像多米诺骨牌。
第7章讲的"智能调度Agent",核心就一句话:把"想"和"做"拆开。这不是什么高深理论,而是无数工程师用头发换来的血泪教训。今天这篇总结,我会带你穿透"计划与执行解耦"的工程本质,看清它为什么能让你的Agent从"薛定谔的能跑"变成"稳如老狗"。
一、核心矛盾识别:为什么"边想边做"是Agent的原罪
点题:人类与AI的认知差异
咱们先做个思想实验。
你让实习生去买杯咖啡,会怎么说?“去楼下瑞幸,买杯生椰拿铁,少冰,用我手机里的优惠券”——任务、地点、规格、支付方式,一次性交代清楚。然后你继续写代码,等他回来。
但如果你说:“我想喝咖啡了,你去弄一杯”,然后每隔30秒追问"到哪了"“买啥了”“多少钱”——这就是典型的"边想边做"模式,你和实习生都会疯。
#mermaid-svg-duevEzXjjnDPiTV1{font-family:Microsoft YaHei;font-size:16px;fill:#fff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-duevEzXjjnDPiTV1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-duevEzXjjnDPiTV1 .error-icon{fill:#96CEB4;}#mermaid-svg-duevEzXjjnDPiTV1 .error-text{fill:#69314b;stroke:#69314b;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-duevEzXjjnDPiTV1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-duevEzXjjnDPiTV1 .marker{fill:#4ECDC4;stroke:#4ECDC4;}#mermaid-svg-duevEzXjjnDPiTV1 .marker.cross{stroke:#4ECDC4;}#mermaid-svg-duevEzXjjnDPiTV1 svg{font-family:Microsoft YaHei;font-size:16px;}#mermaid-svg-duevEzXjjnDPiTV1 p{margin:0;}#mermaid-svg-duevEzXjjnDPiTV1 .label{font-family:Microsoft YaHei;color:#fff;}#mermaid-svg-duevEzXjjnDPiTV1 .cluster-label text{fill:#69314b;}#mermaid-svg-duevEzXjjnDPiTV1 .cluster-label span{color:#69314b;}#mermaid-svg-duevEzXjjnDPiTV1 .cluster-label span p{background-color:transparent;}#mermaid-svg-duevEzXjjnDPiTV1 .label text,#mermaid-svg-duevEzXjjnDPiTV1 span{fill:#fff;color:#fff;}#mermaid-svg-duevEzXjjnDPiTV1 .node rect,#mermaid-svg-duevEzXjjnDPiTV1 .node circle,#mermaid-svg-duevEzXjjnDPiTV1 .node ellipse,#mermaid-svg-duevEzXjjnDPiTV1 .node polygon,#mermaid-svg-duevEzXjjnDPiTV1 .node path{fill:#FF6B6B;stroke:#FF6B6B;stroke-width:1px;}#mermaid-svg-duevEzXjjnDPiTV1 .rough-node .label text,#mermaid-svg-duevEzXjjnDPiTV1 .node .label text,#mermaid-svg-duevEzXjjnDPiTV1 .image-shape .label,#mermaid-svg-duevEzXjjnDPiTV1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-duevEzXjjnDPiTV1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-duevEzXjjnDPiTV1 .rough-node .label,#mermaid-svg-duevEzXjjnDPiTV1 .node .label,#mermaid-svg-duevEzXjjnDPiTV1 .image-shape .label,#mermaid-svg-duevEzXjjnDPiTV1 .icon-shape .label{text-align:center;}#mermaid-svg-duevEzXjjnDPiTV1 .node.clickable{cursor:pointer;}#mermaid-svg-duevEzXjjnDPiTV1 .root .anchor path{fill:#4ECDC4!important;stroke-width:0;stroke:#4ECDC4;}#mermaid-svg-duevEzXjjnDPiTV1 .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-duevEzXjjnDPiTV1 .edgePath .path{stroke:#4ECDC4;stroke-width:2.0px;}#mermaid-svg-duevEzXjjnDPiTV1 .flowchart-link{stroke:#4ECDC4;fill:none;}#mermaid-svg-duevEzXjjnDPiTV1 .edgeLabel{background-color:#45B7D1;text-align:center;}#mermaid-svg-duevEzXjjnDPiTV1 .edgeLabel p{background-color:#45B7D1;}#mermaid-svg-duevEzXjjnDPiTV1 .edgeLabel rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-duevEzXjjnDPiTV1 .labelBkg{background-color:rgba(69, 183, 209, 0.5);}#mermaid-svg-duevEzXjjnDPiTV1 .cluster rect{fill:#96CEB4;stroke:hsl(152.1428571429, 0%, 59.8039215686%);stroke-width:1px;}#mermaid-svg-duevEzXjjnDPiTV1 .cluster text{fill:#69314b;}#mermaid-svg-duevEzXjjnDPiTV1 .cluster span{color:#69314b;}#mermaid-svg-duevEzXjjnDPiTV1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei;font-size:12px;background:#96CEB4;border:1px solid hsl(152.1428571429, 0%, 59.8039215686%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-duevEzXjjnDPiTV1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fff;}#mermaid-svg-duevEzXjjnDPiTV1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-duevEzXjjnDPiTV1 .icon-shape,#mermaid-svg-duevEzXjjnDPiTV1 .image-shape{background-color:#45B7D1;text-align:center;}#mermaid-svg-duevEzXjjnDPiTV1 .icon-shape p,#mermaid-svg-duevEzXjjnDPiTV1 .image-shape p{background-color:#45B7D1;padding:2px;}#mermaid-svg-duevEzXjjnDPiTV1 .icon-shape .label rect,#mermaid-svg-duevEzXjjnDPiTV1 .image-shape .label rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-duevEzXjjnDPiTV1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-duevEzXjjnDPiTV1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-duevEzXjjnDPiTV1 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
计划执行解耦(分离架构)
可选
用户输入
Planner生成完整计划
计划存储
Executor按步骤执行
每步结果写入状态
动态重规划
边想边做模式(耦合架构)
可能直接输出
用户输入
LLM思考
执行工具
观察结果
最终结果
大模型的本质是什么?基于概率的文本续写。当你让它"边想边做",等于要求它在每一步都同时做三件事:理解当前状态、预测下一步行动、生成工具调用参数。这三件事的复杂度是相乘的,出错概率是指数级上升。
痛点分析:耦合架构的三宗罪
第一宗罪:上下文爆炸
来看个真实案例。某团队做数据分析Agent,用户问:“对比我司Q1和Q2的销售数据,找出增长最快的产品线,并生成可视化报告”。
耦合架构的"边想边做"长这样:
# 错误示范:耦合架构
def agent_run(user_query):
messages = [{"role": "user", "content": user_query}]
for step in range(max_steps): # 循环直到完成或超限
# LLM同时负责:理解进度+决定下一步+生成调用
response = llm.chat(messages, tools=tools)
if response.has_tool_call:
result = execute_tool(response.tool_call)
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "tool", "content": result}) # 历史越积越多
else:
return response.content # 直接输出答案
return "执行步数超限" # 悲剧收场
问题在哪?每一步的结果都塞进messages,上下文长度指数增长。到了第5步,LLM已经要在5000字的"废话"里找重点,注意力分散得像期末考前刷短视频的你。
第二宗罪:错误级联
某一步工具调用出错了(比如数据库连不上),耦合架构怎么办?LLM看到错误信息,试图"理解并修复"——但它怎么知道这是临时网络抖动,还是SQL写错了,还是权限问题?它在没有全局计划的情况下做局部决策,就像蒙眼修车。
更惨的是,这个错误会被记入上下文,污染后续所有判断。我见过一个Agent,第三步把"销售额"当成了"销售量",后面五步全在错误数据上分析,最后得出"建议停产明星产品"的神结论。
第三宗罪:不可观测性黑洞
产品经理问你:"这个请求为什么跑了8步还没出结果?"你打开日志,看到的是:
Step 1: 调用search_products
Step 2: 调用get_sales_data
Step 3: 调用calculate_growth… 等等,怎么又search_products了?
Step 4: 调用get_sales_data(参数和Step 2不一样?)
…
没有计划,就没有预期。你无法判断Agent是"在正确道路上多走几步",还是"已经迷路在循环里"。调试这种系统,比找内存泄漏还让人头秃。
解决方案:先规划,后执行
解耦架构的核心是两个阶段、明确分工:
# 正确示范:解耦架构
class DecoupledAgent:
def __init__(self):
self.planner = Planner() # 只负责"想"
self.executor = Executor() # 只负责"做"
self.state = StateManager() # 共享工作区
def run(self, user_query):
# Phase 1: 规划阶段(一次性)
plan = self.planner.create_plan(user_query)
# 例如:["查询Q1数据", "查询Q2数据", "计算增长率", "排序", "生成图表"]
# Phase 2: 执行阶段(可观测、可干预)
for step in plan.steps:
result = self.executor.execute(step, self.state)
self.state.update(step.id, result)
if result.is_error and plan.can_retry(step):
# 有计划的错误处理,不是瞎猜
result = self.executor.retry_with_fix(step, result.error)
return self.state.get_final_output()
好处立竿见影:
- 上下文可控:Planner阶段用完整上下文做全局分析,Executor阶段只看当前步骤+状态摘要
- 错误可定位:第3步出错?检查第3步的工具调用和输入输出,计划是明确的参照系
- 过程可观测:执行前就能看到"预计5步",执行中能看到"3/5已完成"
小结
"边想边做"是把复杂问题塞进一个黑盒,"先规划后执行"是把黑盒拆开成可观测的流水线。解耦不是增加复杂度,而是把隐性的混乱变成显性的秩序。
二、解耦架构设计:Planner与Executor的分工艺术
点题:两个车间的协作协议
如果把Agent比作工厂,Planner是工艺设计部,Executor是生产车间。设计部出图纸,车间按图施工,中间靠状态仓库传递信息。
#mermaid-svg-XcTY2EKcih7qL7op{font-family:Microsoft YaHei;font-size:16px;fill:#fff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XcTY2EKcih7qL7op .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XcTY2EKcih7qL7op .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XcTY2EKcih7qL7op .error-icon{fill:#96CEB4;}#mermaid-svg-XcTY2EKcih7qL7op .error-text{fill:#69314b;stroke:#69314b;}#mermaid-svg-XcTY2EKcih7qL7op .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XcTY2EKcih7qL7op .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XcTY2EKcih7qL7op .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XcTY2EKcih7qL7op .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XcTY2EKcih7qL7op .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XcTY2EKcih7qL7op .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XcTY2EKcih7qL7op .marker{fill:#4ECDC4;stroke:#4ECDC4;}#mermaid-svg-XcTY2EKcih7qL7op .marker.cross{stroke:#4ECDC4;}#mermaid-svg-XcTY2EKcih7qL7op svg{font-family:Microsoft YaHei;font-size:16px;}#mermaid-svg-XcTY2EKcih7qL7op p{margin:0;}#mermaid-svg-XcTY2EKcih7qL7op .label{font-family:Microsoft YaHei;color:#fff;}#mermaid-svg-XcTY2EKcih7qL7op .cluster-label text{fill:#69314b;}#mermaid-svg-XcTY2EKcih7qL7op .cluster-label span{color:#69314b;}#mermaid-svg-XcTY2EKcih7qL7op .cluster-label span p{background-color:transparent;}#mermaid-svg-XcTY2EKcih7qL7op .label text,#mermaid-svg-XcTY2EKcih7qL7op span{fill:#fff;color:#fff;}#mermaid-svg-XcTY2EKcih7qL7op .node rect,#mermaid-svg-XcTY2EKcih7qL7op .node circle,#mermaid-svg-XcTY2EKcih7qL7op .node ellipse,#mermaid-svg-XcTY2EKcih7qL7op .node polygon,#mermaid-svg-XcTY2EKcih7qL7op .node path{fill:#FF6B6B;stroke:#FF6B6B;stroke-width:1px;}#mermaid-svg-XcTY2EKcih7qL7op .rough-node .label text,#mermaid-svg-XcTY2EKcih7qL7op .node .label text,#mermaid-svg-XcTY2EKcih7qL7op .image-shape .label,#mermaid-svg-XcTY2EKcih7qL7op .icon-shape .label{text-anchor:middle;}#mermaid-svg-XcTY2EKcih7qL7op .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XcTY2EKcih7qL7op .rough-node .label,#mermaid-svg-XcTY2EKcih7qL7op .node .label,#mermaid-svg-XcTY2EKcih7qL7op .image-shape .label,#mermaid-svg-XcTY2EKcih7qL7op .icon-shape .label{text-align:center;}#mermaid-svg-XcTY2EKcih7qL7op .node.clickable{cursor:pointer;}#mermaid-svg-XcTY2EKcih7qL7op .root .anchor path{fill:#4ECDC4!important;stroke-width:0;stroke:#4ECDC4;}#mermaid-svg-XcTY2EKcih7qL7op .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-XcTY2EKcih7qL7op .edgePath .path{stroke:#4ECDC4;stroke-width:2.0px;}#mermaid-svg-XcTY2EKcih7qL7op .flowchart-link{stroke:#4ECDC4;fill:none;}#mermaid-svg-XcTY2EKcih7qL7op .edgeLabel{background-color:#45B7D1;text-align:center;}#mermaid-svg-XcTY2EKcih7qL7op .edgeLabel p{background-color:#45B7D1;}#mermaid-svg-XcTY2EKcih7qL7op .edgeLabel rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-XcTY2EKcih7qL7op .labelBkg{background-color:rgba(69, 183, 209, 0.5);}#mermaid-svg-XcTY2EKcih7qL7op .cluster rect{fill:#96CEB4;stroke:hsl(152.1428571429, 0%, 59.8039215686%);stroke-width:1px;}#mermaid-svg-XcTY2EKcih7qL7op .cluster text{fill:#69314b;}#mermaid-svg-XcTY2EKcih7qL7op .cluster span{color:#69314b;}#mermaid-svg-XcTY2EKcih7qL7op div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei;font-size:12px;background:#96CEB4;border:1px solid hsl(152.1428571429, 0%, 59.8039215686%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XcTY2EKcih7qL7op .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fff;}#mermaid-svg-XcTY2EKcih7qL7op rect.text{fill:none;stroke-width:0;}#mermaid-svg-XcTY2EKcih7qL7op .icon-shape,#mermaid-svg-XcTY2EKcih7qL7op .image-shape{background-color:#45B7D1;text-align:center;}#mermaid-svg-XcTY2EKcih7qL7op .icon-shape p,#mermaid-svg-XcTY2EKcih7qL7op .image-shape p{background-color:#45B7D1;padding:2px;}#mermaid-svg-XcTY2EKcih7qL7op .icon-shape .label rect,#mermaid-svg-XcTY2EKcih7qL7op .image-shape .label rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-XcTY2EKcih7qL7op .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XcTY2EKcih7qL7op .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XcTY2EKcih7qL7op :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Executor 生产车间
State 中央仓库
Planner 工艺设计部
循环
反馈
输入理解
任务分解
依赖分析
生成执行计划DAG/序列/树
输出:结构化Plan
计划存储
执行上下文
中间结果
执行状态机
读取当前步骤
参数填充
工具调用
结果解析
状态回写
痛点分析:分工不清导致的混乱
我见过最离谱的设计,是Planner和Executor共用同一个LLM实例,只是prompt不同。这相当于让工艺设计师兼任车间主任,计划刚定完就忘,执行时重新"发挥"。
典型症状:
症状1:计划与执行两张皮
# 反模式:Planner和Executor没有明确契约
plan = planner.generate_plan("分析销售数据")
# Planner输出:"先获取数据,再计算增长,最后可视化"
# 但Executor拿到的是字符串,自己解析
for action in executor.parse_plan(plan): # 解析逻辑又是一次LLM调用
# 这里的"理解"和Planner的"意图"可能完全不同
execute(action)
结果?Planner说的是"计算同比增长",Executor理解成"计算环比",最后报告驴唇不对马嘴。
症状2:状态管理各自为政
Planner把中间结果存在plan.context里,Executor往execution_history里写,另一个模块又从memory里读。三个数据源,三种格式,调试时像在三个城市之间查案。
症状3:重规划变成"全盘推翻"
遇到错误需要调整计划时,简单粗暴地让Planner重新生成整个计划。原来执行了3步的成果全作废,从第0步重新开始——这不是智能,是自暴自弃。
解决方案:明确契约与分层状态
第一层契约:Plan的数据结构
计划不是自然语言,是可被机器精确执行的数据结构:
from dataclasses import dataclass
from typing import List, Dict, Optional, Literal
from enum import Enum
class StepStatus(Enum):
PENDING = "pending"
RUNNING = "running"
SUCCESS = "success"
FAILED = "failed"
SKIPPED = "skipped"
@dataclass
class Step:
id: str # 唯一标识
type: Literal["tool", "llm", "condition", "loop"]
description: str # 人类可读说明
tool_name: Optional[str] # 工具调用用
parameters: Dict # 参数模板,可含变量
dependencies: List[str] # 依赖的步骤id
output_var: str # 结果存入的变量名
retry_policy: Optional[Dict] # 失败重试策略
max_retries: int = 3
@dataclass
class Plan:
goal: str
steps: List[Step]
variables: Dict[str, Any] # 全局变量定义
exit_condition: Optional[str] # 提前终止条件
def get_executable_steps(self) –> List[Step]:
"""返回当前可执行的步骤(依赖已满足)"""
completed = {s.id for s in self.steps if s.status == StepStatus.SUCCESS}
return [s for s in self.steps
if s.status == StepStatus.PENDING
and all(d in completed for d in s.dependencies)]
第二层契约:StateManager的统一接口
class StateManager:
def __init__(self):
self._plan: Optional[Plan] = None
self._variables: Dict[str, Any] = {}
self._execution_log: List[ExecutionRecord] = []
def load_plan(self, plan: Plan):
"""Planner调用:装载新计划"""
self._plan = plan
self._variables = plan.variables.copy()
def get_step_input(self, step: Step) –> Dict:
"""Executor调用:获取步骤执行所需的填充后参数"""
# 参数中的{{variable}}会被替换为实际值
return self._resolve_template(step.parameters)
def record_step_result(self, step_id: str, result: StepResult):
"""Executor调用:记录执行结果"""
self._variables[f"result_{step_id}"] = result.data
self._execution_log.append(ExecutionRecord(
step_id=step_id,
timestamp=now(),
result=result
))
# 更新计划状态
step = self._plan.get_step(step_id)
step.status = StepStatus.SUCCESS if result.success else StepStatus.FAILED
def get_summary_for_planner(self) –> Dict:
"""重规划时调用:给Planner的当前状态摘要"""
return {
"original_goal": self._plan.goal,
"completed_steps": [s.id for s in self._plan.steps if s.status == StepStatus.SUCCESS],
"failed_steps": [s.id for s in self._plan.steps if s.status == StepStatus.FAILED],
"current_variables": self._variables,
"execution_summary": self._generate_summary()
}
第三层契约:受控的重规划
不是遇到问题就推倒重来,而是局部调整:
def replan_partial(state: StateManager, failed_step: Step) –> Optional[Plan]:
"""智能重规划:只调整失败步骤及其后续,保留已完成的成果"""
# 获取当前状态摘要
context = state.get_summary_for_planner()
# 询问Planner:基于当前状态,如何修复并继续
adjustment = planner.suggest_adjustment(
context=context,
failed_step=failed_step,
original_plan=state._plan
)
# 可能的结果:
# 1. 重试当前步骤(换参数/换工具)
# 2. 插入新步骤(补充信息)
# 3. 跳过当前步骤(有替代方案)
# 4. 真正需要全盘重规划(极少)
return state.apply_adjustment(adjustment)
小结
好的解耦架构,契约比实现更重要。Planner和Executor就像前后端分离:接口定清楚,两边各自迭代,联调时不扯皮。
三、工程价值落地:可观测性、容错、成本的三重收益
点题:解耦不是炫技,是实打实的工程红利
很多新手觉得"计划与执行解耦"是架构师的面子工程。错!这是能直接换算成KPI的硬收益。我们用数据说话。
#mermaid-svg-JhNzqIMw7MSzZlJW{font-family:Microsoft YaHei;font-size:16px;fill:#fff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JhNzqIMw7MSzZlJW .error-icon{fill:#96CEB4;}#mermaid-svg-JhNzqIMw7MSzZlJW .error-text{fill:#69314b;stroke:#69314b;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JhNzqIMw7MSzZlJW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JhNzqIMw7MSzZlJW .marker{fill:#4ECDC4;stroke:#4ECDC4;}#mermaid-svg-JhNzqIMw7MSzZlJW .marker.cross{stroke:#4ECDC4;}#mermaid-svg-JhNzqIMw7MSzZlJW svg{font-family:Microsoft YaHei;font-size:16px;}#mermaid-svg-JhNzqIMw7MSzZlJW p{margin:0;}#mermaid-svg-JhNzqIMw7MSzZlJW .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-JhNzqIMw7MSzZlJW .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-JhNzqIMw7MSzZlJW .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:Microsoft YaHei;}#mermaid-svg-JhNzqIMw7MSzZlJW .slice{font-family:Microsoft YaHei;fill:#000000;font-size:17px;}#mermaid-svg-JhNzqIMw7MSzZlJW .legend text{fill:#000000;font-family:Microsoft YaHei;font-size:17px;}#mermaid-svg-JhNzqIMw7MSzZlJW :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
35%
30%
25%
10%
解耦架构的工程收益分布
可观测性提升 [35]
容错能力增强 [30]
成本优化 [25]
开发效率 [10]
痛点分析:耦合架构的隐性成本
成本黑洞1:重复推理
耦合架构里,LLM每步都要"重新理解"整个任务。一个5步的任务,LLM实际上做了5次完整的"目标理解+上下文分析"。同样的思考,重复付费。
某团队实测数据:
- 耦合架构:平均每个任务消耗 8K tokens(输入)+ 2K tokens(输出)× 平均6步 = 60K tokens
- 解耦架构:Planner一次性 15K + Executor每步平均 2K × 6步 = 27K tokens
成本直接砍半,而且Planner可以用便宜的模型(4o-mini),Executor甚至可以用微调的小模型。
成本黑洞2:错误恢复的天价账单
耦合架构出错后,常见的"修复"方式是加更多上下文、换更强的模型、增加重试次数。某次生产事故,一个循环bug导致Agent疯狂调用API,3小时烧了2000刀,直到触发配额上限。
成本黑洞3:人力调试成本
更隐蔽的是工程师的时间。耦合架构的bug,需要:
平均调试时间:2-4小时/bug。解耦架构呢?看计划→看哪步出错→检查该步输入输出,10分钟定位。
解决方案:三重收益的工程实践
收益一:可观测性——从黑盒到白盒
# 解耦架构天然支持结构化日志
class ObservableExecutor:
def execute(self, step: Step, state: StateManager):
span = tracer.start_span(f"step.{step.id}")
try:
# 记录执行前状态
span.set_attribute("step.type", step.type)
span.set_attribute("step.input", state.get_step_input(step))
result = self._do_execute(step, state)
# 记录执行结果
span.set_attribute("step.success", result.success)
span.set_attribute("step.output_size", len(str(result.data)))
# 关键:计划完成度可视化
progress = state.get_plan_progress()
metrics.gauge("plan.completion_rate", progress.completion_rate)
metrics.gauge("plan.estimated_remaining_steps", progress.estimated_remaining)
return result
except Exception as e:
span.record_exception(e)
# 明确的错误分类
error_type = self._classify_error(e)
metrics.counter(f"errors.{error_type}")
raise
finally:
span.end()
配合Dashboard,你可以实时看到:
当前运行任务: 127个
平均计划完成度: 67%
步骤成功率: 94.3%
常见卡点: get_financial_data (超时)
建议优化: 增加该工具的超时时间或缓存
收益二:容错——精准手术而非截肢
解耦让错误处理有层次:
| 步骤级 | 自动重试+退避 | 网络抖动、临时限流 |
| 计划级 | 局部重规划 | 某步骤确实不可行,有替代方案 |
| 任务级 | 人工介入 | 目标本身有问题,需要澄清 |
class ResilientExecutor:
def execute_with_resilience(self, step: Step, state: StateManager):
# 第一层:步骤级重试
for attempt in range(step.max_retries):
try:
return self.execute(step, state)
except TransientError as e:
wait = exponential_backoff(attempt)
logger.warning(f"Step {step.id} failed, retrying in {wait}s: {e}")
sleep(wait)
# 第二层:智能降级
if step.fallback_tool:
logger.info(f"Using fallback for step {step.id}")
return self.execute_with_alternative(step, state)
# 第三层:请求重规划
new_plan = self.replan_around_failure(step, state)
if new_plan:
state.load_plan(new_plan)
return self.continue_execution(state)
# 第四层:优雅失败,保留已有成果
return self.partial_result_with_explanation(state)
收益三:成本优化——精准控费
class CostOptimizedPlanner:
def __init__(self):
# 不同任务用不同模型
self.models = {
"complex_reasoning": "claude-3-opus", # 贵但强
"standard_planning": "gpt-4o", # 均衡
"simple_execution": "gpt-4o-mini", # 便宜够用
"structured_output": "fine-tuned-7b" # 自有模型,成本极低
}
def create_plan(self, query: str) –> Plan:
# 先快速分类任务复杂度
complexity = self.assess_complexity(query)
# 简单任务:便宜模型+严格格式
if complexity == "simple":
return self.plan_with_model(
model=self.models["simple_execution"],
prompt=STANDARD_PLAN_PROMPT,
response_format="json" # 强制结构化,减少解析错误
)
# 复杂任务:强模型做分析,然后降级执行
analysis = self.analyze_with_model(
model=self.models["complex_reasoning"],
query=query
)
return self.convert_to_executable_plan(
analysis,
execution_model=self.models["simple_execution"]
)
实测效果:某客服Agent场景,成本从$0.12/请求降到$0.031/请求,准确率反而提升8%——因为结构化输出减少了格式错误导致的重试。
小结
解耦架构的工程价值,每一分钱都花在刀刃上:Planner用强模型做一次性深度思考,Executor用弱模型做批量确定性执行,错误处理精准定位而非盲目重试。这不是省钱,是投资回报率的最大化。
四、实战避坑指南:那些让你半夜惊醒的反模式
点题:前人踩过的坑,都是你的护城河
第7章的实战案例背后,是无数工程师的深夜调试。我整理了最常见的5个反模式,帮你提前排雷。
痛点分析:从代码到认知的全面陷阱
反模式1:“伪解耦”——计划只是装饰品
# 看起来解耦了,实际还是边想边做
class FakeDecoupledAgent:
def run(self, query):
# Step 1: 生成"计划"(但计划里全是模糊描述)
plan = self.planner.generate(f"为'{query}'制定计划")
# 输出:"我会先查数据,然后分析,最后总结"
# Step 2: "执行"计划(实际又让LLM决定具体做什么)
for step_description in plan.split(","):
result = self.llm.execute(f"执行这一步:{step_description}")
return result
识别特征:计划是自然语言描述,没有结构化步骤;执行时LLM能看到完整历史,实际上还是在做全局决策。
危害:比纯耦合架构更糟,因为多了一层"计划生成"的开销,却没获得任何解耦的收益。
反模式2:状态污染——变量命名空间混乱
# 噩梦现场:多个步骤都往"result"里写
step1 = Step(id="search", output_var="result") # 搜索结果
step2 = Step(id="analyze", output_var="result") # 分析结果(覆盖!)
step3 = Step(id="summarize", input="{{result}}") # 拿到的是分析结果,不是搜索
识别特征:变量名重复使用、没有命名空间隔离、步骤间隐式依赖。
真实案例:某报表Agent,第三步把"日期范围"覆盖了,导致第四步用的数据范围全错,生成了一份"2023年全年"和"2024年Q1"混在一起的魔幻报表。
反模式3:计划僵化——拒绝动态调整
# 严格执行计划,哪怕世界已经变了
def rigid_execution(plan, state):
for step in plan.steps:
result = execute(step)
if result.failed:
# 只会重试,不会重新思考
for _ in range(3):
result = execute(step)
if result.success:
break
else:
raise Exception("Step failed after retries") # 直接抛错,完犊子
识别特征:没有replan机制、遇到意外就崩溃、不会利用新信息优化路径。
反模式4:过度规划——计划比执行还贵
# 为了查个天气,生成50步的计划
plan = [
Step("analyze_user_intent"),
Step("determine_location_precision"),
Step("select_weather_api"),
Step("check_api_availability"),
Step("prepare_request_parameters"),
Step("execute_api_call"),
Step("validate_response_format"),
Step("extract_temperature"),
Step("extract_humidity"),
# … 还有40步
]
识别特征:简单任务复杂化、计划步骤粒度太细、规划时间超过执行时间。
反模式5:信任崩塌——完全不验证计划
# Planner说啥就是啥,不检查可行性
plan = planner.create_plan("分析公司财报")
# 计划里有个步骤:调用"internal_financial_db"
# 但当前用户根本没有这个权限!
executor.execute(plan) # boom! 权限错误
识别特征:计划生成和执行之间没有可行性验证、假设Planner全知全能。
解决方案:防御性编程实践
防御1:计划即代码——强制结构化
@dataclass(frozen=True) # 不可变,防止执行时篡改
class ValidatedStep:
id: str
tool: RegisteredTool # 必须是已注册的工具,不是字符串
required_permissions: List[str] # 显式声明权限需求
estimated_cost: float # 预估成本,用于预算控制
def validate_against_context(self, context: ExecutionContext) –> ValidationResult:
"""执行前验证"""
errors = []
if not context.has_permissions(self.required_permissions):
errors.append(f"Missing permissions: {self.required_permissions}")
if self.estimated_cost > context.remaining_budget:
errors.append(f"Over budget: {self.estimated_cost} > {context.remaining_budget}")
return ValidationResult(valid=len(errors)==0, errors=errors)
防御2:变量命名空间隔离
class ScopedState:
def __init__(self):
self._global = {} # 计划级变量
self._step_local = {} # 步骤级变量,执行后自动清理
self._outputs = {} # 步骤输出,按id索引
def set_step_output(self, step_id: str, value: Any):
self._outputs[f"steps.{step_id}.output"] = value
def get_for_step(self, step_id: str, var_ref: str):
"""步骤只能访问:全局变量 + 自己的依赖步骤的输出"""
if var_ref.startswith("steps."):
# 检查是否是依赖步骤
dep_step = var_ref.split(".")[1]
if dep_step not in self.get_dependencies(step_id):
raise SecurityError(f"Step {step_id} cannot access {var_ref}")
return self._resolve(var_ref)
防御3:自适应重规划
class AdaptiveExecutor:
def execute(self, plan: Plan, state: StateManager):
while not plan.is_complete():
step = plan.next_executable_step()
# 执行前:检查环境变化
if self.environment_changed(plan, state):
plan = self.replan_with_current_context(plan, state)
continue
result = self.execute_step(step, state)
if result.success:
state.record_success(step, result)
else:
# 分类错误,决定应对策略
strategy = self.classify_and_decide(result.error)
if strategy == "retry":
continue # 简单重试
elif strategy == "replan_step":
plan = self.replan_single_step(plan, step, result.error)
elif strategy == "replan_from_here":
plan = self.replan_partial(plan, step, state)
elif strategy == "escalate":
return self.request_human_help(plan, state, result)
防御4:计划复杂度预算
def create_plan_with_budget(query: str, max_planning_cost: float) –> Plan:
"""根据任务复杂度,动态分配规划资源"""
# 快速预估任务复杂度
complexity_score = estimate_complexity(query) # 0-10
if complexity_score < 3:
# 简单任务:用便宜模型,快速模板填充
return fast_template_plan(query, model="gpt-4o-mini")
elif complexity_score < 7:
# 中等任务:标准规划流程
return standard_planning(query, model="gpt-4o")
else:
# 复杂任务:分层规划,先粗后细
coarse_plan = high_level_plan(query, model="claude-3-opus")
detailed_plan = []
for sub_goal in coarse_plan.sub_goals:
detailed_plan.extend(detailed_planning(sub_goal, model="gpt-4o"))
return Plan(concatenated=detailed_plan)
防御5:计划可行性预检
class PlanPreflight:
def check(self, plan: Plan, context: ExecutionContext) –> PreflightReport:
issues = []
for step in plan.steps:
# 检查工具存在性
if not self.tool_registry.exists(step.tool_name):
issues.append(PreflightIssue(
severity="error",
step=step.id,
message=f"Unknown tool: {step.tool_name}"
))
# 检查权限
tool = self.tool_registry.get(step.tool_name)
missing_perms = set(tool.required_permissions) – context.user_permissions
if missing_perms:
issues.append(PreflightIssue(
severity="error",
step=step.id,
message=f"Missing permissions: {missing_perms}"
))
# 检查参数可解析性
unresolved = self.find_unresolved_variables(step.parameters, plan.variables)
if unresolved:
issues.append(PreflightIssue(
severity="warning",
step=step.id,
message=f"Unresolved variables: {unresolved}"
))
return PreflightReport(
can_execute=not any(i.severity=="error" for i in issues),
issues=issues
)
小结
反模式的共同特征是破坏了"计划-执行"契约的完整性。防御性编程的核心是:不信任任何环节,在边界处做验证。
五、未来演进方向:从单Agent到智能体生态
点题:解耦架构是更大图景的基石
掌握第7章的内容,不只是会做"智能调度Agent"。计划与执行解耦的思想,是通往多Agent协作、动态规划、人机协同的必经之路。
#mermaid-svg-Hqg0NOAxLHS5TqaE{font-family:Microsoft YaHei;font-size:16px;fill:#fff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Hqg0NOAxLHS5TqaE .error-icon{fill:#96CEB4;}#mermaid-svg-Hqg0NOAxLHS5TqaE .error-text{fill:#69314b;stroke:#69314b;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Hqg0NOAxLHS5TqaE .marker{fill:#4ECDC4;stroke:#4ECDC4;}#mermaid-svg-Hqg0NOAxLHS5TqaE .marker.cross{stroke:#4ECDC4;}#mermaid-svg-Hqg0NOAxLHS5TqaE svg{font-family:Microsoft YaHei;font-size:16px;}#mermaid-svg-Hqg0NOAxLHS5TqaE p{margin:0;}#mermaid-svg-Hqg0NOAxLHS5TqaE .label{font-family:Microsoft YaHei;color:#fff;}#mermaid-svg-Hqg0NOAxLHS5TqaE .cluster-label text{fill:#69314b;}#mermaid-svg-Hqg0NOAxLHS5TqaE .cluster-label span{color:#69314b;}#mermaid-svg-Hqg0NOAxLHS5TqaE .cluster-label span p{background-color:transparent;}#mermaid-svg-Hqg0NOAxLHS5TqaE .label text,#mermaid-svg-Hqg0NOAxLHS5TqaE span{fill:#fff;color:#fff;}#mermaid-svg-Hqg0NOAxLHS5TqaE .node rect,#mermaid-svg-Hqg0NOAxLHS5TqaE .node circle,#mermaid-svg-Hqg0NOAxLHS5TqaE .node ellipse,#mermaid-svg-Hqg0NOAxLHS5TqaE .node polygon,#mermaid-svg-Hqg0NOAxLHS5TqaE .node path{fill:#FF6B6B;stroke:#FF6B6B;stroke-width:1px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .rough-node .label text,#mermaid-svg-Hqg0NOAxLHS5TqaE .node .label text,#mermaid-svg-Hqg0NOAxLHS5TqaE .image-shape .label,#mermaid-svg-Hqg0NOAxLHS5TqaE .icon-shape .label{text-anchor:middle;}#mermaid-svg-Hqg0NOAxLHS5TqaE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .rough-node .label,#mermaid-svg-Hqg0NOAxLHS5TqaE .node .label,#mermaid-svg-Hqg0NOAxLHS5TqaE .image-shape .label,#mermaid-svg-Hqg0NOAxLHS5TqaE .icon-shape .label{text-align:center;}#mermaid-svg-Hqg0NOAxLHS5TqaE .node.clickable{cursor:pointer;}#mermaid-svg-Hqg0NOAxLHS5TqaE .root .anchor path{fill:#4ECDC4!important;stroke-width:0;stroke:#4ECDC4;}#mermaid-svg-Hqg0NOAxLHS5TqaE .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edgePath .path{stroke:#4ECDC4;stroke-width:2.0px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .flowchart-link{stroke:#4ECDC4;fill:none;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edgeLabel{background-color:#45B7D1;text-align:center;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edgeLabel p{background-color:#45B7D1;}#mermaid-svg-Hqg0NOAxLHS5TqaE .edgeLabel rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-Hqg0NOAxLHS5TqaE .labelBkg{background-color:rgba(69, 183, 209, 0.5);}#mermaid-svg-Hqg0NOAxLHS5TqaE .cluster rect{fill:#96CEB4;stroke:hsl(152.1428571429, 0%, 59.8039215686%);stroke-width:1px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .cluster text{fill:#69314b;}#mermaid-svg-Hqg0NOAxLHS5TqaE .cluster span{color:#69314b;}#mermaid-svg-Hqg0NOAxLHS5TqaE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei;font-size:12px;background:#96CEB4;border:1px solid hsl(152.1428571429, 0%, 59.8039215686%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Hqg0NOAxLHS5TqaE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fff;}#mermaid-svg-Hqg0NOAxLHS5TqaE rect.text{fill:none;stroke-width:0;}#mermaid-svg-Hqg0NOAxLHS5TqaE .icon-shape,#mermaid-svg-Hqg0NOAxLHS5TqaE .image-shape{background-color:#45B7D1;text-align:center;}#mermaid-svg-Hqg0NOAxLHS5TqaE .icon-shape p,#mermaid-svg-Hqg0NOAxLHS5TqaE .image-shape p{background-color:#45B7D1;padding:2px;}#mermaid-svg-Hqg0NOAxLHS5TqaE .icon-shape .label rect,#mermaid-svg-Hqg0NOAxLHS5TqaE .image-shape .label rect{opacity:0.5;background-color:#45B7D1;fill:#45B7D1;}#mermaid-svg-Hqg0NOAxLHS5TqaE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Hqg0NOAxLHS5TqaE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Hqg0NOAxLHS5TqaE :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
扩展
演进
未来:动态智能体网络
用户意图
自动Agent生成
临时Agent A
临时Agent B
任务完成即销毁
演进:多Agent协作
Orchestrator元规划器
Research Agent
Code Agent
Data Agent
共享状态空间
当前:单Agent解耦
Planner
Executor
痛点分析:当前架构的天花板
天花板1:单Agent的能力边界
再强的Agent,也有知识截止、工具限制、推理深度的问题。让同一个Planner既懂财务分析又懂代码生成,要么模型贵得离谱,要么样样稀松。
天花板2:静态计划的局限性
预先生成的计划,难以应对真正的开放性任务。比如:“帮我调研竞争对手最近半年的战略动向”——你不知道要查多少来源、遇到什么信息、需要多深的分析。
天花板3:人机协同的粗糙
现在的"人工介入"大多是中断式的:出错了→停掉→人工接手→从头来。理想的协同应该是渐进式的:关键决策点询问、实时展示进展、随时可干预但不必接管。
解决方案:三个演进方向
方向一:多Agent协作——专业分工
把"Planner-Executor"扩展为"Orchestrator-多Agent":
class MultiAgentOrchestrator:
def __init__(self):
self.agents = {
"research": ResearchAgent(), # 擅长信息搜集
"analysis": AnalysisAgent(), # 擅长数据推理
"coding": CodingAgent(), # 擅长代码生成
"review": ReviewAgent() # 擅长质量检查
}
def execute_complex_task(self, goal: str):
# 元规划:不是规划具体步骤,而是规划"谁来做什么"
meta_plan = self.meta_planner.create_plan(
goal=goal,
available_agents=list(self.agents.keys()),
agent_capabilities=self.get_capability_descriptions()
)
# 输出类似:
# [
# {"agent": "research", "sub_goal": "搜集Q1-Q2财报", "output_format": "结构化数据"},
# {"agent": "analysis", "depends_on": ["research"], "sub_goal": "计算增长率"},
# {"agent": "review", "depends_on": ["analysis"], "sub_goal": "验证结论合理性"}
# ]
state = SharedState() # 关键:共享状态空间
for task in topological_sort(meta_plan):
agent = self.agents[task.agent]
result = agent.run(task.sub_goal, state.get_context(task))
state.record(task.id, result)
# 跨Agent协调:如果分析Agent发现数据不足,自动触发补充研究
if result.status == "insufficient_data":
new_task = self.plan_additional_research(result, state)
meta_plan.insert_before_current(new_task)
return state.get_final_output()
方向二:动态规划——计划即执行
不再是"先完整规划,再严格执行",而是规划与执行交替进行,深度优先探索:
class DynamicPlanner:
def execute(self, goal: str):
root = PlanningNode(goal=goal, depth=0)
stack = [root]
while stack:
node = stack.pop()
if self.is_primitive(node.goal):
# 原子任务,直接执行
result = self.execute_primitive(node.goal)
node.mark_complete(result)
else:
# 复杂任务,展开子目标(但只展开一层)
sub_goals = self.decompose_one_level(node.goal)
# 关键:根据当前信息,选择最有希望的子目标深入
prioritized = self.prioritize(sub_goals, context=self.get_current_context())
# 深度优先:把其他子目标压栈,优先执行第一个
for sub in reversed(prioritized[1:]):
stack.append(PlanningNode(goal=sub, parent=node))
stack.append(PlanningNode(goal=prioritized[0], parent=node))
# 每完成一个节点,重新评估整体策略
if self.should_replan(root):
new_strategy = self.replan(root)
stack = self.adjust_stack(stack, new_strategy)
return root.get_result()
这种"即时规划"适合探索性任务,比如科研调研、创造性写作。
方向三:精细人机协同——人在回路中,而非回路上
class HumanInTheLoop:
def __init__(self):
self.interaction_points = {
"high_cost": self.approve_expensive_action, # 高成本操作前确认
"uncertain": self.clarify_ambiguity, # 置信度低时询问
"milestone": self.review_intermediate_result, # 关键节点展示
"failure": self.offer_recovery_options # 失败时提供选项
}
def execute_with_human(self, plan: Plan):
for step in plan.steps:
# 检查是否需要人工介入
trigger = self.check_interaction_trigger(step)
if trigger:
interaction = self.interaction_points[trigger.type](step)
if interaction.decision == "approve":
continue # 继续执行
elif interaction.decision == "modify":
plan = self.apply_modification(plan, interaction.changes)
elif interaction.decision == "delegate":
return self.handover_to_human(plan, step, context)
# "wait"选项:保存状态,稍后恢复
result = self.execute_step(step)
return result
关键是让人的介入成为系统设计的first-class citizen,而不是error handling的last resort。
小结
第7章的"计划与执行解耦",是智能体架构的第一性原理。无论未来演进到多Agent、动态规划还是深度人机协同,清晰的职责分离、显式的状态管理、可控的执行流程始终是可靠系统的基石。
写在最后
读完这一章,我希望你记住的不只是"Planner+Executor"的代码结构,而是背后那个朴素的工程智慧:把复杂问题拆成可管理的模块,让每一部分都有明确的职责和边界。
这不仅是做Agent的方法论,也是写任何复杂系统的思维方式。当你下次面对一个"看起来需要AI全程自主决策"的需求时,先问自己:哪些部分真的可以预规划?哪些执行路径可以结构化?哪里必须保留灵活性?克制地设计,比放纵地堆砌更能体现工程师的价值。
编程之路不易,但每一步成长都算数。从"边想边做"的耦合泥潭,到"先谋后动"的解耦架构,你不仅在升级技术栈,更在培养系统化思考的能力——这才是AI时代工程师真正的护城河。
保持好奇,持续学习,你也能成为那个让Agent"稳如老狗"的代码高手。
关注私信备注:“资料代找获取”,全网计算机学习资料代找:例如: 《课程:2026 年多模态大模型实战训练营》 《课程:AI 大模型工程师系统课程 (22 章完整版 持续更新)》 《课程:AI 大模型系统实战课第四期 (2026 年开课 持续更新)》 《课程:2026 年 AGI 大模型系统课 23 期》 《课程:2026 年 AGI 大模型系统课 21 期》 《课程:AI 大模型实战课 8 期 (2026 年 2 月最新完结版)》 《课程:AI 大模型系统实战课三期》 《课程:AI 大模型系统课程 (2026 年 2 月开课 持续更新)》 《课程:AI 大模型全阶课程 (2025 年 12 月开课 2026 年 6 月结课)》 《课程:AI 大模型工程师全阶课程 (2025 年 10 月开课 2026 年 4 月结课)》 《课程:2026 年最新大模型 Agent 开发系统课 (持续更新)》 《课程:LLM 多模态视觉大模型系统课》 《课程:大模型 AI 应用开发企业级项目实战课 (2026 年 1 月开课)》 《课程:大模型智能体线上速成班 V2.0》 《课程:Java+AI 大模型智能应用开发全阶课》 《课程:Python+AI 大模型实战视频教程》 《书籍:软件工程 3.0: 大模型驱动的研发新范式.pdf》 《课程:人工智能大模型系统课 (2026 年 1 月底完结版)》 《课程:AI 大模型零基础到商业实战全栈课第五期》 《课程:Vue3.5+Electron + 大模型跨平台 AI 桌面聊天应用实战 (2025)》 《课程:AI 大模型实战训练营 从入门到实战轻松上手》 《课程:2026 年 AI 大模型 RAG 与 Agent 智能体项目实战开发课》 《课程:大模型训练营配套补充资料》

