多智能体框架
多个不同的角色的Agent,共同完成一份复杂的工作。由一个统筹管理的智能体,自主规划多个智能体分别做什么,以及执行的顺序。
agent 应该包含的属性
执行特定任务
根据其角色和目标做出决策
能够使用工具来实现目标
与其他代理沟通和协作
保留互动记忆
在允许的情况下委派任务
如何协作是关键
- 条件自主:通过编码,顺序执行。
- 高度自主:能够自行决定不同角色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,就能扩展功能。
相关文章:
多智能体框架
多个不同的角色的Agent,共同完成一份复杂的工作。由一个统筹管理的智能体,自主规划多个智能体分别做什么,以及执行的顺序。 agent 应该包含的属性 执行特定任务 根据其角色和目标做出决策 能够使用工具来实现目标 与其他代理沟通和协作 保留…...
C++ 正则表达式分组捕获入门指南
在 C 中,正则表达式(regex)是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符,还能捕获匹配的子字符串(即分组捕获)。这篇文章将介绍 C 正则表达式中的分组捕获机制&…...
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…...
【STM32】使用电打火器测试火焰传感器,去掉传感器LED依然亮
项目需求:火焰传感器识别到火焰后,LED灯闪烁,然后熄灭。 现象描述:不需要火焰传感器,当使用电打火器时电路板LED灯也会闪烁。(详情看底部视频) fire.h #ifndef __FIRE_H #define __FIRE_H …...
代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》
代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra(朴素版)总结 前言 今天是算法营的第64天,希望自己能够坚持下来! 今天继续图论part!今…...
机器学习数学基础:32.斯皮尔曼等级相关
斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数(Spearman’s rank - correlation coefficient),常用 ρ \rho ρ表示,是一种非参数统计量,用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…...
《论区块链技术及应用》审题技巧 - 系统架构设计师
区块链技术及应用论题写作框架 一、考点概述 本论题“区块链技术及应用”主要考察软件测试工程师对区块链技术的理解及其在软件项目中的实际应用能力。论题涵盖了多个关键方面,首先要求考生对区块链技术有全面的认识,包括但不限于其作为分布式记账技术…...
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…...
单片机的串口(USART)
Tx - 数据的发送引脚,Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平,起始位低电平,数据位有8位校验位,9位校验位,停止位是高电平保持一位或者半位,又或者两位的状态。 8位无校验位传输一个字节…...
Modelfile配置说明
参数说明翻译 参数描述值类型示例用法mirostat启用Mirostat采样以控制困惑度。(默认:0,0禁用,1Mirostat,2Mirostat 2.0)intmirostat 0mirostat_eta影响算法对生成文本反馈的响应速度。较低的学习率将导致调…...
pnpm的基本用法
以下是 pnpm 的核心命令和使用指南,涵盖从安装依赖到项目管理的常见操作: 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包(自动添加到 dependencies…...
动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题
动态规划(背包问题) 题目链接01背包代码 完全背包问题代码 多重背包问题 I代码 什么时候适用逆序多重背包问题 II(超百万级的复杂度)代码 关于二进制拆分 题目链接 01背包 代码 #include <iostream> #include <vector&…...
Vue 中动态实现进度条
在 Vue 中动态实现进度条,基本上有两种常见的方法:直接通过 Vue 数据绑定控制样式,或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式,并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...
如何基于PyTorch做二次开发
基于PyTorch进行二次开发以实现可视化工程,可以从以下几个方面入手:模型结构可视化、训练过程监控、特征可视化等。以下是一些推荐的GitHub项目,这些项目可以帮助你快速搭建一个可视化的工程环境: ### 1. **PyTorch CNN Visualiz…...
Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)
安装: 1、首先按照此视频的流程一步一步进行安装:(macos版)ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南:https://ragflow.io 3、RAGflow 下载地址:https://github.com/infi…...
算法——后缀平衡树
先回想一下之前讨论的内容。之前我们详细讨论了后缀树,包括它的构建、应用以及相关算法。用户可能是在了解后缀树之后,想要进一步探索相关的数据结构,或者是想比较后缀树和后缀平衡树的异同。 后缀平衡树并不是一个常见的数据结构名称&#…...
姿态矩阵/旋转矩阵/反对称阵
物理意义,端点矢量角速率叉乘本身向量; 负号是动系b看固定系i是相反的; 一个固定 在惯性导航解算中,旋转矢量的叉乘用于描述姿态矩阵的微分方程。你提到的公式中, ω i b b \boldsymbol{\omega}_{ib}^b \times ωibb…...
【大语言模型】【整合版】DeepSeek 模型提示词学习笔记(散装的可以看我之前的学习笔记,这里只是归纳与总结了一下思路,内容和之前发的差不多)
以下是个人笔记的正文内容: 原文在FlowUs知识库上,如下截图。里面内容和这里一样,知识排版好看一点 一、什么是 DeepSeek 1. DeepSeek 简介 DeepSeek 是一家专注于通用人工智能(AGI)的中国科技公司,主攻大模型研发与…...
ollama无法通过IP:11434访问
目录 1.介绍 2.直接在ollama的当前命令窗口中修改(法1) 3.更改ollama配置文件(法2) 3.1更新配置 3.2重启服务 1.介绍 ollama下载后默认情况下都是直接在本地的11434端口中运行,绑定到127.0.0.1(localhost)&#x…...
⭐算法OJ⭐位操作用法总结+实战指南(C++实现)
位操作在OJ 题目中是一种非常高效的工具,常用于优化时间复杂度和空间复杂度。本文是位操作在 OJ 题目中的主要用法总结,并以 C 实现为例。 相关题目:《C⭐算法OJ⭐Single Number 系列(位操作)》 文章目录 1. 基本位操…...
2.1 用大模型构建新人答疑机器人-大模型ACP模拟题-真题
真题 真题:如何初始化OpenAI客户端 client OpenAI( api_keyos.getenv("DASHSCOPE_API_KEY"), base_url"https://dashscope.aliyuncs.com/compatible-mode/v1", ) AI生成模拟题 一、单选题 (每题5分,共6题ÿ…...
单片机裸机编程-时机管理
对于 RTOS 实时操作系统,我们是通过 TASK(任务)进行底层操作的,这与裸机编程中的函数(fun)类似。不同的任务或函数实现不同的功能,在RTOS中,单片机有信号量、队列等不同任务之间的通…...
Bugku CTF CRYPTO
Bugku CTF CRYPTO 文章目录 Bugku CTF CRYPTO聪明的小羊ok[-<>]散乱的密文.!? 聪明的小羊 描 述: 一只小羊翻过了2个栅栏 fa{fe13f590lg6d46d0d0} 分 析:栅栏密码,分2栏,一个栏里有11个 ①手动解密 f a { f e 1 3 f 5 9 0 l g 6 d 4 …...
【洛谷】【ARC100E】Or Plus Max(高维前缀和)
传送门:Or Plus Max 高维前缀和 题目描述 長さ 2N の整数列 A0, A1, ..., A2N−1 があります。(添字が 0 から始まることに注意) 1 ≤ K ≤ 2N−1 を満たすすべての整数 K について、次の問題を解いてください。 i,j を整数と…...
宿主机的 root 是否等于 Docker 容器的 root?
在 Docker 容器化技术中,宿主机的 root 和 容器的 root 并不完全相同,尽管它们都称作 “root 用户”。这里需要明确的是,Docker 容器与宿主机之间存在隔离机制,容器内的 root 用户和宿主机的 root 用户有一些关键的区别。 1. 宿主…...
SmolLM2:多阶段训练策略优化和高质量数据集,小型语言模型同样可以实现卓越的性能表现
SmolLM2 采用创新的四阶段训练策略,在仅使用 1.7B 参数的情况下,成功挑战了大型语言模型的性能边界: 在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B 近 6 个百分点数学推理能力(GSM8K、MATH)优于 Llama3.2-1B在代码生成和文…...
云原生降本之路:技术创新与应用解析
随着云计算的快速发展,云原生技术已成为企业降低成本、提高效率的重要手段。本文基于腾讯云容器技术专家孟凡杰的PPT内容,深入探讨了云原生技术在降低企业成本方面的应用,包括资源利用现状、成本优化思路、Kubernetes中的资源分配、横向与纵向…...
