多智能体框架

news2025/2/26 14:06:13

多个不同的角色的Agent,共同完成一份复杂的工作。由一个统筹管理的智能体,自主规划多个智能体分别做什么,以及执行的顺序。

agent 应该包含的属性

执行特定任务

根据其角色和目标做出决策

能够使用工具来实现目标

与其他代理沟通和协作

保留互动记忆

在允许的情况下委派任务

如何协作是关键

  1. 条件自主:通过编码,顺序执行。
  2. 高度自主:能够自行决定不同角色Agent的是否要执行,以及执行顺序。

主要关注的点:

1、自主性

2、开发人员能够控制的精度 (可编码改造)

一、汇总

特性

AutoGen

agentScope

Swarm

CrewAI

LangGraph

时间 & star

2023.05

star 36.4k

2024.02

star 5.6k

2024.10

star 17.2k

2024年

star 22.9k

2023.01

star 7.5k

框架类型

对话智能体

角色智能体

角色智能体

角色智能体

基于图的智能体

自主性

高度自主

条件自主

条件自主

高度自主

条件自主

协作

集中式群聊

群聊

任务传递

具有角色和目标的自主智能体

基于条件的循环图

执行

由专用智能体管理

任务传递

动态委托,但可以定义层次化流程

所有智能体都可以执行

适用场景

原型设计

从开发到生产

详细控制场景

二、已有多智能体框架

2.1 AutoGen (微软)

2023.05

star 36.4k

GitHub - microsoft/autogen: A programming framework for agentic AI 🤖 PyPi: autogen-agentchat Discord: https://aka.ms/autogen-discord Office Hour: https://aka.ms/autogen-officehour

AutoGen 专注于对话智能体,提供对话作为多智能体协作的能力。它的设计理念围绕着模拟小组讨论,智能体发送和接收消息以启动或继续对话。

AutoGen 是一个用于构建 AI 代理系统的开源框架。它简化了事件驱动、分布式、可扩展且具有弹性的代理应用程序的创建。它允许您快速构建 AI 代理协作并自主或在人工监督下执行任务的系统。

autoGen 中定义的多智能体的模式

并发:通过传递消息给多种智能体。来执行

Concurrent Agents — AutoGen

顺序工作流,按顺序执行

Sequential Workflow — AutoGen

群聊:多个智能体,还有一个群聊管理器,群聊管理器,决定谁来发言。

群聊是一种设计模式,其中一组代理共享一个共同的消息线程:他们都订阅并发布同一主题。每个参与代理都专门负责一项特定任务,例如在协作写作任务中担任作家、插画师和编辑。您还可以添加一个代理来代表人类用户,以便在需要时帮助指导代理。

在群聊中,参与者轮流发布消息,并且该过程是连续的——每次只有一个代理在工作。在后台,轮流顺序由群聊管理器代理维护,该代理在收到消息后选择下一个发言的代理。选择下一个代理的具体算法可能因您的应用程序要求而异。通常,使用循环算法或具有 LLM 模型的选择器。

群聊可用于将复杂任务动态分解为较小的任务,这些任务可以由具有明确角色的专门代理来处理。还可以将群聊嵌套成层次结构,每个参与者都是一个递归群聊。

Group Chat — AutoGen

多智能体辩论

Multi-Agent Debate — AutoGen

2.2 AgentScope

2024.02

star 5.6k

文档:

AgentScope 文档 — AgentScope 文档

实现狼人杀的示例代码

样例:狼人杀游戏 — AgentScope 文档

https://img.alicdn.com/imgextra/i3/O1CN01n2Q2tR1aCFD2gpTdu_!!6000000003293-1-tps-960-482.gif

2.3 Swarm (openAI)

2024.10

star 17.2k

Swarm框架本身并不具备自我感知任务变化的能力。它依赖于开发者定义的智能体(Agent)和交接(Handoff)机制来管理和协调任务。智能体可以封装指令和工具,并能够独立执行任务或与其他智能体协作。当一个智能体遇到无法独立处理的任务时,它可以通过交接机制将任务传递给另一个智能体。这种设计允许智能体之间根据任务需求和能力匹配进行动态调整,确保任务能够以最高效的方式完成,但这需要开发者预先定义智能体的行为和交接逻辑。因此,Swarm框架的灵活性和适应性取决于开发者如何设计和实现智能体及其交互,而不是框架自身具备感知任务变化的能力。

swarm 集成了langchain的工具

示例:

from swarm import Agent

# 定义一个函数用于处理指定商品的退款
def process_refund(item_id, reason="NOT SPECIFIED"):
    """
    处理商品退款。

    参数:
        item_id (str): 要退款的商品唯一标识。
        reason (str): 退款原因,默认值为 "NOT SPECIFIED"。

    返回:
        str: 表示退款成功的消息。
    """
    print(f"[mock] Refunding item {item_id} because {reason}...")
    return "Success!"

# 定义一个函数用于对用户的购物车应用折扣
def apply_discount():
    """
    对用户的购物车应用折扣。

    返回:
        str: 表示折扣成功应用的消息。
    """
    print("[mock] Applying discount...")
    return "Applied discount of 11%"

# 创建一个分诊代理,用于将用户请求分配给合适的代理
triage_agent = Agent(
    name="Triage Agent",
    instructions="判断哪个代理最适合处理用户的请求,并将对话转移到该代理。",
)

# 创建一个销售代理,用于处理与销售相关的用户请求
sales_agent = Agent(
    name="Sales Agent",
    instructions="对销售蜜蜂表现出极大的热情。",
)

# 创建一个退款代理,用于处理与退款相关的用户请求
refunds_agent = Agent(
    name="Refunds Agent",
    instructions=(
        "帮助用户处理退款。如果退款原因是价格太贵,提供用户一个退款代码。"
        "如果用户坚持,则处理退款。"
    ),
    functions=[process_refund, apply_discount],
)

# 定义一个函数,如果用户提到的主题不在当前代理的职责范围内,则调用该函数将请求转回分诊代理
def transfer_back_to_triage():
    """
    当用户的请求超出当前代理的处理范围时调用此函数,将请求转回分诊代理。

    返回:
        Agent: 分诊代理实例。
    """
    return triage_agent

# 定义一个函数,用于将请求转移到销售代理
def transfer_to_sales():
    """
    将请求转移到销售代理。

    返回:
        Agent: 销售代理实例。
    """
    return sales_agent

# 定义一个函数,用于将请求转移到退款代理
def transfer_to_refunds():
    """
    将请求转移到退款代理。

    返回:
        Agent: 退款代理实例。
    """
    return refunds_agent

# 为分诊代理添加转移到销售和退款代理的功能
triage_agent.functions = [transfer_to_sales, transfer_to_refunds]

# 为销售代理添加转移回分诊代理的功能
sales_agent.functions.append(transfer_back_to_triage)

# 为退款代理添加转移回分诊代理的功能
refunds_agent.functions.append(transfer_back_to_triage)

2.4 CrewAI

2024年

star 22.9k

文档:Introduction - CrewAI

CrewAI 是一个用于协调角色扮演、自主 AI 代理的框架。它使代理能够无缝协作,通过协作智能处理复杂任务。

crewAI中支持的任务执行顺序,顺序执行,分层执行

串行执行示例

from crewai import Crew, Process, Agent, Task, TaskOutput, CrewOutput

# Define your agents
researcher = Agent(
  role='Researcher',
  goal='Conduct foundational research',
  backstory='An experienced researcher with a passion for uncovering insights'
)
analyst = Agent(
  role='Data Analyst',
  goal='Analyze research findings',
  backstory='A meticulous analyst with a knack for uncovering patterns'
)
writer = Agent(
  role='Writer',
  goal='Draft the final report',
  backstory='A skilled writer with a talent for crafting compelling narratives'
)

# Define your tasks
research_task = Task(
  description='Gather relevant data...', 
  agent=researcher, 
  expected_output='Raw Data'
)
analysis_task = Task(
  description='Analyze the data...', 
  agent=analyst, 
  expected_output='Data Insights'
)
writing_task = Task(
  description='Compose the report...', 
  agent=writer, 
  expected_output='Final Report'
)

# Form the crew with a sequential process
report_crew = Crew(
  agents=[researcher, analyst, writer],
  # 任务的顺序
  tasks=[research_task, analysis_task, writing_task],
  # 任务的执行顺序 顺序执行
  process=Process.sequential
)

# Execute the crew
result = report_crew.kickoff()

# Accessing the type-safe output
task_output: TaskOutput = result.tasks[0].output
crew_output: CrewOutput = result.output

分层执行示例

from langchain_openai import ChatOpenAI
from crewai import Crew, Process, Agent

# Agents are defined with attributes for backstory, cache, and verbose mode
researcher = Agent(
    role='Researcher',
    goal='Conduct in-depth analysis',
    backstory='Experienced data analyst with a knack for uncovering hidden trends.',
    cache=True,
    verbose=False,
    # tools=[]  # This can be optionally specified; defaults to an empty list
    use_system_prompt=True,  # Enable or disable system prompts for this agent
    max_rpm=30,  # Limit on the number of requests per minute
    max_iter=5  # Maximum number of iterations for a final answer
)
writer = Agent(
    role='Writer',
    goal='Create engaging content',
    backstory='Creative writer passionate about storytelling in technical domains.',
    cache=True,
    verbose=False,
    # tools=[]  # Optionally specify tools; defaults to an empty list
    use_system_prompt=True,  # Enable or disable system prompts for this agent
    max_rpm=30,  # Limit on the number of requests per minute
    max_iter=5  # Maximum number of iterations for a final answer
)

# Establishing the crew with a hierarchical process and additional configurations
project_crew = Crew(
    tasks=[...],  # Tasks to be delegated and executed under the manager's supervision
    agents=[researcher, writer],
    manager_llm=ChatOpenAI(temperature=0, model="gpt-4"),  # Mandatory if manager_agent is not set
    process=Process.hierarchical,  # Specifies the hierarchical management approach
    respect_context_window=True,  # Enable respect of the context window for tasks
    memory=True,  # Enable memory usage for enhanced task execution
    manager_agent=None,  # Optional: explicitly set a specific agent as manager instead of the manager_llm
    planning=True,  # Enable planning feature for pre-execution strategy
)

三、超级经典的案例-最近火热的deep-research

二月份初,从openai公布了deep-research开始,deep-research就开始变得非常火热。其实这个就是一个非常典型的多智能体协作的案例。定义了web查询智能体、代码执行智能体、文件检索智能体、写作智能体,还有规划问题的智能体。

auto-deep-research

特点

Auto-Deep-Research 是基于 AutoAgent多智能体框架构建的deep research产品。

评测效果

在通用AI助手评测GAIA中位列全球第三,是开源方案中的最优解。

多智能体框架

https://github.com/HKUDS/AutoAgent

系统采用模块化多Agent架构,通过Orchestrator Agent动态调度任务

模块功能技术特性
Web Agent深度网络搜索与文献抓取支持浏览器Cookies导入,突破学术资源访问限制
Coding Agent代码生成与优化(Python/R脚本调试、可视化优化、容器化部署)实现自动化编程与调试,支持Docker一键部署
Local File Agent多格式文件解析(PDF/CSV/XLSX等12种格式)自动转换为Markdown统一处理,支持200+页PDF深度解析

agent示例

def get_filesurfer_agent(model: str = "gpt-4o", **kwargs):
    
    def handle_mm_func(tool_name, tool_args):
        return f"After using tool {tool_name}({tool_args}), I have opened the image I want to see and prepared a question according to the image. Please answer the question based on the image."
    def instructions(context_variables):
        file_env: RequestsMarkdownBrowser = context_variables.get("file_env", None)
        assert file_env is not None, "file_env is required"
        return \
f"""
You are a file surfer agent that can handle local files.

You can only access the files in the folder `{file_env.docker_workplace}` and when you want to open a file, you should use absolute path from root like `{file_env.docker_workplace}/...`.

Note that `open_local_file` can read a file as markdown text and ask questions about it. And `open_local_file` can handle the following file extensions: [".html", ".htm", ".xlsx", ".pptx", ".wav", ".mp3", ".flac", ".pdf", ".docx"], and all other types of text files. 

But IT DOES NOT HANDLE IMAGES, you should use `visual_question_answering` to see the image. 

If the converted markdown text has more than 1 page, you can use `page_up`, `page_down`, `find_on_page_ctrl_f`, `find_next` to navigate through the pages.

When you think you have completed the task the `System Triage Agent` asked you to do, you should use `transfer_back_to_triage_agent` to transfer the conversation back to the `System Triage Agent`. And you should not stop to try to solve the user's request by transferring to `System Triage Agent` only until the task is completed.

If you are unable to open the file, you can transfer the conversation back to the `System Triage Agent`, and let the `Coding Agent` try to solve the problem by coding.
"""
    tool_list = [open_local_file, page_up_markdown, page_down_markdown, find_on_page_ctrl_f, find_next, visual_question_answering]
    return Agent(
        name="File Surfer Agent",
        model=model, 
        instructions=instructions,
        functions=tool_list,
        handle_mm_func=handle_mm_func,
        tool_choice = "required", 
        parallel_tool_calls = False
    )

优势

在多智能体框架下,有非常好的扩展性,只需要定义和实现一些具有特色功能的agent,就能扩展功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误:编程路上的 “绊脚石” 在 C# 编程中,错误大致可分为两类:语法错误和语义错误(逻辑错误)。语法错误就像是写作文时的错别字和病句,编译器一眼就能识别出来,比如变量名拼写错误、符…

Jmeter接口并发测试

Apache JMeter 是一款开源的性能测试工具,广泛用于接口并发测试、负载测试和压力测试。以下是使用 JMeter 进行接口并发测试的详细步骤: 一、准备工作 安装 JMeter 下载地址:Apache JMeter 官网 确保已安装 Java 环境(JMeter 依…

MySQL-增删改查

一、Create(创建) 📖 语法: INSERT INTO table_name(value_list); 当我们使用表的时候,就可以使用这个语法来向表中插入元素~ 我们这边创建一个用于示范的表(Student)~ create table student( id int, name varchar(20), chinese int, math…

开源堡垒机 JumpServer 社区版实战教程:发布机的配置与Website资产配置使用

文章目录 开源堡垒机 JumpServer 社区版实战教程:发布机的配置与Website资产配置使用一、功能简述二、应用发布机2.1 版本要求2.2 创建应用发布机2.2.1 通过WinRM的协议进行应用发布机的创建2.2.2 通过OpenSSH的协议进行应用发布机的创建2.2.2.1 下载OpenSSH2.2.2.2…

代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》

代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra(朴素版)总结 前言 今天是算法营的第64天,希望自己能够坚持下来! 今天继续图论part!今…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…

单片机的串口(USART)

Tx - 数据的发送引脚,Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平,起始位低电平,数据位有8位校验位,9位校验位,停止位是高电平保持一位或者半位,又或者两位的状态。 8位无校验位传输一个字节…

动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题

动态规划&#xff08;背包问题&#xff09; 题目链接01背包代码 完全背包问题代码 多重背包问题 I代码 什么时候适用逆序多重背包问题 II&#xff08;超百万级的复杂度&#xff09;代码 关于二进制拆分 题目链接 01背包 代码 #include <iostream> #include <vector&…

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…

姿态矩阵/旋转矩阵/反对称阵

物理意义&#xff0c;端点矢量角速率叉乘本身向量&#xff1b; 负号是动系b看固定系i是相反的&#xff1b; 一个固定 在惯性导航解算中&#xff0c;旋转矢量的叉乘用于描述姿态矩阵的微分方程。你提到的公式中&#xff0c; ω i b b \boldsymbol{\omega}_{ib}^b \times ωibb…

【大语言模型】【整合版】DeepSeek 模型提示词学习笔记(散装的可以看我之前的学习笔记,这里只是归纳与总结了一下思路,内容和之前发的差不多)

以下是个人笔记的正文内容: 原文在FlowUs知识库上&#xff0c;如下截图。里面内容和这里一样&#xff0c;知识排版好看一点 一、什么是 DeepSeek 1. DeepSeek 简介 DeepSeek 是一家专注于通用人工智能&#xff08;AGI&#xff09;的中国科技公司&#xff0c;主攻大模型研发与…

ollama无法通过IP:11434访问

目录 1.介绍 2.直接在ollama的当前命令窗口中修改&#xff08;法1&#xff09; 3.更改ollama配置文件&#xff08;法2&#xff09; 3.1更新配置 3.2重启服务 1.介绍 ollama下载后默认情况下都是直接在本地的11434端口中运行&#xff0c;绑定到127.0.0.1(localhost)&#x…

Bugku CTF CRYPTO

Bugku CTF CRYPTO 文章目录 Bugku CTF CRYPTO聪明的小羊ok[-<>]散乱的密文.!? 聪明的小羊 描 述: 一只小羊翻过了2个栅栏 fa{fe13f590lg6d46d0d0} 分 析&#xff1a;栅栏密码&#xff0c;分2栏&#xff0c;一个栏里有11个 ①手动解密 f a { f e 1 3 f 5 9 0 l g 6 d 4 …

【洛谷】【ARC100E】Or Plus Max(高维前缀和)

传送门&#xff1a;Or Plus Max 高维前缀和 题目描述 長さ 2N の整数列 A0​, A1​, ..., A2N−1​ があります。&#xff08;添字が 0 から始まることに注意&#xff09; 1 ≤ K ≤ 2N−1 を満たすすべての整数 K について、次の問題を解いてください。 i,j を整数と…

SmolLM2:多阶段训练策略优化和高质量数据集,小型语言模型同样可以实现卓越的性能表现

SmolLM2 采用创新的四阶段训练策略&#xff0c;在仅使用 1.7B 参数的情况下&#xff0c;成功挑战了大型语言模型的性能边界&#xff1a; 在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B 近 6 个百分点数学推理能力&#xff08;GSM8K、MATH&#xff09;优于 Llama3.2-1B在代码生成和文…

《Effective Objective-C》阅读笔记(中)

目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 ​编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…

Hbase客户端API——语句大全

目录 创建表&#xff1a; 插入数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; 查询数据&#xff1a;Get 查询数据&#xff1a;Scan 查询数据&#xff1a;过滤查询 创建表&#xff1a; 检验&#xff1a; 插入数据&#xff1a; 验证 一次多条数据插入 验证&…

MQ(Message Queue)

目录 MQ(Message Queue)基本概念 为什么要使用消息队列&#xff1f; 使用消息队列有什么缺点&#xff1f; 如何保证消息不丢失?(如何保证消息的可靠性传输?/如何处理消息丢失的问题?) 通用的MQ场景&#xff1a; RabbitMQ如何保证消息不丢失&#xff1f; 生产者丢数据…

计算机网络————(三)

前文二 前文一 Websocket协议 是一种存在TCP协议之上的协议 当客户端需要了解服务器是否更新就需要不断给客户端发送请求询问是否更新&#xff0c;这行会造成服务端压力很大 而Websocket相当于服务器一旦更新了就会给客户端发送消息表明自己更新了&#xff0c;类似客户端订阅…

【音视频】音视频录制、播放原理

一、音视频录制原理 通常&#xff0c;音视频录制的步骤如下图所示&#xff1a; 我们分别从音频和视频开始采样&#xff0c;通过麦克风和摄像头来接受我们的音频信息和图像信息&#xff0c;这通常是同时进行的&#xff0c;不过&#xff0c;通常视频的采集会比音频的采集慢&…