OpenManus 原理浅析(一)——Agent 基本原理
是一个开箱即用的智能体系统,基于 LLM 和工具链实现端到端任务自动化,更接近 “成品应用”。用户可直接通过指令驱动其完成复杂任务,如生成代码、数据分析、网页交互等。本文将简单介绍 OpenManus Agent 是如何运行的。我们希望在了解 OpenManus Agent 工作原理后,能够回答这两个问题。
前言
OpenManus 是一个开箱即用的智能体系统,基于 LLM 和工具链实现端到端任务自动化,更接近 “成品应用”。用户可直接通过指令驱动其完成复杂任务,如生成代码、数据分析、网页交互等。
本文将简单介绍 OpenManus Agent 是如何运行的。我总结下来,一个 Agent 的运行原理,可以总结为如下两个问题:
- Agent 接收任务之后,是如何规划和执行的?
- 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 循环:
- 思考(Thought):面对一个问题,我们需要进行深入的思考。这个思考过程是关于如何定义问题、确定解决问题所需的关键信息和推理步骤。
- 行动(Action):确定了思考的方向后,接下来就是行动的时刻。根据我们的思考,采取相应的措施或执行特定的任务,以期望推动问题向解决的方向发展。
- 观察(Observation):行动之后,我们必须仔细观察结果。这一步是检验我们的行动是否有效,是否接近了问题的答案。
- 循环迭代。
在启动 OpenManus 项目后,会按如下流程执行:
- 实例化 OpenManus Agent 实例,并初始化所有的工具;
- 接收用户的提示词;
- 进入 ReAct 循环,在循环内根据大模型的决策选择调用不同的工具来完成用户的需求;
- 返回结果;
相关类
OpenManus 的工作流程中,有4个类会参与其中,按照继承关系从子到父分别是:Manus -> ToolCallAgent -> ReActAgent -> BaseAgent。除此之外,还有一些工具类也会参与到流程中。
相关类的具体实现细节,将在下一篇文章中解析。
Manus
Manus 是提供用户最终使用的 Agent ,集成了多种工具,包括 Python执行、Google搜索、浏览器操作和文件保存。
在 main.py 中,其实就是先调用 Manus.create() 创建并初始化 agent 示例,然后通过 agent.run(prompt) 方法运行 Agent。
ToolCallAgent
ToolCallAgent 是处理工具调用的 Agent,能够解析 LLM 返回的工具调用并执行。实现了 think 和 act 两个抽象方法(继承自 ReActAgent),从而完成了ReAct模式中的TAO循环。
think 方法负责分析当前状态并决定下一步行动:
- 使用LLM分析当前状态,生成思考结果,这一步会把工具传递给LLM(即采用 Function Call)。
- 根据LLM的响应选择合适的工具。
- 根据不同的工具选择模式(none/auto/required)决定是否需要执行行动。
act 方法负责执行工具调用并处理结果:
4. 遍历执行每个工具调用。
5. 收集和处理工具执行结果。
6. 更新内存中的执行历史。
ReActAgent
ReActAgent 是 BaseAgent 的子类,是实现 推理-行动 模式 Agent 基类,定义了think 和 act 两个抽象方法。
ReActAgent 实现了step 方法,在 step 方法中先后调用 think/act 方法。step 方法会在 BaseAgent 中通过循环不断重复,直到满足退出条件。
BaseAgent
BaseAgent 是一个管理 Agent 状态和执行的抽象基类。提供状态管理、内存管理和执行循环等基础功能。BaseAgent 的子类必须实现 step 方法。
Manus 类上的 run 方法就是继承自 BaseAgent,在 run 方法中,通过 while 循环不断调用 step 方法,直到满足退出条件。
工具
OpenManus 的代码中,关于工具有两种类:
- BaseTool: 所有工具的基类,定义了工具的基本结构和执行接口。
- ToolCollection: 工具集合类,管理多个工具并提供统一的执行接口。
内置的工具包括:
- PythonExecute: 执行Python代码。
- GoogleSearch: 执行Google搜索。
- BrowserUseTool: 浏览器操作。
- FileSaver: 文件保存。
- Terminate: 终止执行。
工作流程图
OpenManus 的工作流程如下:
整体看下来还是比较清晰简单的。
关键实现
TAO循环
一开始,我们提出了一个问题“Agent 接收任务之后,是如何规划和执行的?”,现在知道 OpenManus 的 Agent 是按照 ReAct 框架执行,其工作流程可以概括为 TAO 循环。那么其规划和执行就需要分析 TAO 循环中每一步是如何运行的。
思考 Thought
在每次 TAO 循环中,会先调用 ToolCallAgent 实现的 think 方法,该方法实际通过 Function Call 的方式调用LLM,由 LLM 决策是否调用工具?调用什么工具?
可用的工具在 Manus 类中定义,其实就是上文提到的 5 个内置工具。
think 方法返回布尔值是否需要调用工具。
行动 Action
如果需要调用工具,则由 ToolCallAgent 实现的 act 方法调用具体的工具。
观察 Observation
think 和 act 方法会将 LLM 的返回、工具执行结果添加到内存的记忆中。在下一次 TAO 循环中, think 方法会将序列化好的记忆传递给 LLM,由 LLM 根据执行情况决定下一步操作。
循环终止条件
OpenManus TAO 循环有两种终止条件:
- 循环次数达到限制,次数限制在 ToolCallAgent 设置为 30 次。
- 任务达到完成状态,OpenManus 有一个内置的工具 Terminate,当这个工具在用户需求得到满足或 Agent 无法继续执行任务时调用。在每次调用工具后,ToolCallAgent 会判断调用的工具是否是 Terminate。如果是,则将 Agent 状态修改为结束,进而退出 TAO 循环。
参考
更多推荐



所有评论(0)