OxyGent
扫码查看

构建生产级多智能体系统的Python框架

OxyGent

综合介绍

OxyGent 是由京东探索研究院开发并开源的一款Python框架,专门用于构建生产就绪且可扩展的多智能体系统。在多智能体系统的开发过程中,开发者常常面临标准不一、组件复用困难以及协作逻辑复杂等问题。OxyGent旨在解决这些痛点,它通过一个核心设计,将工具、模型和智能体统一抽象为标准化的模块“Oxy”单元。这个设计让开发者可以像搭积木一样,通过简洁的Python代码快速组合、部署和升级AI协作系统,极大地降低了开发门槛。OxyGent的核心能力体现在其高效的开发流程、智能的动态协作机制、富有弹性的系统架构以及持续的自我进化能力,为开发者提供从构建、运行、评估到演化的完整工具链。

功能列表

  • 高效开发: 提供标准化的模块“Oxy”组件,开发者可以通过简洁的Python接口快速组装和重用这些即插即用的模块,无需复杂的配置文件,显著提升开发效率。
  • 智能协作: 采用动态规划的协作模式,使智能体能够根据任务的实时情况,智能地分解复杂任务、动态协商解决方案并适应环境变化,从而高效处理预设流程之外的突发状况。
  • 弹性架构: 底层架构灵活,支持从简单的ReAct(思考-行动循环)到复杂的混合规划模式等多种智能体组织结构。框架还提供可视化调试工具,帮助开发者优化系统性能。
  • 持续进化: 内置独立的评估引擎,能够基于智能体系统的运行日志自动生成用于优化的训练数据。通过这种知识反馈循环,系统可以在与环境和用户的交互中不断学习,实现自我优化和进化。
  • 生产级可扩展性: 采用分布式任务调度器,使得系统能够以线性的成本增长来支持协作智能的指数级提升,轻松应对大规模、高并发的实时决策任务。
  • 全流程可追溯: 提供完全透明的监控功能,开发者可以清晰地观察每一个智能体的完整思维过程,并对每一步决策实现审计和回溯,确保系统的可靠性和可解释性。

使用帮助

OxyGent 致力于为开发者提供一个易于上手的多智能体开发平台。无论您是经验丰富的AI专家还是初次接触该领域的用户,都可以参考以下步骤快速开始。

环境准备

开始之前,您需要一个Python 3.10或更高版本的环境。我们强烈建议使用conda来创建一个独立的环境,以避免与其他项目的依赖发生冲突。

  1. 创建并激活conda环境:打开您的终端,输入以下命令来创建一个名为oxy_env的独立环境并激活它。
    conda create -n oxy_env python==3.10
    conda activate oxy_env
    
  2. 安装OxyGent:激活conda环境后,您可以直接使用pip来安装OxyGent框架。
    pip install oxygent
    

    如果您想获取最新的功能或为项目贡献代码,可以从GitHub仓库克隆并进行源码安装:

    git clone https://github.com/jd-opensource/OxyGent.git
    cd OxyGent
    pip install -r requirements.txt
    
  3. 配置大语言模型(LLM):智能体的“思考”能力由大语言模型驱动。您需要配置至少一个LLM的API凭证。OxyGent支持通过环境变量或.env文件进行配置,推荐使用.env文件管理凭证。

    在您的项目根目录下创建一个名为.env的文件,并填入以下内容。请将your_...替换为您的真实凭证。

    DEFAULT_LLM_API_KEY="your_api_key"
    DEFAULT_LLM_BASE_URL="your_base_url"
    DEFAULT_LLM_MODEL_NAME="your_model_name"
    

构建第一个多智能体应用

下面我们通过一个实例,展示如何构建一个可以“查询当前时间,并将结果写入文件”的多智能体系统。

  1. 编写Python脚本:创建一个名为run_app.py的文件,复制以下代码。这段代码定义了系统所需的所有组件,并发起一个任务。
    import os
    import asyncio
    from oxygent import MAS, Config, oxy, preset_tools
    # 1. 设置全局默认的LLM模型名称
    Config.set_agent_llm_model("default_llm")
    # 2. 定义Oxy空间,这是构建系统的蓝图
    oxy_space = [
    # 定义一个HttpLLM作为默认的大语言模型驱动
    oxy.HttpLLM(
    name="default_llm",
    api_key=os.getenv("DEFAULT_LLM_API_KEY"),
    base_url=os.getenv("DEFAULT_LLM_BASE_URL"),
    model_name=os.getenv("DEFAULT_LLM_MODEL_NAME"),
    llm_params={"temperature": 0.0},
    ),
    # 加载框架预设的工具集
    preset_tools.time_tools,  # 时间查询工具
    preset_tools.file_tools,    # 文件读写工具
    preset_tools.math_tools,    # 数学计算工具
    # 3. 定义具备特定功能的智能体
    # 时间智能体,只负责处理和时间相关的任务
    oxy.ReActAgent(
    name="time_agent",
    desc="一个可以查询当前时间的智能体",
    tools=["time_tools"], # 仅可使用时间工具
    ),
    # 文件智能体,只负责文件读写
    oxy.ReActAgent(
    name="file_agent",
    desc="一个可以读写文件的智能体",
    tools=["file_tools"], # 仅可使用文件工具
    ),
    # 4. 定义一个主智能体,负责任务分解和协调
    oxy.ReActAgent(
    is_master=True,
    name="master_agent",
    # 主智能体可以调度以下子智能体
    sub_agents=["time_agent", "file_agent"],
    ),
    ]
    # 5. 定义异步主函数来启动系统
    async def main():
    # 使用定义的oxy_space来初始化多智能体系统(MAS)
    async with MAS(oxy_space=oxy_space) as mas:
    # 提出任务需求
    query = "现在是什么时间?请把结果保存到 time.txt 文件里。"
    response = await mas.run(query)
    print("任务完成,响应如下:")
    print(response)
    # 运行主函数
    if __name__ == "__main__":
    asyncio.run(main())
    
  2. 代码结构解析:
    • Config.set_agent_llm_model: 此行代码为系统中的所有智能体指定了默认使用的LLM实例名称,即default_llm
    • oxy_space: 这是一个列表,是OxyGent的核心概念。它像一个蓝图,定义了系统内所有可用的资源,包括LLM、工具和智能体。
    • oxy.HttpLLM: 定义了一个名为default_llm的LLM组件,它通过HTTP协议与模型API进行通信。
    • preset_tools: OxyGent内置了一些常用工具集,可以直接加载使用。这里我们加载了时间、文件和数学工具。
    • oxy.ReActAgent: 这是定义智能体的地方。我们定义了两个功能单一的“工具人”智能体(time_agentfile_agent),它们分别被授权使用不同的工具。
    • is_master=True: 这个参数将master_agent指定为“主智能体”。它不直接执行工具,而是负责理解用户总任务,将其分解,并调度合适的子智能体去完成子任务。
    • MAS(oxy_space=oxy_space)MAS (Multi-Agent System) 是系统的总控制器。我们用定义好的oxy_space来实例化它。
    • mas.run(query): 这是向系统提交任务的入口。MAS会激活主智能体来处理这个query
  3. 运行与观察:确保你的.env文件配置正确,然后在终端中运行脚本。
    python run_app.py
    

    执行后,脚本会输出任务最终的执行结果。同时,你会发现项目目录下多了一个time.txt文件,里面记录了脚本运行的时间。

    工作流程揭秘:当你运行mas.run后,系统内部发生了以下过程:a. 用户的请求“现在是什么时间?请把它保存到 time.txt 文件里”首先被发送给master_agent。b. master_agent利用其背后的LLM进行思考,将任务分解为两步:第一,获取当前时间;第二,将获取到的时间写入文件。c. master_agent根据子智能体的描述(desc字段),判断出time_agent最适合执行第一步。于是它向time_agent下达指令:“获取当前时间”。d. time_agent接收指令,调用其被授权的time_tools工具,得到当前时间,并将结果返回给master_agent。e. master_agent接收到时间结果后,继续执行第二步。它判断出file_agent最适合写入文件,于是向file_agent下达指令:“将以下内容写入time.txt文件:[上一步获取的时间]”。f. file_agent调用file_tools将内容写入文件,并向master_agent报告任务完成。g. 所有子任务完成后,master_agent向系统报告总任务完成,并生成最终的回复。

应用场景

  1. 自动化研究助理构建一个能够自动“阅读”网页、提取关键信息并生成摘要的智能体系统。例如,你可以让它监控特定领域的最新论文,下载PDF,将其转换为文本,再由另一个智能体进行总结,最后将摘要发送到你的邮箱。
  2. 企业级自动化流程在企业内部,可以部署OxyGent系统来处理复杂的业务流程。例如,一个订单处理系统可以由多个智能体协作完成:一个智能体负责接收客户订单,另一个负责查询库存,第三个负责调用物流API安排发货,主智能体则负责监控整个流程的顺利进行。
  3. 复杂的软件操作可以构建一个能够理解人类指令并操作复杂软件(如Photoshop、Excel)的智能体。用户只需用自然语言描述“帮我把这张图片的背景换成蓝色”,系统就能自动规划并执行一系列精确的软件操作。
  4. 智能游戏NPC在游戏开发中,可以使用OxyGent为NPC(非玩家角色)注入灵魂。不同的NPC可以作为独立的智能体,它们之间可以进行交流、协作甚至欺骗,从而创造出更加动态和真实的游戏世界。

QA

  1. OxyGent中的“Oxy”单元具体指什么?“Oxy”是OxyGent框架的核心抽象,它代表系统中的任何一个功能单元,可以是一个LLM模型(oxy.HttpLLM)、一个工具(oxy.Tool)、或是一个智能体(oxy.Agent)。这种统一的抽象使得所有组件都具备标准化的接口,可以被轻松地组合和管理。
  2. 相比于其他框架,OxyGent在“生产就绪”方面有哪些具体体现?主要体现在两个方面:一是其可扩展的分布式架构,能够应对高并发请求;二是其完整的可追溯性,系统中的每一次决策、每一次工具调用都有详细的日志记录,方便开发者进行调试、审计和优化,这在商业应用中至关重要。
  3. 如果我想添加一个自定义的工具,应该怎么做?OxyGent的设计使得添加自定义工具非常简单。你只需要编写一个标准的Python函数,并使用@oxy.tool装饰器来标记它,就可以将其注册为一个OxyGent工具。然后,在定义智能体时,将这个新工具的名称添加到其可用的tools列表中即可。
微信微博Email复制链接