AI-Agents(多智能体)的工程本质:Plan-And-Execute

109 阅读10分钟

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模式定义了三种类型:

  1. Plan-And-Execute

  2. LLMCompiler

  3. ReWOO

我选择第1种类型为切入点来揭示其工程本质、同时也揭开多个AI-Agents协作的工程本质。

工作模式

Plan-And-Execute模式是如何工作的呢?

首先,分析阶段,大模型 会对任务进行分析,从而理解任务目标。

然后,规划阶段,大模型 会将任务分解成多个有顺序的子任务。

接着,执行阶段,大模型 会按顺序去要求Agent执行子任务,Agent 执行子任务后会将结果答复大模型。

之后,重新规划,大模型 会将子任务执行结果和子任务列表重新思考、重新规划,得到一个新的子任务列表。

最终,循环往复,所有子任务执行完毕后,大模型 会将所有子任务的结果组合起来,生成最终结果。

工程本质

由于Plan-And-Execute工作模式的步骤较多,我通过代码来进行演示和阐述。

我使用青云智算平台里的大模型:DeepSeek-V3.1-Terminus

我的项目地址:

github.com/lindongsen/…

这里有两个Agent:

一个是AgentPlanAndExecute,用于规划任务;

一个是AgentReAct,用于执行单一任务。

AgentPlanAndExecute 在运行过程中会调用 AgentReAct 去执行子任务。

这是“Plan-And-Execute”提示词:

你的核心职责是将用户提供的“高级任务”分解为可操作的子任务,制定一个循序渐进的计划,然后协调执行这些子任务。

你有一个辅助工具AgentShell,它可以执行单一、具体的任务。

你的输出应包括完整的计划概述、每个步骤的执行结果以及最终总结。

严格遵循以下步骤:

  1. 任务提交(task):用户会提交一个任务。当用户没有提交任务或任务模糊,请向用户发起询问(task-ask),用户会答复给你task。

  2. 任务分析(plan-analysis):分析任务描述,理解任务目标、上下文信息、任何约束条件。如果任务模糊,请向用户发起询问(task-ask)。

  3. 任务规划(plan-list):分解任务为自然语言描述的一个或多个逻辑子任务(subtasks),这些子任务是有顺序的,每个子任务是原子性的,确保它们组合起来能实现总体目标。

  4. 执行(execute-subtask):按顺序执行子任务,调用AgentShell来执行单一子任务。等待单一子任务执行完毕,获得子任务的执行结果(subtask-result)。

  5. 重新规划(replan-list):你已经知道当前子任务执行到哪一步,需要再根据‘subtask-result’和‘subtasks’重新做任务规划,生成新的subtasks。任务规划方式同上述的plan-list步骤。

  6. 执行(execute-subtask):同上述的execute-subtask步骤。

  7. 最终结果(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”

  1. 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等),以确定可转换的目标。"

    }

  }

]

  1. 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。"

  }

]

  1. 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,确保不修改原文件。"

    }

  }

]

  1. 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。原文件未被修改。"

  }

]

  1. 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 是一种从"万能助手"到"专业团队"的范式转变。