AutoGen:玩转多智能体团队协作 (Teams)

  • 👉👉👉本人承接各类AI相关应用开发项目(包括但不限于大模型微调、RAG、AI智能体、NLP、机器学习算法、运筹优化算法、数据分析EDA等) !!!
  • 👉👉👉 有意愿请私信!!!

AutoGen 的 AgentChat 模块为我们提供了强大的多智能体协作能力,通过 Teams 功能,我们可以轻松构建一个由多个智能体组成的团队,共同完成复杂的任务。本文将带你一步步了解如何创建、运行、观察、控制和管理一个 AutoGen 团队,并结合示例代码,让你快速上手实践。

为什么要使用 Teams?

在处理需要协作和专业知识的任务时,多智能体团队是一个强大的工具。与单个智能体相比,团队可以并行处理任务,利用每个智能体的独特优势,从而更有效地解决复杂问题。然而,团队也需要更多的管理和协调,AutoGen 旨在简化这个过程。

注意: 对于简单的任务,首先考虑使用单个智能体。只有当单个智能体无法胜任时,再转向多智能体团队。在创建团队之前,确保已经优化了单个智能体,并赋予了它所需的工具和指令。

创建一个 Team

AutoGen 中的 RoundRobinGroupChat 是一种简单而有效的团队配置,它允许所有智能体共享相同的上下文,并以轮询方式依次响应。每个智能体在轮到自己时,将响应广播给所有其他智能体,确保团队保持一致的上下文。

我们将创建一个包含两个 AssistantAgent 的团队:一个主要智能体和一个评论员智能体。同时,我们使用 TextMentionTermination 条件,当评论员智能体的响应中出现特定词语时,停止团队的运行。

import asyncio

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.base import TaskResult
from autogen_agentchat.conditions import ExternalTermination, TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core import CancellationToken
from autogen_ext.models.openai import OpenAIChatCompletionClient


# 创建一个使用  deepseek 模型的 Agent
model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",
    base_url="https://api.deepseek.com",
    api_key="sk-XXXXXXX",
    model_info={
        "vision": True,
        "function_calling": True,
        "json_output": True,
        "family": "unknown",
    },
)

# 创建主要智能体
primary_agent = AssistantAgent(
    "primary",
    model_client=model_client,
    system_message="你是一个乐于助人的 AI 助手。",
)

# 创建评论员智能体
critic_agent = AssistantAgent(
    "critic",
    model_client=model_client,
    system_message="提供建设性的反馈。当你的反馈得到解决时,回复 'APPROVE'。",
)

# 定义一个终止条件,当评论员批准时,停止任务
text_termination = TextMentionTermination("APPROVE")

# 创建一个包含主要智能体和评论员智能体的团队
team = RoundRobinGroupChat([primary_agent, critic_agent], 
                           termination_condition=text_termination)

上述代码实现了“反思”模式,即一个评论员智能体评估主要智能体的响应。

运行 Team

使用 run() 方法启动团队,并为其分配一个任务:

# 在脚本中运行时,使用 `asyncio.run(...)`
result = await team.run(task="写一首关于秋天的短诗。")
print(result)

 我们看到返回结果result是一个TextMessage消息体的集合,里面包含了 user,和我们定义的primary,critic 这两个智能体,下面我们过滤一下result的内容,以便提取我们想要的结果:

print(result.messages[1].content)

团队会运行智能体,直到满足终止条件。在本例中,团队以轮询顺序运行智能体,直到在智能体的响应中检测到“APPROVE”一词。团队停止后,会返回一个 TaskResult 对象,其中包含团队中智能体生成的所有消息。

观察 Team

你可以使用 run_stream() 方法在团队运行时流式传输团队的消息。此方法返回一个生成器,该生成器会生成团队中智能体生成的消息,最后一个项目是 TaskResult 对象。

# 在脚本内部运行时,使用异步 main 函数并通过 `asyncio.run(...)` 调用它
await team.reset()  # 为新任务重置团队
async for message in team.run_stream(task="写一首关于秋天的短诗。"):  # type: ignore
    if isinstance(message, TaskResult):
        print("停止原因:", message.stop_reason)
    else:
        print(message)

如上例所示,你可以通过检查 stop_reason 属性来确定团队停止的原因。

 Console()方法提供了一种方便的方式,可以将消息以适当的格式打印到控制台。

await team.reset()  # 为新任务重置团队
await Console(team.run_stream(task="写一首关于秋天的短诗。"))  # 将消息流式传输到控制台

 

重置 Team

你可以通过调用  reset() 方法重置团队。此方法将清除团队的状态,包括所有智能体。它将调用每个智能体的  on_reset()方法来清除智能体的状态。

await team.reset()  # 为下一次运行重置团队

如果下一个任务与上一个任务无关,通常最好重置团队。但是,如果下一个任务与上一个任务相关,则无需重置,而是可以恢复团队。

停止 Team

除了自动终止条件(例如  TextMentionTermination)之外,你还可以通过使用 ExternalTermination 从外部停止团队。

在  ExternalTermination 上调用 set() 会在当前智能体的回合结束时停止团队。因此,团队可能不会立即停止。这允许当前智能体完成其回合并将最终消息广播到团队,然后再停止团队,从而保持团队状态的一致性。

# 创建一个带有外部终止条件的新团队
external_termination = ExternalTermination()
team = RoundRobinGroupChat(
    [primary_agent, critic_agent],
    termination_condition=external_termination | text_termination,  # 使用按位 OR 运算符来组合条件
)

# 在后台任务中运行团队
run = asyncio.create_task(Console(team.run_stream(task="写一首关于秋天的短诗。")))

# 等待一段时间
await asyncio.sleep(0.1)

# 停止团队
external_termination.set()

# 等待团队完成
await run

从上面的输出中,你可以看到团队因满足外部终止条件而停止,但发言智能体能够在团队停止之前完成其回合。

恢复 Team

除非你重置团队,否则团队是有状态的,并在每次运行后保持对话历史记录和上下文。

你可以通过再次调用 run() 或  run_stream() 方法来恢复团队,从而从上次停止的地方继续,而无需提供新任务。 RoundRobinGroupChat 将从轮询顺序中的下一个智能体继续。

await Console(team.run_stream())  # 恢复团队以继续上一个任务

你可以看到团队从上次停止的地方恢复,并且第一条消息来自团队停止之前发言的最后一个智能体之后的下一个智能体。

让我们在保留有关上一个任务的上下文的同时,使用新任务再次恢复团队。

# 新任务是将同一首诗翻译成中文唐诗风格。
await Console(team.run_stream(task="将这首诗用中文唐诗风格写一遍。"))

 

中止 Team

你可以在执行期间通过设置传递给 cancellation_token 参数的 CancellationToken 来中止对 run() 或 run_stream() 的调用。

与停止团队不同,中止团队将立即停止团队并引发 CancelledError 异常。

注意: 当团队中止时,调用方将收到 CancelledError 异常。

# 创建一个取消令牌
cancellation_token = CancellationToken()

# 使用另一个协程运行团队
run = asyncio.create_task(
    team.run(
        task="将这首诗翻译成西班牙语。",
        cancellation_token=cancellation_token,
    )
)

# 取消运行
cancellation_token.cancel()

try:
    result = await run  # 这将引发 CancelledError。
except asyncio.CancelledError:
    print("任务已取消。")

总结

AutoGen 的 Teams 功能为我们提供了一种构建多智能体协作系统的强大方式。通过了解如何创建、运行、观察、控制和管理团队,你可以充分利用 AutoGen 的 AgentChat 模块,解决各种复杂的任务。希望本文能帮助你快速上手 AutoGen 的 Teams 功能,并在实践中发挥其强大的潜力!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下…

分享8款AI生成PPT的工具!含测评

随着人工智能技术的飞速进步,制作PPT变得愈发便捷,仅需输入主题指令,便能在瞬间获得一份完整的演示文稿。尤其在制作篇幅较长的PPT时,手动编写每一页内容并设计格式和排版,不仅效率低下,而且耗时耗力。 本…

50页PDF|数字化转型成熟度模型与评估(附下载)

一、前言 这份报告依据GBT 43439-2023标准,详细介绍了数字化转型的成熟度模型和评估方法。报告将成熟度分为五个等级,从一级的基础转型意识,到五级的基于数据的生态价值构建与创新,涵盖了组织、技术、数据、资源、数字化运营等多…

aistdio部署deepseek-r1纯教程

前言 笔者电脑未扩容,想玩玩本地化的deepseek,苦于👇久矣, 想到之前老师介绍的百度云平台飞桨AI Studio星河社区-人工智能学习与实训社区 于是就开始尝试部署终端版deepseek. 一、新建项目 1.打开飞桨网站,创建not…

实现动态翻转时钟效果的 HTML、CSS 和 JavaScript,附源码

实现动态翻转时钟效果的 HTML、CSS 和 JavaScript 在现代网页设计中,动画效果可以极大地增强用户体验。本文将介绍如何利用 HTML、CSS 和 JavaScript 创建一个动态翻转时钟的效果,模拟经典机械翻页时钟的视觉效果。我们将通过详细的步骤讲解如何实现时钟…

RagFlow+Ollama 构建RAG私有化知识库

RagFlowOllama 构建RAG私有化知识库 关于RAG一、什么是RAGFlow一、RAGFlow 安装配置测服已有服务: mysql、redis、elasticsearch 二、RAGFlow 配置 ollama:本地运行大型语言模型的工具软件。用户可以轻松下载、运行和管理各种开源 LLM。降低使用门槛&…

JavaScript(JS)

介绍 JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互 JavaScript 和Java 是完全不同的语言,不论是概念还是设计。但是基础语法类似 JS引入方式 内部脚本:将JS代码定义在HTML页面中 JavaScript代码…

LLM 架构

LLM 分类 : 自编码模型 (encoder) : 代表模型 : BERT自回归模型 (decoder) : 代表模型 : GPT序列到序列模型 (encoder-decoder) : 代表模型 : T5 自编码模型 (AutoEncoder model , AE) 代表模型 : BERT (Bidirectional Encoder Representation from Transformers)特点 : Enc…

剑指 Offer II 023. 两个链表的第一个重合节点

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20023.%20%E4%B8%A4%E4%B8%AA%E9%93%BE%E8%A1%A8%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%87%8D%E5%90%88%E8%8A%82%E7%82%B9/README.md 剑指 Offer II 023. 两…

【git-hub项目:YOLOs-CPP】本地实现04:项目简化

项目跑通之后,我们常常还需要对我们没有用到的任何内容进行删除,以简化项目体积,也便于我们阅读和后续部署。如何实现呢?本篇博客教会大家实现! 项目一键下载【⬇️⬇️⬇️】: 精简后:【GitHub跑通项目:YOLOs-CPP】+【计算机视觉】+【YOLOv11模型】+【windows+Cpp+ONN…

R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...

全文链接:https://tecdat.cn/?p40152 在统计学领域中,层次建模是一种极为强大且实用的工具。它能够巧妙地处理复杂的数据结构,通过分层的方式对数据进行建模。在贝叶斯统计的框架内,层次建模优势尽显,其可以有效地融合…

解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器

一、引言 在机器学习的广阔领域中,算法的选择犹如为一场冒险挑选趁手的武器,至关重要。面对海量的数据和复杂的任务,合适的算法能够化繁为简,精准地挖掘出数据背后隐藏的模式与价值。机器学习领域有十大核心算法,而随…

网络工程师 (43)IP数据报

前言 IP数据报是互联网传输控制协议(Internet Protocol,IP)的数据报格式,由首部和数据两部分组成。 一、首部 IP数据报的首部是控制部分,包含了数据报传输和处理所需的各种信息。首部可以分为固定部分和可变部分。 固定…

部署k8s 集群1.26.0(containerd方式)

随着k8s版本逐步更新,在不支持docker环境的情况下,需要使用containerd方式作为容器引擎。为了更好的个人学习使用,需要重新部署一套1.26.0版本的k8s集群,并且使用containerd方式作为容器引擎,版本为1.6.33。在部署过程…

移动通信发展史

概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通:成立于 2000 年…

HarmonyOS进程通信及原理

大家好,我是学徒小z,最近在研究鸿蒙中一些偏底层原理的内容,今天分析进程通信给大家,请用餐😊 文章目录 进程间通信1. 通过公共事件(ohos.commonEventManager)公共事件的底层原理 2. IPC Kit能…

openCV中如何实现滤波

图像滤波用于去除噪声和图像平滑,OpenCV 提供了多种滤波器: 1.1. 均值滤波: import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…

Linux网络 | 多路转接Reactor

前言:本节内容结束Linux网络部分。本节将要简单实现一下多路转接Reactor的代码,制作一个多路转接版本的四则运算计算器服务器。Reactor的代码相当困难,除了350多行新代码, 还要用到我们之前写的许多文件, 比如之前写的…

数控机床设备分布式健康监测与智能维护系统MTAgent

数控机床设备分布式健康监测与智能维护系统MTAgent-v1.1融合了目前各种先进的信号处理以及信息分析算法以算法工具箱的方式,采用了一种开发的、模块化的结构实现信号各种分析处理,采用Python编程语言,满足不同平台需求(包括Windows、Linux)。…

Opencv项目实战:26 信用卡号码识别与类型判定

项目介绍 在日常生活中,信用卡的使用越来越普遍。本项目的主要目标是通过图像处理技术自动识别信用卡号码,并根据信用卡号码的第一个数字判定信用卡的类型(如Visa、MasterCard等)。项目结合了图像预处理、轮廓检测、模板匹配等技…