【Agent】OpenManus-Agent架构详细分析

各组件详细设计见:

  • BaseAgent:BaseAgent
  • ReActAgent:ReActAgent
  • ToolCallAgent:ToolCallAgent
  • 具体Agent实现:具体Agent
  • Memory数据结构:Memory

1. 智能体层次结构

OpenManus 采用了一个多层次的智能体继承结构,形成了清晰的能力分层:

BaseAgent (抽象基类)↓
ReActAgent (思考-行动循环)↓
ToolCallAgent (工具调用能力)↓
具体智能体实现:- Manus (通用智能体)- PlanningAgent (规划智能体)- SWEAgent (软件工程智能体)

2. 核心组件设计

2.1 BaseAgent (基础代理)

设计特点

  • 使用 Pydantic 支持数据验证和序列化
  • 实现了状态管理、内存管理和执行循环的基础功能
  • 提供了上下文管理器 state_context 用于安全的状态转换
  • 实现了 run 方法作为主要执行入口
  • 定义了 step 抽象方法,要求子类实现
  • 包含循环检测和处理机制

关键属性

  • name: 智能体名称
  • description: 智能体描述
  • system_prompt: 系统级指令提示
  • next_step_prompt: 下一步行动提示
  • llm: 语言模型实例
  • memory: 内存存储
  • state: 当前状态
  • max_steps: 最大步骤数
  • current_step: 当前步骤

调用逻辑

a. 通过 run 方法启动智能体

b. 使用 state_context 管理状态转换

c. 循环执行 step 方法直到达到终止条件

d. 检测并处理循环状态

e. 返回执行结果

2.2 ReActAgent (思考-行动代理)

设计特点

  • 实现了 ReAct (Reasoning and Acting) 模式
  • step 方法分解为 thinkact 两个抽象方法
  • 提供了思考-行动循环的基本框架

关键方法

  • think: 抽象方法,处理当前状态并决定下一步行动
  • act: 抽象方法,执行决定的行动
  • step: 实现了单个思考-行动周期

调用逻辑

a. step 方法首先调用 think 方法

b. 如果 think 返回 True,则调用 act 方法

c. 返回执行结果

2.3 ToolCallAgent (工具调用代理)

设计特点

  • 扩展了 ReActAgent,专注于工具调用能力
  • 实现了与 LLM 的工具调用接口集成
  • 支持多种工具选择模式:none、auto、required
  • 提供了工具执行和结果处理机制
  • 支持特殊工具处理(如终止工具)

关键属性

  • available_tools: 可用工具集合
  • tool_choices: 工具选择模式
  • special_tool_names: 特殊工具名称列表
  • tool_calls: 当前工具调用列表

关键方法

  • think: 这个方法的核心是与 LLM 交互,获取其决策,并根据不同的工具选择模式决定下一步操作

  • act: 执行 LLM 决定使用的工具,并处理执行结果

    • 如果没有工具调用且工具选择模式为 ToolChoice.REQUIRED,则抛出异常

    • 如果没有工具调用,返回最后一条消息的内容

    • 对每个工具调用,执行 execute_tool 方法并获取结果

    • 如果设置了 max_observe,限制结果的长度

    • 记录工具执行完成的日志

    • 将工具响应添加到内存中

    • 返回所有结果的组合字符串

  • execute_tool: 执行单个工具调用

  • _handle_special_tool: 处理特殊工具执行

调用逻辑

a. think 方法向 LLM 发送消息并获取响应

b. 解析响应中的工具调用

c. 将响应添加到内存中

d. act 方法执行工具调用

e. 处理工具执行结果

f. 检查特殊工具并更新状态

2.4 Manus (通用智能体)

设计特点

  • 继承自 ToolCallAgent,是项目的主要智能体
  • 配置了多种工具:PythonExecute、WebSearch、BrowserUseTool、FileSaver、Terminate
  • 使用特定的系统 prompt 和下一步 prompt
  • 重写了特殊工具处理方法,确保浏览器资源清理

关键属性

  • max_observe: 限制 tool call的长度
  • max_steps: 设置为 20 步

复写_handle_special_tool()

  • 检查工具是否为特殊工具
  • 如果是特殊工具,清理浏览器资源
  • 调用父类的 _handle_special_tool() 方法

2.5 PlanningAgent (规划智能体)

设计特点

  • 继承自 ToolCallAgent,专注于任务规划
  • 使用 PlanningTool 创建和管理结构化计划
  • 跟踪计划步骤的执行状态
  • 支持计划创建、更新和执行

额外属性

  • active_plan_id: 当前活动计划的 ID
  • step_execution_tracker: 步骤执行跟踪器
  • current_step_index: 当前步骤索引

复写方法

  • run

    • 如果提供了请求,创建初始计划

    • 调用父类的 run() 方法

  • think

    • 获取当前计划状态并添加到提示中
    • 获取当前步骤索引
    • 调用父类的 think() 方法
    • 将工具调用与当前步骤关联以进行跟踪
  • act:

    • 调用父类的 act() 方法执行工具
    • 更新工具执行状态为已完成
    • 如果是非规划、非特殊工具,更新计划状态

额外实现方法

  • get_plan: 获取当前计划

  • update_plan_status: 更新计划状态

  • _get_current_step_index(): 解析当前计划以识别第一个未完成步骤的索引

  • create_initial_plan: 创建初始计划

调用逻辑

  1. 初始化时创建计划 ID 并验证工具
  2. 首次运行时创建初始计划
  3. 执行计划步骤并更新状态
  4. 跟踪计划进度直到完成

2.6 SWEAgent (软件工程智能体)

设计特点

  • 继承自 ToolCallAgent,专注于软件工程任务
  • 配置了 Bash、StrReplaceEditor 和 Terminate 工具
  • 跟踪工作目录状态

关键属性

  • max_step: 30

额外属性

  • bash: Bash 工具实例
  • working_dir: 当前工作目录

复写 think

  • 更新当前工作目录
  • 使用当前工作目录格式化 next_step_prompt
  • 调用父类的 think() 方法

3. 智能体调用流程

3.1 初始化流程

  1. 智能体创建

    agent = Manus()  # 或其他具体智能体
    
  2. 初始化验证

    • 通过 Pydantic 的 model_validator 进行初始化验证
    • 设置默认 LLM 和内存实例
    • 验证必要的工具和配置

3.2 执行流程

  1. 启动执行

    result = await agent.run(prompt)
    
  2. 状态管理

    • 使用 state_context 将状态设置为 RUNNING
    • 执行完成后恢复状态或设置为 FINISHED
  3. 执行循环

    while current_step < max_steps and state != FINISHED:current_step += 1step_result = await step()check_for_stuck_state()
    
  4. 思考-行动循环

    async def step():should_act = await think()if should_act:return await act()
    
  5. 工具调用流程

    async def think():response = await llm.ask_tool(messages, tools, tool_choice)parse_tool_calls(response)add_to_memory(response)async def act():for command in tool_calls:result = await execute_tool(command)add_to_memory(result)
    
  6. 特殊工具处理

    if tool_name in special_tool_names:if should_finish_execution():state = FINISHED
    

3.3 内存管理

  1. 消息添加

    agent.update_memory("user", "用户输入")
    agent.update_memory("assistant", "助手响应")
    agent.update_memory("tool", "工具结果", tool_call_id="工具ID")
    
  2. 消息访问

    messages = agent.messages  # 获取所有消息
    

3.4 工具集成

  1. 工具注册

    available_tools = ToolCollection(PythonExecute(), WebSearch(), BrowserUseTool(), FileSaver(), Terminate()
    )
    
  2. 工具执行

    result = await available_tools.execute(name="tool_name", tool_input=args)
    

4. 设计模式应用

4.1 模板方法模式

  • BaseAgent 定义了算法骨架 (run)
  • 子类实现特定步骤 (step, think, act)

4.2 策略模式

  • 不同的智能体实现不同的策略
  • 通过继承和多态实现策略选择

4.3 组合模式

  • ToolCollection 管理多个工具
  • 提供统一的接口执行工具

4.4 观察者模式

  • 状态变化和事件处理
  • 工具执行结果通知

4.5 命令模式

  • 工具调用封装为命令对象
  • 支持命令执行和结果处理

5. 扩展性设计

5.1 智能体扩展

  • 可以通过继承 BaseAgent 或其子类创建新的智能体
  • 只需实现必要的抽象方法

5.2 工具扩展

  • 通过 ToolCollection 可以灵活添加新工具
  • 智能体可以动态配置可用工具

5.3 提示词扩展

  • 系统提示和下一步提示可以自定义
  • 支持特定领域的提示词模板

6. 错误处理机制

6.1 异常捕获

  • thinkact 方法中捕获异常
  • 记录错误并添加到内存中

6.2 状态恢复

  • 使用 state_context 确保状态正确恢复
  • 异常时设置为 ERROR 状态

6.3 循环检测

  • 实现了 is_stuck 方法检测重复响应
  • 通过 handle_stuck_state 添加提示改变策略

7. 性能考虑

7.1 异步设计

  • 所有关键方法都使用 async/await 实现
  • 支持非阻塞 I/O 操作

7.2 资源管理

  • 特殊工具处理确保资源清理
  • 浏览器工具在终止时自动清理

7.3 步骤限制

  • 通过 max_steps 限制执行步骤
  • 防止无限循环和资源耗尽

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36781.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束&#xff0c;通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中&#xff0c;但仍有差距存在&#xff0c;尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地&#xff0c;解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中&#xff0c;我将对 SQLMesh 进行简…

基于Babylon.js的Shader入门之五:让Shader支持法线贴图

如果一个比较平坦的物体表面要添加更多的凹凸细节&#xff0c;但是我们又不想通过建模实现&#xff0c;这时候法线贴图就派上用场了。法线贴图是通过与灯光的交互来让一个平坦表面造成凹凸效果假象的&#xff0c;在基于Babylon.js的Shader入门之四&#xff1a;让Shader支持基础…

活码在实际操作中的具体场景有哪些?怎么应用?

当传统二维码因“内容固定、无法追踪、流量拥堵”等问题逐渐失效时&#xff0c;活码正在成为企业破解运营痛点的关键工具。 无论是需要实时更新内容的线下物料&#xff0c;还是面临用户分流压力的线上客服&#xff0c;动态二维码都能通过“一码多用、灵活配置”的特性&#xf…

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于&#xff0c;他不是那种标…

Wireshark:在 显示过滤器中“加入条件”过滤后,出现其他类型的数据包,为什么?

一、 在Wireshark中使用“tcp协议”过滤后&#xff0c;仍出现TLSv1.2协议的数据包&#xff0c;原因如下&#xff1a; 1. ‌协议层次关系‌ ‌TCP是传输层协议‌&#xff0c;而‌TLS属于应用层协议‌&#xff0c;后者直接运行于TCP之上‌28。因此&#xff0c;所有TLS流量&…

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 大语言模型的使用2.2 可读性标准2.3 统计分析 3. 结果3.1 Bezirci-Yılmaz可读性评分3.2 Ateşman可读性评分3.3 全面性评分3.4 准确性评分 4. 讨论4.1 可读…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy&#xff08;抽象策略类&#xff09;​ Context&#xff08;环境类 / 上下文类&#xff09;​ ConcreteStrategy&#xff08;具体策略类&#xff09;​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展&#xff0c;服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读&#xff0c;探讨未来几年内该行业的…

【大语言模型_6】mindie启动模型错误整理

一、启动报 [hccl_runner.cpp:141] AllGatherHcclRunner:0 HcclCommInitRootInfo fa il, error:2, rank:0, rankSize:2 背景&#xff1a;运行DeepSeek-R1-Distill-Qwen-14B模型&#xff0c;在2张300 P卡可以运行&#xff0c;单独一张启动报以上错误。 问题分析&…

STM32F429单片机FMC接口驱动TFT LCD和SDRAM

1、FMC接口介绍 FMC 接口&#xff08;即可变存储控制器&#xff09;是一种用于管理外部存储器的外设接口&#xff0c;支持多种类型的存储器&#xff0c;主要分为三大类&#xff1a;NOR/SRAM/PSRAM设备&#xff08;TFTLCD相当于SRAM&#xff09;、NOR FLASH/NAND FLASH/PC卡设备…

ollama不安装到c盘,安装到其他盘

ollama 安装包默认安装到c盘&#xff0c;安装程序并没有提供选择文件夹安装功能&#xff0c;本来c盘就快满了&#xff0c;下几个模型c盘都快爆了&#xff0c;如何将ollma安装到其他盘呢&#xff1f; ollama 默认安装位置 C:\Users\Admin\.ollama 是 Ollama 用来放大模型的文件夹…

java项目之基于ssm的少儿编程在线培训系统(源码+文档)

项目简介 少儿编程在线培训系统实现了以下功能&#xff1a; 用户信息管理&#xff1a; 用户信息新增 用户信息修改 教师信息管理&#xff1a; 教师信息添加 教师信息删除 教师信息修改 课程信息管理&#xff1a; 课程信息添加 课程信息修改 课程信息删除 课程类型管理&…

Cinema4D安装及基本操作

一、简介 Cinema 4D&#xff08;C4D&#xff09;是德国 Maxon Computer 开发的 3D 软件&#xff0c;具备强大的建模、动画、材质、渲染功能&#xff0c;以易用高效著称&#xff0c;广泛应用于影视、游戏、设计等领域&#xff0c;是行业内主流 3D 创作工具。 二、安装 1.下载安…

为什么TCP需要三次握手?一次不行吗?

文章目录 1. 三次握手的过程2. 为什么需要三次握手&#xff1f;3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手&#xff0c;而不是两次或四次&#xff1f;6. 三次握手中的序列号有什么作用&#xff1f;7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…

大数据在人力资源管理中的洞察与决策

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化转型浪潮中&#xff0c;人力资源管理&#xff08;HRM&#xff09;正经历着前所未有的变革。…

让vscode远程开发也可以图形显示

目录 0. 摘要1. 保存查看2. jupyter内置inline渲染3. jupyter浏览器4. matplot修改后端5. SSH X11转发[※]6. 参考 0. 摘要 vscode登录远程服务器进行开发遇到图形显示需求时&#xff0c;该怎么处理&#xff1f;一般有几种方式&#xff1a; 保存下来查看jupyter内置的inline图…

Blender制作次表面材质

效果: 主要用沃罗诺伊纹理做出云絮感 然后EV开启次表面设置

服务器数据恢复—服务器raid故障导致上层分区不可用的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器中有一组由三块SAS硬盘组建的raid阵列。服务器上部署的数据库存储在D分区&#xff0c;数据库备份存储在E分区。 服务器上一块硬盘指示灯显示红色。D分区不可识别。E分区虽然可以识别&#xff0c;但是E分区拷贝文件报错。 管…

PyTorch PINN实战:用深度学习求解微分方程

神经网络技术已在计算机视觉与自然语言处理等多个领域实现了突破性进展。然而在微分方程求解领域&#xff0c;传统神经网络因其依赖大规模标记数据集的特性而表现出明显局限性。物理信息神经网络(Physics-Informed Neural Networks, PINN)通过将物理定律直接整合到学习过程中&a…