AI-Agents(多智能体)的工程本质:Plan-And-Execute
之前以 ReAct 模式做切入,讲述了一个 AI-Agent 的工程本质。【AI大模型教程】
AI-Agent(智能体)的工程本质:ReAct
本文以 Plan-And-Execute 模式做切入,讲述多个AI-Agents协作的工程本质。
本文也将表达:多个AI-Agents可以带来哪些好处?能够解决哪些问题?
单个 AI-Agent 是一种从“AI工具”到“AI助手”的范式转移。
多个 AI-Agents 是一种从"万能助手"到"专业团队"的范式转变。
AI-Agent是什么?
AI-Agent是我们给大模型加上“工作规则”和“工具”,使它能够与外部环境持续交互,自主地完成任务目标。
‘工作规则’是基于某种方法论,任何人都可以去定义大模型的做事规范,恰到好处的方法论可以让任务目标更高效、更准确地达成。ReAct/Plan-And-Execute它们就是工作规则。
理论指导
langchain给Plan-And-Execute模式定义了三种类型:
-
Plan-And-Execute
-
LLMCompiler
-
ReWOO
我选择第1种类型为切入点来揭示其工程本质、同时也揭开多个AI-Agents协作的工程本质。
工作模式
Plan-And-Execute模式是如何工作的呢?
首先,分析阶段,大模型 会对任务进行分析,从而理解任务目标。
然后,规划阶段,大模型 会将任务分解成多个有顺序的子任务。
接着,执行阶段,大模型 会按顺序去要求Agent执行子任务,Agent 执行子任务后会将结果答复大模型。
之后,重新规划,大模型 会将子任务执行结果和子任务列表重新思考、重新规划,得到一个新的子任务列表。
最终,循环往复,所有子任务执行完毕后,大模型 会将所有子任务的结果组合起来,生成最终结果。
工程本质
由于Plan-And-Execute工作模式的步骤较多,我通过代码来进行演示和阐述。
我使用青云智算平台里的大模型:DeepSeek-V3.1-Terminus
我的项目地址:
这里有两个Agent:
一个是AgentPlanAndExecute,用于规划任务;
一个是AgentReAct,用于执行单一任务。
AgentPlanAndExecute 在运行过程中会调用 AgentReAct 去执行子任务。
这是“Plan-And-Execute”提示词:
你的核心职责是将用户提供的“高级任务”分解为可操作的子任务,制定一个循序渐进的计划,然后协调执行这些子任务。
你有一个辅助工具AgentShell,它可以执行单一、具体的任务。
你的输出应包括完整的计划概述、每个步骤的执行结果以及最终总结。
严格遵循以下步骤:
-
任务提交(task):用户会提交一个任务。当用户没有提交任务或任务模糊,请向用户发起询问(task-ask),用户会答复给你task。
-
任务分析(plan-analysis):分析任务描述,理解任务目标、上下文信息、任何约束条件。如果任务模糊,请向用户发起询问(task-ask)。
-
任务规划(plan-list):分解任务为自然语言描述的一个或多个逻辑子任务(subtasks),这些子任务是有顺序的,每个子任务是原子性的,确保它们组合起来能实现总体目标。
-
执行(execute-subtask):按顺序执行子任务,调用AgentShell来执行单一子任务。等待单一子任务执行完毕,获得子任务的执行结果(subtask-result)。
-
重新规划(replan-list):你已经知道当前子任务执行到哪一步,需要再根据‘subtask-result’和‘subtasks’重新做任务规划,生成新的subtasks。任务规划方式同上述的plan-list步骤。
-
执行(execute-subtask):同上述的execute-subtask步骤。
-
最终结果(final):所有子任务执行完毕后,将所有子任务的结果组合起来,生成最终输出,确保输出符合用户的原始任务目标。
特别注意:
-
在plan-list和replan-list这两个步骤中,当你遇到模糊的问题,例如:不清楚操作系统版本、相关工具是否存在等情况,应该将这类模糊事件规划成子任务去做确定。
-
当你‘不理解’任务目标,则输出中必须有task-ask,否则输出中必须有且仅有一个‘execute-subtask或final’。
-
子任务不允许任何改变已有文件和文件夹的操作,包括但不限于:删除、修改、移动、重命名等。
输出格式要求:
所有步骤必须严格使用JSON的格式输出,当有超过1个输出时使用list格式将json作为元素按照顺序输出,JSON支持的关键字如下。
-
step_name, 步骤名称,字符串格式
-
raw_text, 原始内容,字符串格式
-
tool_call, 指定工具名,字符串格式,仅execute-subtask步骤使用
-
tool_args, 指定工具参数,JSON格式,仅execute-subtask步骤使用
AgentShell的调用方式:
- agent_shell(message),返回JSON,如{"step_name":"subtask_result","raw_text":"ok"}。
这是“Plan-And-Execute”执行过程:
a. 启动会话
~/essence-of-AI-engineering# DEBUG=1 uv run AgentPlanAndExecute.py
Welcome to the Plan-And-Execute AI Agent. Type 'exit' to quit.
Enter your task:
b. 发起任务
任务内容是:“请转换视频到音频,输出到相同的文件夹下,文件夹是/workspace”
- AgentPlanAndExecute中大模型收到了任务,分析任务,分解任务到多个子任务。之后,发起了一个执行子任务的行动,可以看出来发起子任务使用的是自然语言。
[AgentPlanAndExecute] [2025-10-14 00:43:46] {
"step_name": "task",
"raw_text": "请转换视频到音频,输出到相同的文件夹下,文件夹是/workspace"
}
[AgentPlanAndExecute] [2025-10-14 00:43:49] [
{
"step_name": "plan-analysis",
"raw_text": "任务目标是将/workspace文件夹下的视频文件转换为音频文件,并输出到同一文件夹。约束条件包括:不能改变已有文件和文件夹(如删除、修改、移动、重命名),因此转换过程应避免覆盖原文件。任务未指定视频格式、音频格式或具体文件名,需要先探索文件夹内容以确定可用的视频文件。"
},
{
"step_name": "plan-list",
"raw_text": "分解任务为以下子任务:1. 列出/workspace文件夹中的视频文件以识别可转换的目标;2. 根据文件列表,逐个转换视频为音频,确保输出文件名不冲突。"
},
{
"step_name": "execute-subtask",
"tool_call": "agent_shell",
"tool_args": {
"message": "列出/workspace文件夹中的所有文件,特别是视频文件(如.mp4、.avi、.mov等),以确定可转换的目标。"
}
}
]
- AgentReAct中大模型收到了子任务,思考并做出了正确行动,它找到了2个视频文件,同时识别其有效性。
[AgentReAct] [2025-10-14 00:43:49] {
"step_name": "task",
"raw_text": "列出/workspace文件夹中的所有文件,特别是视频文件(如.mp4、.avi、.mov等),以确定可转换的目标。"
}
[AgentReAct] [2025-10-14 00:43:50] [
{
"step_name": "thought",
"raw_text": "我需要列出/workspace文件夹中的所有文件,特别是视频文件。这可以通过使用ls命令来实现,并可以结合grep来筛选视频文件。"
},
{
"step_name": "action",
"tool_call": "exec_cmd",
"tool_args": {
"cmd_string": "ls -la /workspace"
},
"raw_text": "我将使用exec_cmd工具来列出/workspace文件夹中的所有文件。"
}
]
[AgentReAct] [2025-10-14 00:43:50] {
"step_name": "observation",
"raw_text": [
0,
"total 62916\ndrwxr-xr-x 2 root root 4096 Oct 14 00:41 .\ndrwxr-xr-x 1 root root 4096 Oct 14 00:41 ..\n-rw-r--r-- 1 root root 64411088 Oct 14 00:25 T-ARA_LittleApple.mp4\n-rw-r--r-- 1 root root 0 Oct 13 18:08 test-invalid.mp4\n-rw-r--r-- 1 root root 0 Oct 13 18:08 test.123",
""
]
}
[AgentReAct] [2025-10-14 00:43:52] [
{
"step_name": "thought",
"raw_text": "从观察结果中,我看到了/workspace文件夹中的文件列表。其中有两个视频文件:T-ARA_LittleApple.mp4(64MB)和test-invalid.mp4(0字节)。test.123文件没有扩展名,可能不是视频文件。现在我可以确定可转换的目标视频文件。"
},
{
"step_name": "final_answer",
"raw_text": "在/workspace文件夹中找到了以下视频文件:\n1. T-ARA_LittleApple.mp4 (64MB) - 有效的视频文件\n2. test-invalid.mp4 (0字节) - 无效的空文件\n\n可转换的目标视频文件是T-ARA_LittleApple.mp4。"
}
]
- AgentPlanAndExecute中大模型会基于子任务结果重新规划多个子任务,之后,发起第一个子任务。
[AgentPlanAndExecute] [2025-10-14 00:43:52] {
"step_name": "subtask_result",
"raw_text": "在/workspace文件夹中找到了以下视频文件:\n1. T-ARA_LittleApple.mp4 (64MB) - 有效的视频文件\n2. test-invalid.mp4 (0字节) - 无效的空文件\n\n可转换的目标视频文件是T-ARA_LittleApple.mp4。"
}
[AgentPlanAndExecute] [2025-10-14 00:43:54] [
{
"step_name": "replan-list",
"raw_text": "基于子任务结果,识别出可转换的视频文件为T-ARA_LittleApple.mp4。重新规划子任务:1. 转换T-ARA_LittleApple.mp4为音频文件,输出到/workspace文件夹,使用不冲突的文件名(如添加_audio后缀)。"
},
{
"step_name": "execute-subtask",
"tool_call": "agent_shell",
"tool_args": {
"message": "将视频文件/workspace/T-ARA_LittleApple.mp4转换为音频文件,输出为/workspace/T-ARA_LittleApple_audio.mp3,确保不修改原文件。"
}
}
]
- AgentReAct执行子任务。
[AgentReAct] [2025-10-14 00:43:54] {
"step_name": "task",
"raw_text": "将视频文件/workspace/T-ARA_LittleApple.mp4转换为音频文件,输出为/workspace/T-ARA_LittleApple_audio.mp3,确保不修改原文件。"
}
...
[AgentReAct] [2025-10-14 00:44:10] [
{
"step_name": "thought",
"raw_text": "目标文件已成功生成,文件大小为3374957字节(约3.3MB),文件类型为MP3音频文件。转换过程成功,原文件未被修改。任务完成。"
},
{
"step_name": "final_answer",
"raw_text": "视频文件已成功转换为音频文件。输出文件为/workspace/T-ARA_LittleApple_audio.mp3,大小为3.3MB,格式为MP3。原文件未被修改。"
}
]
- AgentPlanAndExecute基于所有子任务的结果进行总结,生成最终结果。
[AgentPlanAndExecute] [2025-10-14 00:44:10] {
"step_name": "subtask_result",
"raw_text": "视频文件已成功转换为音频文件。输出文件为/workspace/T-ARA_LittleApple_audio.mp3,大小为3.3MB,格式为MP3。原文件未被修改。"
}
[AgentPlanAndExecute] [2025-10-14 00:44:12] [
{
"step_name": "final",
"raw_text": "任务完成总结:成功将/workspace文件夹中的视频文件T-ARA_LittleApple.mp4转换为音频文件T-ARA_LittleApple_audio.mp3,并输出到同一文件夹。转换过程未改变任何已有文件,符合任务要求。最终输出文件路径为/workspace/T-ARA_LittleApple_audio.mp3。"
}
]
结语
AI-Agent的工程本质是"工作规则"和"工具",任何人都可以定义"工作规则","工作规则"也可称之为"方法论"。用恰当的方法去解决特定场景的任务,它可以让目标的达成更加高效、更加准确。
多个AI-Agents的协作本质上是将"工作"各自聚焦,让专业的AI-Agent做对应专业的事,让各个AI-Agent能单独维护,实现原子操作也更加容易。
我们经常遇见的一些问题:
- 单个AI-Agent的上下文窗口不够用。用多个AI-Agents去分工协作、分解任务,可以解决此问题。
- 单个AI-Agent的思考时间太长,延迟太高。用多个AI-Agents能让上下文消息量变少,让任务更加专注。
- 单个AI-Agent对复杂任务的表现不稳定,易产生"幻觉"。用多个AI-Agents去让擅长者做擅长事,分解后的各个任务目标更加聚焦,执行任务会更加高效和准确。
单个 AI-Agent 是一种从“AI工具”到“AI助手”的范式转移。
多个 AI-Agents 是一种从"万能助手"到"专业团队"的范式转变。