文章摘要: XAgent是一个开源的基于大型语言模型(LLM)的自主智能体,可以自动解决各种任务。
简介
- XAgent是一个开源的基于大型语言模型(LLM)的自主智能体,可以自动解决各种任务。
- 它被设计为一个通用的智能体,可以应用于各种任务。
- 官方给出的定义是“一个可以解决任何给定任务的超级智能智能体”
- 项目地址:https://github.com/OpenBMB/XAgent
特点
- **自主性:**XAgent可以在没有人类参与的情况下自动解决各种任务。
- **安全性:**XAgent被设计为安全运行。所有的行为都被限制在一个docker容器内。不用担心你的主机环境受到影响
- **可扩展性:**XAgent被设计为可扩展的。您可以轻松地添加新的工具来增强智能体的能力,甚至是新的智能体!
- **GUI:**XAgent为用户提供了友好的GUI来与智能体交互。您也可以使用命令行界面与智能体交互。
- **与人类的合作:**XAgent可以与您合作解决任务。它不仅有能力在行进中遵循您的指导来解决复杂的任务,而且在遇到挑战时还可以寻求您的帮助。
组成部分
- **调度器:**负责动态实例化和分派任务给不同的智能体。它允许我们添加新的智能体和改进智能体的能力。
- **规划器:**负责为任务生成和校正计划。它将任务分解为子任务,并为它们生成里程碑,使智能体能够逐步解决任务。
- **行动者:**负责采取行动实现目标和完成子任务。行动者利用各种工具来解决子任务,它也可以与人类合作来解决任务。
工具服务器
工具服务器是为XAgent提供强大和安全的工具来解决任务的服务器。它是一个docker容器,为XAgent提供一个安全的运行环境。 目前,工具服务器提供以下工具:
- 文件编辑器 提供一个文本编辑工具,可以写入、读取和修改文件。
- Python笔记本 提供一个交互式的Python笔记本,可以运行Python代码来验证想法、绘制图形等。
- 网页浏览器 提供一个网页浏览器,可以搜索和访问网页。
- Shell 提供一个bash shell工具,可以执行任何shell命令,甚至安装程序和托管服务。
- Rapid API 提供一个从Rapid API检索API并调用它们的工具,为XAgent提供了广泛的API。有关Rapid API集合的更多信息,请参见ToolBench。 您也可以轻松地向工具服务器添加新的工具,以增强XAgent的能力。
核心概念
计划与执行的双循环机制
- 现有的人工智能代理(例如MetaGPT)在很大程度上被规定为人类精心设计的管道,这使得它们不再是自己意志的代理,而更像是人类设计师的延伸。这样的系统虽然在某些特定任务中有效,但通过将智能体限制在预先存在的人类知识和偏见的范围内,限制了智能体的潜力。为了为真正的自主性铺平道路,XAgent 刻意避免将人类的先验知识注入系统设计中。相反,我们赋予代理商执行自己的规划和决策过程的能力。
- 处理多方面的任务需要从整体上考虑问题及其各个组成部分。以前的代理通常缺乏全局计划的能力,更专注于根据预定义的策略执行任务。XAgent 采用双循环机制:用于高级任务管理的外循环进程和用于低级任务执行的内循环进程。外循环过程使代理能够识别总体任务并将其分割成更小、更可操作的组件。这种等级划分反映了人类在应对复杂挑战时所采用的自然认知过程。相比之下,内循环过程充当详细的执行器,专注于分段任务的细粒度方面。内循环体现了我们为解决问题的特定部分而采取的细致步骤。通过将高级计划与低级任务执行分开,XAgent 反映了人类采用的自然认知层次结构,并可以根据执行结果迭代优化计划。
- 在 XAgent 中,决策和任务执行过程通过双循环机制进行编排:外循环和内循环。从本质上讲,外循环处理的是任务的高级管理和分配,而内循环则侧重于每个子任务的低级执行和优化。
Outer-Loop外循环
- 外循环充当高级计划者和任务的主要编排者,充当整个问题解决序列的主管。
- **初始计划生成(Initial Plan Generation):**PlanAgent 首先生成一个初始计划,该计划为任务执行制定了基本策略。这涉及将给定的复杂任务 T 分解为更小、更易于管理的子任务。此细分可以表现为任务队列。这些子任务的意图很明确,可以更直接地执行,而不会使系统不堪重负。给定一个复杂的任务,使用 PlanAgent 将其分解为一系列子任务。
- **迭代计划优化(Iterative Plan Refinements):**在初始计划之后,PlanAgent 通过从任务队列中弹出第一个子任务来进行。然后,将此子任务传递到内循环。PlanAgent 持续监控任务的进度和状态。执行每个子任务后,内部循环会从 ToolAgent 报告 Feedback。根据反馈,PlanAgent 会触发适当的处理机制,例如优化计划或继续执行后续子任务。外循环完成,直到队列中没有剩余子任务。
Inner-Loop内循环
- 内循环对于执行外循环分配的各个子任务至关重要。
- **代理调度和工具检索(Agent Dispatch and Tool Retrieval):**根据子任务的性质,派遣具有完成任务所需能力的适当工具代理。
- **工具执行(Tool Execution):**ToolAgent 首先从外部系统检索工具以帮助完成任务。然后,代理使用 ReACT 进行子任务求解。此方法搜索完成子任务的最佳操作系列(工具调用)。
- **反馈和反思(Feedback and Reflection):**在一系列操作之后,ToolAgent 可以发出一个名为“subtask_submit”的特定操作来完成当前子任务的处理,并将反馈和反射传递给 PlanAgent。此反馈可以指示子任务是否成功完成,或突出显示潜在的改进。
PlanAgent动态规划和迭代优化
- 复杂的代理系统需要善于不断制定和修改计划,以适应可变的环境和紧急需求。这些能力对于确保灵活性、弹性和效率以应对不可预见的挑战至关重要。为了使外循环具有这种适应性,我们引入了 PlanAgent。PlanAgent 经过定制,通过生成初始计划并不断修改计划来支持外循环。
PlanAgent 定义了四个函数来优化现有计划:
- **子任务拆分(Subtask Split):**使系统能够将特定子任务分解为更精细、更易于管理的单元。只有当前正在执行或未启动的子任务才有资格执行此操作。
- **子任务删除(Subtask Deletion):**删除尚未启动的子任务。已进行或已完成的子任务不符合删除条件。这确保了一定程度的敏捷性,可以修剪冗余或不相关的任务以优化整体执行。
- **子任务修改(Subtask Modification):**更改子任务的内容。要修改的子任务不应已经开始或已完成,从而保持整体计划的完整性。
- **子任务添加(Subtask Addition):**在特定子任务之后插入新的子任务作为同级任务。子任务只能在当前处理的子任务或其后续任务之后添加。它保证了新任务按顺序编排,简化了执行流程并保持了连贯性。
ToolAgent在函数调用中协同推理和行动
- 对于每个动作,将智能体推理和在同一个函数调用中的行为协同起来,即推理跟踪(“思想”)和要采取的动作都被视为特定函数的参数。具体来说,每个函数调用都具有以下组件:
- **思想(Thought):**简明扼要地表示代理人对情况的主要见解。
- **推理(Reasoning):**追踪智能体为达到其想法而遍历的逻辑轨迹。
- **批评(Criticism):**捕捉智能体对其行为的自我反思,充当反馈循环。它突出了潜在的疏忽或需要改进的领域。
- **命令(Command):**指示代理根据其推理决定执行的下一个操作。
- **参数(Parameters):**枚举要执行的操作的特定参数或详细信息。
ToolServer支持多种工具
ToolServer 由三个关键组件组成:
- ToolServerManager 管理 docker 容器(即节点)的生命周期,处理它们的创建、监控和关闭。每当新会话启动时,管理器都可以创建一个新节点。定期检查这些节点的状态,以确保它们正常运行;
- ToolServerMonitor检查节点的状态,更新节点的状态,确保节点的高效执行。如果节点长时间处于空闲状态,监视器可以停止它以节省资源;
- ToolServerNode 是执行操作(例如 API 调用、文件上传、工具检索等)的单个执行单元。
目前Xagent支持以下工具:
- FileSystemEnv 提供了一个用于管理文件系统操作的复杂接口。该工具提供了多种功能,从基本的文件读取和写入到内容修改和分层表示等复杂操作。
- PythonNotebook 利用 Jupyter Notebook 的功能,提供了一个接口来促进 Python 代码的无缝执行。XAgent 可以动态创建或修改笔记本单元,并在受控和隔离的环境中执行它们。
- WebEnv 专为 Web 交互和内容提取而设计。它提供了使用 Bing 搜索 Web 并随后浏览检索到的网页的双重功能。WebEnv 还可以识别和整理源页面中的超链接,从而更全面地了解查询内容。
- ExecuteShell 旨在以编程方式执行 shell 命令。它返回已执行命令的输出和任何潜在错误。为了确保操作的稳健性,它采用了处理超时的机制,从而降低了与命令相关的风险,否则这些命令可能会无限期地停止。
- RapidAPIEnv 促进了与领先的 API 市场 RapidAPI 的无缝交互。借助 RapidAPIEnv,XAgent 能够连接 160000+ 个真实世界的 API。
- 当 XAgent 发现当前子任务无法自行完成时,可以调用 AskHumanforHelp。在这种情况下,XAgent 将发布人类参与任务解决的特定要求。
工具执行 Docker
- 实现弹性、效率和可扩展性对于代理系统至关重要。与传统系统不同,XAgent 使用 ToolServer(作为执行引擎)来支持这些属性。它在 Docker 环境中运行,为工具执行提供隔离且安全的空间。这种隔离可确保工具执行的操作不会危及主系统的稳定性或安全性。
这种设计带来了许多好处:
- **安全性:**在Docker容器中运行工具可以保护主系统免受潜在伤害;
- **模块化:**将座席规划和工具执行的角色分开,可以使代码更易于管理,更容易调试,并具有可扩展性;
- **效率:**系统可以根据需求和使用模式启动、停止和重启节点,从而实现最优的资源利用。借助 ToolServer,XAgent 将决策过程的复杂性LLM与工具执行分开。
函数调用:XAgent 的通用语言
- 结构化的通信模式对于代理系统的稳健性至关重要。因此,使用 OpenAI 的函数调用作为 XAgent 的通用语言。
这带来了几个关键属性:
- 结构化通信:函数调用的固有格式明确说明要求和期望的内容。这种结构最大限度地减少了误解和潜在的错误;
- 统一框架:在传统的人工智能系统中,不同的任务,无论是总结、规划还是API调用,都可能需要不同的方法。通过将所有任务转换为特定的函数调用,我们确保以一致的方式处理每个任务。这种统一简化了系统设计;
- 与外部工具无缝集成:代理经常需要与外部系统、数据库或工具进行通信。函数调用允许这种通信标准化,提供代理和外部工具都可以理解的通用语言。
协同人机协作
- XAgent 采用为增强人机交互量身定制的交互机制。
- XAgent 允许用户积极干预和指导其决策过程。
- 提供了一个直观的界面,用户可以在其中覆盖或修改 XAgent 建议的操作,从而将机器效率与人类的直觉和专业知识相结合。
- 当 XAgent 面临不熟悉的挑战时,它配备了“AskHumanforHelp”工具。
- 该工具征求用户的实时反馈、建议或指导,确保代理即使在不确定的地形中也能发挥最佳作用。
- 这种交互式范式将机器自主性与人类智慧相结合,促进了人类与 XAgent 之间的共生关系。