Manus作为一款引发热议的AI智能体产品吸引了大量的关注。OpenManus作为一个开源项目,尝试复现了Manus的部分功能,可以作为一种“平替”来体验类似的技术。
周末被Manus刷屏,看了拿到邀请码的老哥们发到网上的实测视频,确实挺炫酷,但Monica采用的饥饿营销策略让manus产品的邀请码被炒到了2万一个,家境贫寒之下找了Github上号称复现manus的项目OpenManus当做它的平替参照,做个剖析来过个瘾。
-
说是Manus的开源版,但根据已知的信息,Manus是多agent系统,OpenManus是利用已有能力快速搭建的单agent系统。
-
一般Agent所有的三个核心能力,包括规划、执行、记忆等OpenManus都做了实现,但在tools上其没有用到现在很流行的MCP模块,拓展它的工具箱需要继承内部的BaseTool基类,并手工实现execute方法,所以有一定成本。
-
简单的任务,比如上网搜索特定内容并生成总结报告,OpenManus都可以正常胜任,但准确率和稳定性并不高,估计是我为其配置的免费版LLM(大语言模型)可能对它的表现力有直接的影响。
-
基于工程整合所带来的产品创新,也能创造等量的用户价值。以OpenManus而言,我们举个形象点的例子,系统充当的是乐队指挥者的角色,当消费者(用户)提出请求之后,它开动自己的大脑(LLM)进行思考,根据用户的需求生成乐谱,并选择合适的乐手(工具箱),协调他们按照乐谱进行演奏,当然这个过程里面少不了预定义的COT、以及在有限组合空间中的枚举试错。
-
Manus这样的智能体确实能提效,但其不具备一次把事情做对的能力和黑盒模式下的干预优化能力,是企业落地的最大难点。我在使用OpenManus时发现同样的命令下,其给的结果非常不稳定,有失败也有答非所问,更重要的是因为过程完全对用户屏蔽,无法通过干预系统流程修正过程。正常情况下,一定是需要融合用户反馈和专有知识来对齐过程和结果,不断优化其庞大的提示词和校准预定义的工具库。
-
专业小模型仍然非常重要,小模型集群的能力决定了agent的上限。一般而言,在垂域因为数据不出域且知识不开放所以很难从外部获取到高质量解决域内问题的能力,所以结合agent的实现原理,其解决问题的边界取决于其工具库中的储备,而我们构建的小模型这样的专业工具,其能力边界直接定义了agent的能力天花板。
-
像Manus这样基于多智能体架构的方案可能在特定垂直领域更直接有效也更容易落地,相比SOP的agent架构,增加了自动规划的特性可以胜任非标任务。有研究表明,多智能体系统也存在比较严重的瓶颈(比如Manus),其78%的失败是由于多智能体交互问题引起的,仅22%源自单智能体缺陷,常见的错误比如违反角色定义、破坏任务规范、答非所问、plan与act脱节、错误终止或者验证缺失。
-
所以长远来看,端到端模型的上限一定是更高的,如更容易由Scaling Law或RL所带来的“涌现能力”或“Aha Moment”现象等,但是需要我们探索找到最佳的训练方法和使用方式。
-
短期。我在OpenManus配置的是qwen-max(支持流式调用),由于其可执行的任务组合比较简单(PythonExecute,GoogleSearch,BrowserUseTool,FileSaver,Terminate再加上一个PlanningTool)所以磕磕绊绊也可以用,而Manus据说有27种工具,为了保证执行精度,推测其用了自研的推理大模型生成planning。
-
长期。如果agent的每个环节都独立调用一次LLM,甚至是不同环节调用不同的模型,那么大模型固有的缺陷就会被层层放大,所以未来一定是需要训练出我们自己在agent上的端到端大模型(想象一下我们是怎么治理多级漏斗的),目前OpenAI在就为自己的DeepResearch定制了一个由o3训练的端到端模型。
对比项
|
短期方案
|
远期方案
|
设计目标
|
快速具备面向复杂任务的可靠交付能力
|
开放式探索能力和领域创造力,能带来新认知新方法
|
架构
|
追求专业能力组合的多智能体架构
1、使用分离的专门模型处理不同任务
2、每个子任务有独立的执行模块
3、通过明确的协调层管理各智能体间的通信
|
追求整体智能涌现的端到端模型架构
1、单一模型负责理解所有任务需求
2、通过生成代码或指令与外部工具交互
3、任务管理和执行逻辑都内置于同一模型中
|
优势
|
ROI最高:在垂域通过"LLM+小模型集群+领域知识库"进行工程化封装,即可快速具备可用性
更强的专业性:针对特定任务的专业模型可以达到更高精度
更敏捷的迭代:可以单独优化或替换某个智能体而不影响整体
可验证的流程:各智能体的职责划分明确,便于诊断问题
更强的拓展性:可以更容易地添加新功能或适应新领域
|
更强的一致性:全过程由同一模型处理,思考、执行、反馈、决策有更强的整体性和连贯性
更极致的效率:没有多Agent之间的通讯、启停开销
更流畅的体验:对用户请求的响应更快,更高效
突破人类经验局限的创造力:端到端模型可以涌现“反直觉但事后可解释”的决策模式,另外整体思考也会带来意想不到的解决方案
|
劣势
|
更高的复杂度:多智能体协作需要复杂的协调机制
更高的维护成本:多组件系统带来更高的维护和调试成本
更高的在线时延:多智能体间的通信可能引入额外延迟
整体性思考欠缺:分治的思路可能导致缺乏全局观和创造性
|
更难更新:整体模型更新周期长,针对某一单功能进行优化的成本更高
更高资源:需要更大的模型容量来包含所有功能,导致难以训练,需要探索新方法
|
核心流程
|
用户请求 → 识别任务需求→选择合适的工具(GoogleSearch、PythonExecute、etc.)→调用外部独立工具并执行 → 搜集工具结果并整合→ 决定下一步行动
|
用户请求 → 将所有上下文给到端到端模型 → 模型生成综合性的响应(推理、行动,etc)→ 内部执行所有功能 → 更新内部状态→ 将结果反馈到下一轮
|
项目地址,供参考
以下在本机的终端(terminal)中执行
准备Python环境
conda create -n open_manus python=3.12
conda
activate open_manus
获取远程项目资源
git clone https://github.com/mannaandpoem/OpenManus.git
cd OpenManus
安装依赖包
pip install -r requirements.txt
准备一个配置大语言模型接口的文件
cp config/config.example.toml config/config.toml
修改文件中的三个参数为你的API参数(model、base_url、api_key)
[llm]
model = "gpt-4o"
base_url = "https://api.openai.com/v1"
api_key = "sk-..."
max_tokens = 4096
temperature = 0.0
[llm.vision]
model = "gpt-4o"
base_url = "https://api.openai.com/v1"
api_key = "sk-..."
访问知乎网站,浏览跟manus关键词相关的帖子,提炼对其的分析与评价,将结果做成小红书风格的网页文件
以下是小红书风格
1、吸引人的标题
2、高质量的视觉
3、适当的标签和关键词
4、个性化
执行过程非常慢,需要耐心等待,并且有一定的失败概率
看起来确实有模有样的,粗看起来无论排版还是内容,让我自己写可能也不过如此,但这个表现是LLM直接赋予的,就像我上面说的,OpenManus其实更多是工程化的定义。
概述
当用户输入指令(比如给它指令:"分析知乎热搜")后OpenManusOpenManus执行流程如下
1.启动系统
用户启动main.py并输入指令
系统创建一个名为OpenManus的"智能助手"实例,接受并处理用户指令
2.分析和规划
大语言模型先分析用户的指令,理解用户想要完成什么任务
再思考解决方案,制定一个详细的执行计划
最后决定每一步需要使用什么工具来完成任务
3.执行与反馈循环
选择LLM推荐的工具(比如用BrowserUseTool工具访问知乎)
执行工具操作并返回结果(比如网页内容)
LLM分析上一步的结果
LLM评估后决定下一步行动是什么(比如是重新调整planning还是执行预定的下一步)
4.处理与创建
如果获取到数据,LLM会编写python代码处理这些数据
系统执行这些代码(这里用的是PythonExecute工具)
LLM继续指导如何生成报告和可视化图表
5.保存与完成
有了结果之后视需要选择保存文件(这理由对应的文件操作工具FileSaver)
LLM确认任务完成,系统返回执行摘要,继续等待用户的下一个指令
LLM的关键作用
这里要特地说一下LLM在OpenManus中的作用,LLM 既是系统的认知核心,也是执行控制器,在整个过程中不断规划、执行、分析和适应。这种迭代方法使系统能够处理需要多个步骤、工具交互和基于中间结果的动态调整的复杂任务。LLM就像是OpenManus的"大脑",在整个过程中起到的作用非常关键
1.指挥中心
LLM接收用户指令,理解任务需求,然后规划整个执行流程。它决定需要采取哪些步骤,以什么顺序执行,以及使用哪些工具。
2.工具调度
在执行任务的过程中,LLM能够从工具箱中默认的几种可选工具(浏览器、Python执行器、文件保存器等)里面挑选最合适的工具来完成当前任务,同时还会生成执行时工具的配置参数。
{
"tool_calls": [
{
"id": "call_9c3e5d7f8b",
"type": "function",
"function": {
"name": "browser_use",
"arguments": {
"action": "execute_js",
"script": "function extractHotList() {\n const hotItems = document.querySelectorAll('.HotList-item');\n const result = [];\n \n hotItems.forEach((item, index) => {\n const titleElement = item.querySelector('.HotList-itemTitle');\n const metricElement = item.querySelector('.HotList-itemMetrics');\n const topicElement = item.querySelector('.HotList-itemCategory');\n \n const title = titleElement ? titleElement.textContent.trim() : 'Unknown';\n const metric = metricElement ? metricElement.textContent.trim() : 'Unknown';\n const topic = topicElement ? topicElement.textContent.trim() : 'Unknown';\n \n result.push({\n index: index + 1,\n title: title,\n hot_metric: metric,\n topic: topic\n });\n });\n \n return JSON.stringify(result, null, 2);\n}\n\nextractHotList();"
}
}
}
],
"content": "现在我们已经成功访问了知乎热榜页面,下一步是提取热榜数据。知乎热榜数据通常包含在特定的HTML元素中,我需要使用JavaScript来提取这些信息。我将使用browser_use工具的execute_js功能来运行JavaScript代码,提取热榜项目的标题、热度和分类等信息。"
}
3.代码生成
当需要处理数据或创建可视化图表时,LLM会根据当前情况编写合适的Python代码。比如它可以根据当前的任务生成清洗数据、分析信息、生成图表和报告的python脚本(当然这个过程中可能需要安装相关的依赖包,实测有大部分安装包都需要在给出提示后手工安装)。
{
"tool_calls": [
{
"id": "call_6b8d9e2c5a",
"type": "function",
"function": {
"name": "python_execute",
"arguments": {
"code": "import json\nimport re\n\n# 假设这是从上一步获取的热榜数据\nraw_data = '''\n[{\"index\":1,\"title\":\"国务院办公厅发文促消费政策再加力\",\"hot_metric\":\"1425万热度\",\"topic\":\"财经\"},\n{\"index\":2,\"title\":\"今日春分\",\"hot_metric\":\"1001万热度\",\"topic\":\"自然\"}]\n'''\n\n# 解析JSON数据\ntry:\n hot_list = json.loads(raw_data)\n print(f\"成功加载{len(hot_list)}条热榜数据\")\n \n # 处理热度数值\n for item in hot_list:\n # 提取数字部分\n if 'hot_metric' in item:\n match = re.search(r'(\\d+(\\.\\d+)?)', item['hot_metric'])\n if match:\n hot_value = float(match.group(1))\n # 根据单位调整值\n if '万' in item['hot_metric']:\n hot_value *= 10000\n item['hot_value'] = hot_value\n else:\n item['hot_value'] = 0\n \n # 统计主题分布\n topics = {}\n for item in hot_list:\n topic = item.get('topic', '未知')\n topics[topic] = topics.get(topic, 0) + 1\n \n print(\"\\n热榜主题分布:\")\n for topic, count in sorted(topics.items(), key=lambda x: x[1], reverse=True):\n print(f\"{topic}: {count}条\")\n \n # 按热度排序\n sorted_list = sorted(hot_list, key=lambda x: x.get('hot_value', 0), reverse=True)\n print(\"\\n按热度排序的前5条热榜:\")\n for i, item in enumerate(sorted_list[:5]):\n print(f\"{i+1}. {item['title']} ({item['hot_metric']})\")\n \n # 保存处理后的数据供后续使用\n processed_data = {\n 'raw_list': hot_list,\n 'sorted_list': sorted_list,\n 'topic_stats': topics\n }\n print(\"\\n数据处理完成,已准备好用于后续分析\")\n \nexcept json.JSONDecodeError as e:\n print(f\"JSON解析错误: {e}\")\nexcept Exception as e:\n print(f\"处理数据时出错: {e}\")"
}
}
}
],
"content": "现在我们已经成功提取了知乎热榜数据,下一步是清洗和处理这些数据。我需要编写Python代码来处理JSON数据,提取热度数值,标准化主题分类,并准备用于后续分析的数据结构。我将使用python_execute工具来运行数据处理代码。"
}
4.过程管理
当遇到困难(如网页结构复杂、数据提取失败)时,LLM能够分析失败原因,调整策略,尝试新方法。它具有"反思"能力,可以从错误中学习并改进方案。
5.节点决策
在每一步执行后,LLM评估结果并决定下一步行动。它可以根据反馈调整计划,决定是继续执行、修改策略还是完成任务。
6.结果评估
LLM负责判断任务是否完成、结果是否符合要求。它可以生成总结报告,并决定何时结束任务执行。
流程图
这里主要关注=LLM的作用,其在项目中扮演的角色非常核心,无论是生成plan、结合工具执行act,还是根据执行结果判断是否要调整plan,这些都是由LLM承载。
plan环节的prompt
您是由OpenManus驱动的全能型AI助手,旨在解决用户提出的任何任务需求。您拥有多种工具调用能力,可高效完成编程开发、信息检索、文件处理、网页浏览等各类复杂需求。
您可以通过以下工具与计算机交互: Python执行工具(PythonExecute) :运行Python代码以执行系统交互、数据处理、自动化任务等操作。 文件保存工具(FileSaver) :将重要内容和信息文件保存到本地,支持.txt、.py、.html等格式。 浏览器操控工具(BrowserUseTool) :打开、浏览和使用网页浏览器。如果需要打开本地HTML文件,必须提供文件的绝对路径。 网络信息检索工具(GoogleSearch) :执行网络信息抓取。 操作策略 : 根据用户需求,主动选择最合适的工具或工具组合。 对于复杂任务,可以将问题拆解,逐步使用不同工具解决。 在使用每个工具后,清晰解释执行结果并建议下一步操作。
现在,用户给你的任务是:最近manus很活,请你搜集相关的信息整理成一份有深度的报告,整理成图文并茂的html文件格式
回到开头的例子,我用这张图来演示当我们敲入命令“搜集知乎上关于manus的帖子……”之后,系统内部发生了,模块之间的调用顺序是什么、同时从图中也可以直观感受到,LLM在agent中发挥的决定性作用。
在AI多模态数据处理中,企业面临海量文本、图像及音频数据的高效处理需求,本地受限于单机性能,难以满足大规模分布式计算要求。本方案介绍了基于分布式计算框架 MaxFrame,依托 MaxCompute 的海量计算资源,对多模态数据进行分布式处理、模型离线推理。
点击阅读原文查看详情。