祛魅 Manus ,从 0 到 1 开源实现

news2025/3/10 6:09:51

背景介绍

Manus 是最近一个现象级的大模型 Agent 工具,自从发布以来,被传出各种神乎其神的故事,自媒体又开始炒作人类大量失业的鬼故事,Manus 体验码也被炒作为 10w 的高价。

之后又出现反转,被爆出实际体验效果不佳,存在造假的问题,Manus在X平台的账号被冻结。沟通之后,3月8日,Manus官方X账号又被解冻。

Manus 的故事一波三折,开源社区也没有闲着,MetaGPT 团队在 Manus 发布后 3 小时就开源了 OpenManus,短短两天 Star 数量一路飙升,截止目前已经 15k+ 的 Star。本文就从开源方案来深入了解 Manus,祛魅自主 Agent 工具。

Agent 介绍

通用型AI Agent(智能体)产品的起源可以追溯到人工智能领域对"自主执行任务"能力的探索。这类产品不仅需要理解用户需求,还需具备规划、调用工具、执行复杂任务的能力。

这类产品最早的探索可以追溯到2023年,AutoGPT(2023年4月)是这个领域的开创性项目。它首次将大语言模型(LLM)与自主任务执行能力结合,开创了 AI Agent 的新范式。用户只需通过自然语言设定目标,模型就能自动分解任务、调用网络搜索和代码执行等工具,尝试完成复杂目标(如市场调研、代码生成等)。虽然受限于当时大模型的能力没能完全实现自主Agent的设想,但AutoGPT为后续Agent工具的发展奠定了基础。目前AutoGPT在Github上的Star数量依旧遥遥领先,已达173k+。

Agent 方案的设想目前来看很合理,大模型拥有类似人类大脑的思考能力,但是人类在解决实际问题时,不仅需要大脑思考,还需要双手来完成任务。而 Agent 方案的设想,就是让大模型来思考和规划,然后调用大量外部工具来完成任务。对应的架构如下所示:

请添加图片描述

在单一 Agent 之后又发展出 Multi-Agent 的方案,Multi-Agent 的方案可以理解为单 Agent 的升级版,单 Agent 是让大模型来思考和规划,然后调用大量外部工具来完成任务。而 Multi-Agent 是让多个大模型来分工合作,共同完成任务。本文介绍的 OpenManus 属于单 Agent 的方案,后续有机会再介绍 Multi-Agent 的方案。

实现方案

目前单一 Agent 的实现方案主要有以下两种:

  1. ReAct (Reasoning + Acting) 框架
  • 实现逻辑:将任务分解为思考(Reasoning)和行动(Acting)两个交替进行的阶段。通过少样本Prompt引导大模型生成思考链(Thought Chain),确定下一步行动,执行工具调用(Action),观察结果并迭代优化。

  • 优势:

    • 决策过程透明可解释
    • 工具调用灵活,可动态调整策略
    • 适合需要复杂推理的任务
  • 劣势:

    • 每个步骤都需要LLM参与,token消耗大
    • 容易在复杂任务中陷入循环
    • 执行效率相对较低
  1. Plan-and-Execute 框架
  • 实现逻辑:将任务分为规划(Planning)和执行(Execution)两个明确的阶段。首先生成完整的任务执行计划(通常是DAG图),然后按计划批量执行子任务。

  • 优势:

    • 显著减少LLM调用次数,降低成本
    • 任务执行更加高效
    • 适合步骤明确的复杂任务
  • 劣势:

    • 对初始规划的准确性要求高
    • 难以处理高度动态的任务
    • 子任务间的依赖关系复杂时容易失败

在 OpenManus 中,简单版本实现的是 ReAct 框架,复杂版本实现的是 Plan-and-Execute 框架。分别对应于 Github 提到的 main.pyrun_flow.py 入口。截止目前 ReAct 版本完成度较高, Plan-and-Execute 版本还比较原始。本文主要介绍 ReAct 部分的流程。

核心实现细节

ReAct框架的实现遵循"思考-行动-观察"的循环模式:

请添加图片描述
核心流程包括:

  1. 思考(Reasoning):分析当前状态,确定下一步行动
  2. 行动(Acting):执行选定的工具调用
  3. 观察(Observation):收集执行结果,更新状态
  4. 重复以上步骤直至任务完成
执行流程

核心执行流程的实现在 app/agent/base.py 中可以看到,就是一个简单的循环,在执行过程中重复执行 step() 方法,直到任务完成。

async def run(self, request: Optional[str] = None) -> str:
    if request:
        self.update_memory("user", request)

    results: List[str] = []
    async with self.state_context(AgentState.RUNNING):
        while (
            self.current_step < self.max_steps and self.state != AgentState.FINISHED
        ):
            self.current_step += 1

            # 重复执行 step 直到任务完成

            step_result = await self.step()

            # 如果陷入死循环,则进行处理

            if self.is_stuck():
                self.handle_stuck_state()

            results.append(f"Step {self.current_step}: {step_result}")

        # 如果达到最大步数,则结束,避免在无法解决的问题上浪费过多 token

        if self.current_step >= self.max_steps:
            results.append(f"Terminated: Reached max steps ({self.max_steps})")

    return "\n".join(results) if results else "No steps executed"

在单个 step() 方法中,主要就是执行推理 think() 和行动 act() 两个环节。可以看到对应的实现如下所示:

async def step(self) -> str:
    # 推理环节

    should_act = await self.think()
    if not should_act:
        return "Thinking complete - no action needed"
    # 行动环节

    return await self.act()

推理环节

ReAct 推理环节主要用于确定下一步执行的动作,在 OpenManus 中,下一步动作会从下面几个可选动作中进行选择:

  • PythonExecute() :执行 Python 代码
  • GoogleSearch() :执行 Google 搜索
  • BrowserUseTool() :执行浏览器操作
  • FileSaver() :保存文件
  • Terminate() :终止

如何基于大模型确定具体执行的动作呢?主要基于 OpenAI 提供的 标准方案 ,通过 tools 使用标准格式传入所有可选的工具列表,之后大模型会根据当前的上下文选择一个最合适的工具。对应的实现如下所示:


async def think(self) -> bool:
    if self.next_step_prompt:
        user_msg = Message.user_message(self.next_step_prompt)
        self.messages += [user_msg]

    # 调用大模型,传入所有可选的工具列表,之后大模型会根据当前的上下文选择一个最合适的工具

    response = await self.llm.ask_tool(
        messages=self.messages,
        system_msgs=[Message.system_message(self.system_prompt)]
        if self.system_prompt
        else None,
        tools=self.available_tools.to_params(),
        tool_choice=self.tool_choices,
    )
    self.tool_calls = response.tool_calls

行动环节

行动环节主要用于执行具体的动作,在 OpenManus 中,执行动作的实现如下所示:


async def act(self) -> str:
    results = []
    # 执行推理环节确定的所有工具调用

    for command in self.tool_calls:
        result = await self.execute_tool(command)

        # 将工具调用的结果保存起来,对应于上面的流程中的观察反馈

        tool_msg = Message.tool_message(
            content=result, tool_call_id=command.id, name=command.function.name
        )
        self.memory.add_message(tool_msg)
        results.append(result)

    return "\n\n".join(results)

总结

通过深入分析OpenManus的源码实现,我们可以看到它本质上是ReAct框架的一个标准实现,与早期的 AutoGPT 的实现原理类似,希望本文帮助大家祛魅 Agent 工具。类似的 Agent 工具依旧存在一些明显的挑战:

  • Token消耗优化问题
  • 复杂任务的循环处理
  • 长期记忆管理

随着大模型能力的提升和工具生态的完善,Agent技术必将在特定场景发挥重要作用。但是因为一个 Manus 的出现就惊呼人类要大面积失业,其实大可不必。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门——输入输出、缺省参数

C入门——输入输出、缺省参数 一、C标准库——命名空间 std C标准库std是一个命名空间&#xff0c;全称为"standard"&#xff0c;其中包括标准模板库&#xff08;STL&#xff09;&#xff0c;输入输出系统&#xff0c;文件系统库&#xff0c;智能指针与内存管理&am…

Spring Boot应用开发:从零到生产级实战指南

Spring Boot应用开发&#xff1a;从零到生产级实战指南 Spring Boot应用开发&#xff1a;从零到生产级实战指南一、Spring Boot的核心价值二、快速构建第一个Spring Boot应用2.1 使用Spring Initializr初始化项目2.2 项目结构解析2.3 编写第一个REST接口 三、Spring Boot的核心…

【2025前端高频面试题——系列一之MVC和MVVM】

前端高频面试题——系列一之MVC和MVVM 前言一、MVC的基本逻辑二、MVVM的基本逻辑总结 提示&#xff1a;片尾总结了要点&#xff0c;硬背的话直接跳到最后 前言 相信持续关注我文章的小伙伴知道我之前就MVC和MVVM做过较为详细的讲解&#xff0c;但是我发现&#xff0c;他依旧是…

基于遗传算法的IEEE33节点配电网重构程序

一、配电网重构原理 配电网重构&#xff08;Distribution Network Reconfiguration, DNR&#xff09;是一项优化操作&#xff0c;旨在通过改变配电网中的开关状态&#xff0c;优化电力系统的运行状态&#xff0c;以达到降低网损、均衡负载、改善电压质量等目标。配电网重构的核…

容器编排革命:从 Docker Run 到 Docker Compose 的进化之路20250309

容器编排革命&#xff1a;从 Docker Run 到 Docker Compose 的进化之路 一、容器化部署的范式转变 在 Docker 生态系统的演进中&#xff0c;容器编排正从“手动操作”走向“自动化管理”。根据 Docker 官方 2023 年开发者调查报告&#xff0c;78% 的开发者已采用 Docker Compo…

【高并发内存池】释放内存 + 申请和释放总结

高并发内存池 1. 释放内存1.1 thread cache1.2 central cache1.3 page cache 2. 申请和释放剩余补充 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x…

自然语言处理:最大期望值算法

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文简称为EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型参数的过程分成…

Python绘制数据分析中经典的图形--列线图

Python绘制数据分析中经典的图形–列线图 列线图是数据分析中的经典图形&#xff0c;通过背后精妙的算法设计&#xff0c;展示线性模型&#xff08;logistic regression 和Cox&#xff09;中各个变量对于预测结果的总体贡献&#xff08;线段长短&#xff09;&#xff0c;另外&…

11. 盛最多水的容器(力扣)

11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不…

vue3 vite或者vue2 百度地图(卫星图)离线使用详细讲解

1、在Windows上下载瓦片&#xff0c;使用的工具为: 全能电子地图下载器3.0最新版&#xff08;推荐&#xff09; 下载后解压&#xff0c;然后进入目录"全能电子地图下载器3.0最新版&#xff08;推荐&#xff09;\全能电子地图下载器3.0\MapTileDownloader" 在这个目录…

大语言模型从理论到实践(第二版)-学习笔记(绪论)

大语言模型的基本概念 1.理解语言是人工智能算法获取知识的前提 2.语言模型的目标就是对自然语言的概率分布建模 3.词汇表 V 上的语言模型&#xff0c;由函数 P(w1w2 wm) 表示&#xff0c;可以形式化地构建为词序列 w1w2 wm 的概率分布&#xff0c;表示词序列 w1w2 wm…

Unity 通用UI界面逻辑总结

概述 在游戏开发中&#xff0c;常常会遇到一些通用的界面逻辑&#xff0c;它不论在什么类型的游戏中都会出现。为了避免重复造轮子&#xff0c;本文总结并提供了一些常用UI界面的实现逻辑。希望可以帮助大家快速开发通用界面模块&#xff0c;也可以在次基础上进行扩展修改&…

Navigation的进阶知识与拦截器配置

Navigation的进阶知识与拦截器配置 写的不是很详细&#xff0c;后续有时间会补充&#xff0c;建议参考官方文档食用 1.如何配置路由信息 1.1 创建工程结构 src/main/ets ├── pages │ └── navigation │ ├── views │ │ ├── Mine.ets //…

Java数据结构第二十一期:解构排序算法的艺术与科学(三)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、常见排序算法的实现 1.1. 归并排序 二、排序算法复杂度及稳定性分析 一、常见排序算法的实现 1.1. 归并排序 归并排序是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法的一个⾮常典型的…

go切片定义和初始化

1.简介 切片是数组的一个引用&#xff0c;因此切片是引用类型&#xff0c;在进行传递时&#xff0c;遵守引用传递的机制。切片的使用和数组类似&#xff0c;遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的&#xff0c;因此切片是一个可以动态变化的数…

【NLP 39、激活函数 ⑤ Swish激活函数】

我的孤独原本是座荒岛&#xff0c;直到你称成潮汐&#xff0c;原来爱是让个体失序的永恒运动 ——25.2.25 Swish激活函数是一种近年来在深度学习中广泛应用的激活函数&#xff0c;由Google Brain团队在2017年提出。其核心设计结合了Sigmoid门控机制和线性输入的乘积&#xff0c…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

&#xff08;1Prompt1Story&#xff09;是一种无训练的文本到图像生成方法&#xff0c;通过整合多个提示为一个长句子&#xff0c;并结合奇异值重加权&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技术&#xff0c;解决了生成图像中身份不一致…

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理&#xff0c;手册分析&#xff0c;驱动程序。初始化&#xff0c;清屏&#xff0c;ASCII字库&#xff0c;显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子&#xff0c;杜…

MySQL语法总结

本篇博客说明&#xff1a; &#xff01;&#xff01;&#xff01;.注意此系列都用的是MySQL语句&#xff0c;和SQLServer&#xff0c;PostgreSQL有些细节上的差别&#xff01;&#xff01;&#xff01; 1.每个操作都是先展示出语法格式 2.然后是具体例子 3.本篇注脚与文本顺讯息…

从预测到控制:电力RK3568边缘计算机在电网调度中的全面应用

在智能电网的快速发展中&#xff0c;电力Ubuntu工控机&#xff08;简称“电力工控机”&#xff09;作为核心设备&#xff0c;扮演着不可或缺的角色。特别是在智能电网调度场景中&#xff0c;电力工控机的高效、稳定和智能化特性&#xff0c;为电网的稳定运行和高效管理提供了强…