Magentic-One#
Magentic-One 是一个通用型多智能体系统,用于解决各种领域的开放式网络和基于文件的任务。它代表了多智能体系统向前迈出的重要一步,在多项智能体基准测试中取得了具有竞争力的性能(完整详情请参阅技术报告)。
Magentic-One 最初于2024 年 11 月发布时,是直接基于 autogen-core 库实现的。现在,我们已将 Magentic-One 移植到使用 autogen-agentchat,提供了一个更模块化且更易于使用的接口。
为此,Magentic-One 编排器 MagenticOneGroupChat 现在只是一个 AgentChat 团队,支持所有标准的 AgentChat 智能体和功能。同样,Magentic-One 的 MultimodalWebSurfer、FileSurfer 和 MagenticOneCoderAgent 智能体现在已作为 AgentChat 智能体广泛提供,可用于任何 AgentChat 工作流。
最后,有一个辅助类 MagenticOne,它将所有这些组件捆绑在一起,以最少的配置实现论文中的功能。
请在我们的博客文章和技术报告中找到有关 Magentic-one 的更多信息。

示例:上图展示了 Magentic-One 多智能体团队完成 GAIA 基准测试中的一项复杂任务。Magentic-One 的 Orchestrator 智能体制定计划,将任务委托给其他智能体,并跟踪目标的进展,在需要时动态修改计划。Orchestrator 可以将任务委托给 FileSurfer 智能体来读取和处理文件,WebSurfer 智能体来操作网页浏览器,或者 Coder 或 Computer Terminal 智能体分别用于编写或执行代码。
注意
使用 Magentic-One 涉及与为人类设计的数字世界互动,这本身就带有固有的风险。为了最大程度地降低这些风险,请考虑以下预防措施:
使用容器:在 docker 容器中运行所有任务,以隔离智能体并防止直接的系统攻击。
虚拟环境:使用虚拟环境运行智能体,防止它们访问敏感数据。
监控日志:在执行期间和执行后密切监控日志,以检测和缓解危险行为。
人工监督:在有人类参与的情况下运行示例,以监督智能体并防止意外后果。
限制访问:限制智能体对互联网和其他资源的访问,以防止未经授权的行为。
保护数据:确保智能体无法访问敏感数据或可能被泄露的资源。不要与智能体共享敏感信息。请注意,智能体偶尔会尝试危险行为,例如招募人类协助或在没有人为干预的情况下接受 cookie 协议。始终确保智能体受到监控并在受控环境中运行,以防止意外后果。此外,请注意 Magentic-One 可能会受到网页的提示注入攻击。
入门#
安装所需软件包
pip install "autogen-agentchat" "autogen-ext[magentic-one,openai]"
# If using the MultimodalWebSurfer, you also need to install playwright dependencies:
playwright install --with-deps chromium
如果您还没有这样做,请参阅 AgentChat 教程以了解 AgentChat 的概念。
然后,您可以尝试将 autogen_agentchat.teams.SelectorGroupChat 替换为 MagenticOneGroupChat。
例如
import asyncio
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import MagenticOneGroupChat
from autogen_agentchat.ui import Console
async def main() -> None:
model_client = OpenAIChatCompletionClient(model="gpt-4o")
assistant = AssistantAgent(
"Assistant",
model_client=model_client,
)
team = MagenticOneGroupChat([assistant], model_client=model_client)
await Console(team.run_stream(task="Provide a different proof for Fermat's Last Theorem"))
await model_client.close()
asyncio.run(main())
要使用不同的模型,请参阅 模型 以获取更多信息。
或者,在团队中使用 Magentic-One 智能体
注意
示例代码可能会从互联网下载文件、执行代码并与网页交互。在运行示例代码之前,请确保您处于安全环境中。
import asyncio
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.teams import MagenticOneGroupChat
from autogen_agentchat.ui import Console
from autogen_ext.agents.web_surfer import MultimodalWebSurfer
# from autogen_ext.agents.file_surfer import FileSurfer
# from autogen_ext.agents.magentic_one import MagenticOneCoderAgent
# from autogen_agentchat.agents import CodeExecutorAgent
# from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor
async def main() -> None:
model_client = OpenAIChatCompletionClient(model="gpt-4o")
surfer = MultimodalWebSurfer(
"WebSurfer",
model_client=model_client,
)
team = MagenticOneGroupChat([surfer], model_client=model_client)
await Console(team.run_stream(task="What is the UV index in Melbourne today?"))
# # Note: you can also use other agents in the team
# team = MagenticOneGroupChat([surfer, file_surfer, coder, terminal], model_client=model_client)
# file_surfer = FileSurfer( "FileSurfer",model_client=model_client)
# coder = MagenticOneCoderAgent("Coder",model_client=model_client)
# terminal = CodeExecutorAgent("ComputerTerminal",code_executor=LocalCommandLineCodeExecutor())
asyncio.run(main())
或者,使用将所有智能体捆绑在一起的 MagenticOne 辅助类
import asyncio
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.teams.magentic_one import MagenticOne
from autogen_agentchat.ui import Console
from autogen_agentchat.agents import ApprovalRequest, ApprovalResponse
def approval_func(request: ApprovalRequest) -> ApprovalResponse:
"""Simple approval function that requests user input before code execution."""
print(f"Code to execute:\n{request.code}")
user_input = input("Do you approve this code execution? (y/n): ").strip().lower()
if user_input == 'y':
return ApprovalResponse(approved=True, reason="User approved the code execution")
else:
return ApprovalResponse(approved=False, reason="User denied the code execution")
async def example_usage():
client = OpenAIChatCompletionClient(model="gpt-4o")
# Enable code execution approval for security
m1 = MagenticOne(client=client, approval_func=approval_func)
task = "Write a Python script to fetch data from an API."
result = await Console(m1.run_stream(task=task))
print(result)
if __name__ == "__main__":
asyncio.run(example_usage())
架构#

Magentic-One 的工作基于多智能体架构,其中主要的 Orchestrator 智能体负责高级规划、指导其他智能体并跟踪任务进度。Orchestrator 首先制定解决任务的计划,并在维护的任务分类账中收集所需的事实和有根据的猜测。在其计划的每个步骤中,Orchestrator 都会创建一个进度分类账,在其中反思任务进度并检查任务是否完成。如果任务尚未完成,它会分配 Magentic-One 的其他智能体之一来完成子任务。在分配的智能体完成其子任务后,Orchestrator 会更新进度分类账并以这种方式继续,直到任务完成。如果 Orchestrator 发现足够多的步骤没有取得进展,它可以更新任务分类账并创建新计划。这在上图中有所说明;Orchestrator 的工作因此分为一个更新任务分类账的外层循环和一个更新进度分类账的内层循环。
总的来说,Magentic-One 由以下智能体组成:
Orchestrator:主要智能体,负责任务分解和规划、指导其他智能体执行子任务、跟踪总体进度以及在需要时采取纠正措施。
WebSurfer:这是一个基于 LLM 的智能体,擅长控制和管理基于 Chromium 的网页浏览器的状态。对于每个传入请求,WebSurfer 都会在浏览器上执行一个动作,然后报告网页的新状态。WebSurfer 的动作空间包括导航(例如访问 URL、执行网页搜索);网页动作(例如点击和输入);以及阅读动作(例如总结或回答问题)。WebSurfer 依靠浏览器的可访问性树和标记集提示来执行其动作。
FileSurfer:这是一个基于 LLM 的智能体,它通过命令基于 markdown 的文件预览应用程序来读取大多数类型本地文件。FileSurfer 还可以执行常见的导航任务,例如列出目录内容和导航文件夹结构。
Coder:这是一个基于 LLM 的智能体,通过其系统提示专门用于编写代码、分析从其他智能体收集的信息或创建新工件。
ComputerTerminal:最后,ComputerTerminal 为团队提供对控制台 shell 的访问权限,在此可以执行 Coder 的程序,并可以安装新的编程库。
Magentic-One 的智能体共同为 Orchestrator 提供了解决各种开放式问题所需的工具和能力,以及自主适应动态多变的网络和文件系统环境并采取行动的能力。
虽然我们所有智能体默认使用的多模态 LLM 是 GPT-4o,但 Magentic-One 与模型无关,可以集成异构模型以支持不同的功能或满足完成任务时不同的成本要求。例如,它可以利用不同的 LLM 和 SLM 及其专业版本来为不同的智能体提供动力。我们建议为 Orchestrator 智能体使用强大的推理模型,例如 GPT-4o。在 Magentic-One 的不同配置中,我们还尝试将 OpenAI o1-preview 用于 Orchestrator 的外层循环和 Coder,而其他智能体继续使用 GPT-4o。
引用#
@misc{fourney2024magenticonegeneralistmultiagentsolving,
title={Magentic-One: A Generalist Multi-Agent System for Solving Complex Tasks},
author={Adam Fourney and Gagan Bansal and Hussein Mozannar and Cheng Tan and Eduardo Salinas and Erkang and Zhu and Friederike Niedtner and Grace Proebsting and Griffin Bassman and Jack Gerrits and Jacob Alber and Peter Chang and Ricky Loynd and Robert West and Victor Dibia and Ahmed Awadallah and Ece Kamar and Rafah Hosn and Saleema Amershi},
year={2024},
eprint={2411.04468},
archivePrefix={arXiv},
primaryClass={cs.AI},
url={https://arxiv.org/abs/2411.04468},
}