前言

OpenManus 是一个开箱即用的智能体系统,基于 LLM 和工具链实现端到端任务自动化,更接近 “成品应用”。用户可直接通过指令驱动其完成复杂任务,如生成代码、数据分析、网页交互等。
本文将简单介绍 OpenManus Agent 是如何运行的。我总结下来,一个 Agent 的运行原理,可以总结为如下两个问题:

  1. Agent 接收任务之后,是如何规划和执行的?
  2. Agent 是如何判断任务达到完成状态的?

我们希望在了解 OpenManus Agent 工作原理后,能够回答这两个问题。

项目目录

OpenManus 项目中关键目录和文件有这些:

OpenManus/
├── app/                    # 核心应用目录
│   ├── agent/             # 智能体实现模块
│   │   ├── base.py        # 基础智能体接口定义
│   │   ├── manus.py       # 主要智能体实现
│   │   ├── planning.py    # 任务规划模块
│   │   ├── react.py       # 反应式决策模块
│   │   ├── swe.py         # 软件工程相关能力
│   │   └── toolcall.py    # 工具调用处理模块
│   ├── flow/              # 流程控制模块
│   │   ├── base.py        # 流程管理基础类
│   │   ├── flow_factory.py # 流程工厂
│   │   └── planning.py     # 任务规划流程
│   ├── tool/              # 工具集合模块
│   │   ├── base.py        # 工具基础接口
│   │   ├── browser_use_tool.py  # 浏览器操作工具
│   │   ├── file_saver.py  # 文件操作工具
│   │   ├── google_search.py # 搜索工具
│   │   └── python_execute.py # Python代码执行工具
│   ├── prompt/            # 系统提示词模块
│   │   ├── manus.py       # Manus智能体提示词
│   │   ├── planning.py    # 规划相关提示词
│   │   └── toolcall.py    # 工具调用提示词
│   └── config.py          # 配置管理
├── config/                # 配置文件目录
│   ├── config.example.toml # 配置文件示例
│   └── config.toml        # 实际配置文件
├── main.py               # 主程序入口
├── run_flow.py           # 流程运行脚本
├── setup.py              # 项目安装配置
└── requirements.txt      # 项目依赖列表

基本框架

OpenManus 以 ReAct 框架作为基本框架。所谓的 ReAct 框架(Reasoning-Acting)是一种将推理(Reasoning)和行动(Action)相结合的框架,其中:

  • Reasoning 包括了对当前环境和状态的观察,并生成推理轨迹。这使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。
  • Acting 在于指导大模型采取下一步的行动,比如与外部源(如知识库或环境)进行交互并且收集信息,或者给出最终答案。

ReAct 的典型流程可以用一个循环来描述:

思考(Thought)→ 行动(Action)→ 观察(Observation)→ 思考(Thought)→ ...  → 最终答案

如上循环即是 TAO 循环:

  1. 思考(Thought):面对一个问题,我们需要进行深入的思考。这个思考过程是关于如何定义问题、确定解决问题所需的关键信息和推理步骤。
  2. 行动(Action):确定了思考的方向后,接下来就是行动的时刻。根据我们的思考,采取相应的措施或执行特定的任务,以期望推动问题向解决的方向发展。
  3. 观察(Observation):行动之后,我们必须仔细观察结果。这一步是检验我们的行动是否有效,是否接近了问题的答案。
  4. 循环迭代。

在启动 OpenManus 项目后,会按如下流程执行:

  1. 实例化 OpenManus Agent 实例,并初始化所有的工具;
  2. 接收用户的提示词;
  3. 进入 ReAct 循环,在循环内根据大模型的决策选择调用不同的工具来完成用户的需求;
  4. 返回结果;

相关类

OpenManus 的工作流程中,有4个类会参与其中,按照继承关系从子到父分别是:Manus -> ToolCallAgent -> ReActAgent -> BaseAgent。除此之外,还有一些工具类也会参与到流程中。

相关类的具体实现细节,将在下一篇文章中解析。

Manus

Manus 是提供用户最终使用的 Agent ,集成了多种工具,包括 Python执行、Google搜索、浏览器操作和文件保存。
在 main.py 中,其实就是先调用 Manus.create() 创建并初始化 agent 示例,然后通过 agent.run(prompt) 方法运行 Agent。

ToolCallAgent

ToolCallAgent 是处理工具调用的 Agent,能够解析 LLM 返回的工具调用并执行。实现了 thinkact 两个抽象方法(继承自 ReActAgent),从而完成了ReAct模式中的TAO循环。

think 方法负责分析当前状态并决定下一步行动:

  1. 使用LLM分析当前状态,生成思考结果,这一步会把工具传递给LLM(即采用 Function Call)。
  2. 根据LLM的响应选择合适的工具。
  3. 根据不同的工具选择模式(none/auto/required)决定是否需要执行行动。

act 方法负责执行工具调用并处理结果:
4. 遍历执行每个工具调用。
5. 收集和处理工具执行结果。
6. 更新内存中的执行历史。

ReActAgent

ReActAgent 是 BaseAgent 的子类,是实现 推理-行动 模式 Agent 基类,定义了thinkact 两个抽象方法。

ReActAgent 实现了step 方法,在 step 方法中先后调用 think/act 方法。step 方法会在 BaseAgent 中通过循环不断重复,直到满足退出条件。

BaseAgent

BaseAgent 是一个管理 Agent 状态和执行的抽象基类。提供状态管理、内存管理和执行循环等基础功能。BaseAgent 的子类必须实现 step 方法。

Manus 类上的 run 方法就是继承自 BaseAgent,在 run 方法中,通过 while 循环不断调用 step 方法,直到满足退出条件。

工具

OpenManus 的代码中,关于工具有两种类:

  • BaseTool: 所有工具的基类,定义了工具的基本结构和执行接口。
  • ToolCollection: 工具集合类,管理多个工具并提供统一的执行接口。

内置的工具包括:

  1. PythonExecute: 执行Python代码。
  2. GoogleSearch: 执行Google搜索。
  3. BrowserUseTool: 浏览器操作。
  4. FileSaver: 文件保存。
  5. Terminate: 终止执行。

工作流程图

OpenManus 的工作流程如下:

整体看下来还是比较清晰简单的。

关键实现

TAO循环

一开始,我们提出了一个问题“Agent 接收任务之后,是如何规划和执行的?”,现在知道 OpenManus 的 Agent 是按照 ReAct 框架执行,其工作流程可以概括为 TAO 循环。那么其规划和执行就需要分析 TAO 循环中每一步是如何运行的。

思考 Thought

在每次 TAO 循环中,会先调用 ToolCallAgent 实现的 think 方法,该方法实际通过 Function Call 的方式调用LLM,由 LLM 决策是否调用工具?调用什么工具?

可用的工具在 Manus 类中定义,其实就是上文提到的 5 个内置工具。

think 方法返回布尔值是否需要调用工具。

行动 Action

如果需要调用工具,则由 ToolCallAgent 实现的 act 方法调用具体的工具。

观察 Observation

thinkact 方法会将 LLM 的返回、工具执行结果添加到内存的记忆中。在下一次 TAO 循环中, think 方法会将序列化好的记忆传递给 LLM,由 LLM 根据执行情况决定下一步操作。

循环终止条件

OpenManus TAO 循环有两种终止条件:

  1. 循环次数达到限制,次数限制在 ToolCallAgent 设置为 30 次。
  2. 任务达到完成状态,OpenManus 有一个内置的工具 Terminate,当这个工具在用户需求得到满足或 Agent 无法继续执行任务时调用。在每次调用工具后,ToolCallAgent 会判断调用的工具是否是 Terminate。如果是,则将 Agent 状态修改为结束,进而退出 TAO 循环。

参考

一文读懂:OpenManus 智能体
Manus平替OpenManus源码分析系列文章

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐