
手把手教你实现自己的“Manus”:构建基于容器的多用户Agent应用
现在,你的Docker镜像就已经准备完毕。如果后期有需要,可以修改Dockerfile后重新build即可。
Manus火了,万元的“邀请码”最后也引起口诛笔伐,不过这多少也说明了大家对AGI的向往与期待。所谓外行看热闹,内行看门道,Manus本质上是一个运行在云端支持多用户使用的Agent as a Service应用,与Deepseek不一样的是,其技术复杂性更多体现在工程上而非底层算法。
本文将尝试构建一个基于容器(沙盒)隔离的多用户Agent系统的后台原型,以帮助理解相关的原理。
01.Manus原理乱猜
从为数不多的演示视频看,Manus背后的一些技术的要点有:
-
一个自主的多Agent/多Tools系统。
由一个任务调度的Agent与多个负责任务执行的Agent(或嵌套多Agent系统)组成;不同的Agent可以根据需要使用擅长不同任务的LLM。
-
编程任务Agent与Web浏览Agent是核心Agent之一。
为什么?因为这两种Agent最具“通用”能力。
-
借助虚拟环境(比如Docker容器)做用户隔离。
为什么?一个是减少用户间的影响;一个是系统安全。你敢让用户指示AI写出的代码随便在本机环境运行吗?
-
目前擅长的任务流程还是以线性任务为主。
纯推测。因为非线形任务对LLM推理要求极高,或者借助Workflow来实现,但Workflow又缺乏通用型。
简单的说,**每个登录用户会有一个自己的“manus”(Agent),每个"manus"有自己的电脑(虚拟机)与工作空间来完成任务。**比如运行代码、浏览网络、创建文件等。
大致的工作流程:
当然,这里的细节我们在实际工程中可根据自己的实际情况参考。
02.设计一个多用户Agent后台
参考这些要点,我们实现一个简化版的支持多用户的Agent系统。
【基本能力】
-
有简单的自我规划并结合上下文的步骤推理能力
-
至少有编码Agent与Web Agent两种子任务能力
-
这两种Agent工作在动态的容器中以确保安全
-
可多用户同时使用,用户的容器与工作空间要隔离
【系统架构】
系统架构与大致流程设计:
这个系统中包含的组件有:
-
一个预建的Docker镜像:用来启动用户虚拟环境
-
一个容器管理器组件:用来管理多个用户虚拟环境
-
一个ReAct范式Agent:模拟任务步骤推理与调度
-
四个任务执行的Tool(也可以是Agent),用于:
-
CodeGenerator: 生成Python代码
-
WebpageCrawler: 采集指定网址的内容
-
CodeExecutor: 虚拟环境中执行代码脚本
-
Browser: 执行网络自动浏览
-
一个Web Agent:给Browser调用的自动化浏览Agent(在虚拟环境中)
-
一个共享工作区:存放任务过程中输入输出文件
【工作流程】
下面以一个简单的任务,结合实际运行的效果图,说明系统工作流程。
1. 通过Docker Build创建一个用来启动用户虚拟环境的镜像(Docker Image)。你需要能在本地的Docker镜像库中看到它:
2. 用户输入任务(这里用输入用户ID来模拟不同用户):
此时系统会:
-
创建一个用户ID对应的ReActAgent
-
启动一个用户ID对应的虚拟环境(Docker容器),注意这里的容器名:
3. ReActAgent进入任务推理循环,根据上图中的输入任务,自动完成如下步骤:
- 首先调用WebpageCrawler采集网页内容保存到用户工作区下的一个文件。
- 调用CodeGenerator生成对该文件分析的python代码。
- 调用CodeExecutor,连接到Docker容器,在容器中执行该代码。
- 获得代码执行结果,并反馈用户。
- 以上步骤如果失败,由ReActAgent推理进行再次尝试,直到成功或到达最大迭代次数。比如这里执行发现版本问题,会自动使用pip install做更新:
4. 返回任务执行结果。如果没有新任务,则销毁agent并停止容器。
下面我们介绍核心组件的实现过程,你可以使用配套源码进行实验。
03.准备:Docker Image
由于需要借助AI编程来完成不同用户的任务,提供虚拟环境用于代码执行是必要的。需要注意的是,我们为了调试方便,没有把整个Agent系统都放到虚拟环境下,只把两种类型的任务执行放在容器中完成:Python代码执行与Web浏览自动化。
【Image内容】
启动Docker容器首先需要准备好必要的镜像(Build Image)。这个镜像预置如下内容:
-
基本的Python代码执行环境
-
常见的Python第三方库。比如数据分析pandas
-
需要在虚拟环境下使用的工具。比如我们需要Chromium用来web浏览
-
必要的脚本,包括shell或者预建的python代码。比如我们这里把用于自动网络浏览的Web Agent代码build到这个虚拟镜像中(agent_browser.py),用来给Browser这个Tool直接调用(为什么?因为对于复杂且需要在虚拟环境下的工作任务,你不可能每次现场编程来完成,既不稳定也不高效)
尽量把最常见的第三方库直接build进去,否则会在执行任务时现场安装,影响性能。
【构建过程】
1. 安装并启动好Docker后台。
2. 准备好Dockerfile:
Dockerfile是构建Image镜像的配置文件。除了常见的拉取基础镜像,安装必要的操作系统与Python包以外,这里有一些特殊的增加:
说明如下:
-
playwright install:playwright是一个自动化Web测试工具,用来实现在Docker中控制浏览器。这一步是在镜像中安装对应的chromium浏览器。
-
start.sh启动脚本:启动脚本是每一个容器在启动后执行的动作(ENTRYPOINT指令设置)。start.sh内容为:
#!/bin/bash
Xvfb :99 -screen 0 1024x768x16 &
sleep 1
exec "$@"
这个脚本作用是启动一个虚拟显示服务器,用来在没有显示器(docker容器)的情况下运行图形应用,也就是Chromium浏览器,用来实现浏览自动化。
- agent_browser.py:这是一个预购建的Web Agent代码,用来执行自动化web浏览任务
3. 最后使用docker build命令生成镜像。你可以使用我们代码中的build.sh来构建,等待出现提示:
现在,你的Docker镜像就已经准备完毕。如果后期有需要,可以修改Dockerfile后重新build即可。
04.Docker Container管理接口
为了方便对容器管理,比如启动、停止、执行代码等,我们来准备简单的Container管理组件与接口。
【Docker API封装】
对Docker的Container API做封装。大致接口如下(详细请参考源码包):
......
class DockerContainer:
"""管理Docker容器的简单类"""
def \_\_init\_\_(
self,
image: str = "python-data-analysis:3.11",
container\_name: str = "llamaindex-executor",
base\_work\_dir: str = "/Users/pingcy/workspace",
auto\_remove: bool = True
):
...
def start(self):
"""启动Docker容器"""
...
def set\_work\_dir(self, work\_dir: str) -> None:
"""设置当前工作目录
Args:
work\_dir: 新的工作目录
"""
...
def stop(self):
"""停止Docker容器"""
...
def execute(self, code: str, language: str = "python", work\_dir: Optional\[str\] = None) -> Dict\[str, str\]:
"""在Docker容器中执行代码
Args:
code: 要执行的代码
language: 代码语言,支持 "python", "sh", "bash"
work\_dir: 执行代码的工作目录,如果不提供则使用当前工作目录
Returns:
Dict包含output和error字段
"""
...
【多用户下的Container管理接口】
现在可以在此基础上提供Container管理的方便函数给Agent使用。这里有两个要点:
-
支持多用户。需保留用户与容器的对应关系。
-
确保每个用户只有一个容器(单体)。
获取/启动容器的函数:
...
# 全局变量 - Docker容器映射表(按用户ID组织)
_docker_containers: Dict[str, DockerContainer] = {}
BASE_WORK_DIR = "/Users/"
#用来获取特定用户的容器单体实例
def get_docker_container(
user_id: str = "default",
image: str = "python_code_executor:3.11",
container_name: Optional[str] = None,
) -> DockerContainer:
"""获取或创建特定用户的Docker容器
Args:
user_id: 用户ID,用于区分不同用户
image: Docker镜像名称
container_name: 容器名称,如不提供则根据用户ID生成
Returns:
DockerContainer: 用户专属的容器实例
"""
global _docker_containers
# 如果不提供容器名称则根据用户ID生成
if container_name is None:
container_name = f"llamaindex-executor-{user_id}"
# 为用户创建专属容器
if user_id not in _docker_containers or _docker_containers[user_id] is None:
_docker_containers[user_id] = DockerContainer(
image=image,
container_name=container_name,
base_work_dir=os.path.join(BASE_WORK_DIR, user_id)
)
_docker_containers[user_id].start()
# 确保用户基本工作目录存在
user_work_dir = os.path.join(BASE_WORK_DIR, user_id)
os.makedirs(user_work_dir, exist_ok=True)
return _docker_containers[user_id]
停止容器的函数:
...
# 关闭特定用户的Docker容器
def close_docker_container(user_id: str = "default"):
global _docker_containers
...
# 关闭所有Docker容器
def close_all_docker_containers():
global _docker_containers
...
【测试】
使用如下代码来测试能否动态启动一个容器,并在容器中执行一段代码:
def test_docker_container():
#启动一个容器
container = get_docker_container(user_id="test_user")
#执行的代码
code = """
import sys
print("Testing Docker container...")
print(f"Python version: {sys.version}")
"""
try:
#在容器中执行代码
result = container.execute(code, "python")
print("Execution result:")
print(f"Output: {result['output']}")
print(f"Error: {result['error']}")
finally:
#关闭容器
close_docker_container("test_user")
你应该可以看到如下的输出:
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)