链载Ai

标题: 手把手教你实现自己的“Manus”:构建基于容器的多用户Agent应用【下】 [打印本页]

作者: 链载Ai    时间: 昨天 17:31
标题: 手把手教你实现自己的“Manus”:构建基于容器的多用户Agent应用【下】

再重复下我们关注的重点:


本篇将完成剩下的任务(代码地址在文末):

  1. 构建Tool:Python代码执行器(Docker版)

  2. 构建Tool:浏览器自动化(Docker版)

  3. 组装Prompts与ReAct Agent

  4. 测试与未来改进

01

构建Tool:Python代码执行器

这个工具的任务是把AI生成的代码在一个动态启动的容器中执行,并返回结果。它并不关心代码的目的,仅仅是纯粹的执行。首先准备一个工具函数:

...
defexecute_code_docker(
code: str,
language: str,
user_id: str ,
task_id: str
)-> str:
"""
在Docker容器中执行代码的函数

Args:
code: 要执行的代码
language: 代码语言 ("python", "bash", "sh")
user_id: 用户ID,区分不同用户
task_id: 任务ID,如果不提供则创建新任务

Returns:
字符串结果,包含输出或错误信息
"""
.........此处省略.......
returnjson.dumps(result_data)

把这个函数转化为Agent需要的Tool,这里包装一个create函数:

defcreate_code_executor_docker_tool():
"""创建docker代码执行工具"""
returnFunctionTool.from_defaults(
name="docker_code_executor",
description="在Docker容器中执行Python代码或Shell脚本。对于Python代码,使用language='python';对于Shell脚本,使用language='bash'或'sh'。需要提供user_id区分不同用户,可以指定task_id继续在特定任务上下文中执行,不指定则创建新任务。",
fn=execute_code_docker,
)

OK,这就是全部工作。如果不放心,你可以单独测试这个工具。

02

构建Tool:浏览器自动化

这个Tool依赖于一个Web Agent,用来完成浏览器自动化任务(参考:Web Agent技术揭秘:如何让DeepSeek接管与控制你的浏览器?)。常见的技术方案有微软的OmniParse视觉分析以及browser-use开源Agent框架。可以借助browser-use来快速实现这个Agent:

...
# 初始化浏览器
browser = Browser(config=browser_config)

# 创建代理,输入task即可,比如“上youtube看当前热点”
agent = Agent(
task=task,
llm=llm,
use_vision=use_vision,
max_failures=max_failures,
max_actions_per_step=max_actions,
browser=browser
)

result = awaitagent.run()

由于需要在容器中完成web浏览,为了方便,我们把这个Agent调试好再直接build到容器镜像中(参考上篇的Dockerfile)。而Tool只需要调用容器中的Agent即可:

所以这个工具函数就很简单了,无非是把输入任务转换成调用agent_browser的脚本并通过容器执行:

defexecute_browser_task(
task_description: str,
user_id: str = "default",
task_id: Optional[str] = None
)-> str:
"""
执行浏览器任务并返回结果

Args:
task_description: 浏览器工作任务描述文本
user_id: 用户ID,区分不同用户
task_id: 任务ID,如果不提供则创建新任务

Returns:
str: JSON格式的任务执行结果
"""
shell_code = f'python /app/agent_browser.py -t "{task_description}"'

...此处省略...

result = container.execute(shell_code, "bash")

...
然后参考上一节的方法把这个函数转化为工具即可。

03

组装Prompts与ReAct Agent

除了上面两个以外,我们还有两个工具:

【Prompts建议】

大模型”咒语“的重要性不言而喻。在这个Agent中,有两个主要的提示:

* 主任务推理提示:由于这里使用ReActAgent,因此使用其标准化提示,由框架内置。不过LlamaIndex允许插入一个Context_prompt,可以在这增加一些指令,以帮助更好的推理任务步骤与参数。我这里给了一些任务拆分的”Tips“,如:

* 编码提示:即LLM代码生成的提示。这个提示中可以根据实际需要给出一些编码的规则、约束以及环境信息等,帮助生成一次性成功的代码。如:

这些编码规则最后组装到完整的Prompt中:

...
prompt = f"""{CODE_GENERATION_PROMPT}
任务描述:{task_description}
额外上下文:{additional_context}

请直接返回代码,无需其他解释。
"""

【Agent组装】

为了简化,这里采用LlamaIndex中预置的ReActAgent抽象来实现这个Agent。把工具交给Agent,并设定LLM及部分参数即可:

...
# 创建用户专属的工具实例
tool_code_executor_docker = create_code_executor_docker_tool()
tool_browser_docker = create_browser_docker_tool()
tool_code_generator = create_code_generator_tool()
tool_webpage_crawler = create_webpage_crawler_tool() # 新增网页采集工具

# 创建用户专属的Agent
_agents[user_id] = ReActAgent.from_tools(
max_iterations=20,
tools=[
tool_code_generator,
tool_code_executor_docker,
tool_browser_docker,
tool_webpage_crawler # 添加到工具列表
],
llm=llm,
verbose=True,
context=REACT_AGENT_CONTEXT
)
...

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: var(--articleFontsize);letter-spacing: 0.034em;">【客户端模拟】

实际应用中,你需要借助Flask或者FastAPI让Agent对外提供服务接口。不过我们这里直接采用客户端程序做模拟。这个程序的输入有:

处理流程如下:


04

测试与改进

现在我们就完成了一个初具雏形的、支持多用户与容器环境的“Manus”,当然它的工具箱还不够丰富,任务规划能力也相对受限(ReAct),你需要在后期不断的完善。

我们做一些简单的测试验证:

"帮我看一下youtube今天最火的视频有哪些?"

"演示汉诺塔算法的过程,并搜一下汉诺塔问题来源”

"解压我的zip文件,识别其中的PDF文件信息,输出到Excel中”

这个PDF是一张发票信息,因为我提示不够清楚,AI使用了普通的PDF解析,尽管信息被提取了出来,但并没有使用价值。

“创建一个测试的订单数据文件,模拟小米公司各种手机型号的销售数据,数据尽量仿真,至少100条数据”

“对我刚生成的模拟数据做个分析,输出一个分析图表到图片文件”

这里经历了多次调试。原因是大部分LLM会自作主张的假设数据格式直接进行分析,而不是首先学习文件中的数据内容与格式,然后选择合适的角度做分析。

【不足与后续改进】

不可预测性很大程度上依赖于LLM能力的进化。可能的改进还有:


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: var(--articleFontsize);">







欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5