微软AutoGen高级功能:Swarm

介绍

大家好,博主又来给大家分享知识了,这次给大家分享的内容是微软AutoGen框架的高级功能SwarmSwarm直译为“群体”,但是在AutoGen框架中我们会称它为“集群智能体” 或 “智能体群”。那么它是用来做什么的或它又是什么功能呢,我们直接进入正题。

Swarm

Swarm实现了一种团队模式,在这种模式下,智能体可以根据自身的能力将任务移交给其他智能体。这是一种由OpenAI在“集群智能体(Swarm)” 概念中首次提出的多智能体设计模式。其关键理念是让智能体通过调用一种特殊的工具,将任务委托给其他智能体,同时所有智能体共享相同的消息上下文。这使得智能体能够就任务规划做出局部决策,而无需像在 “选择器群聊(SelectorGroupChat)” 中那样依赖一个中央协调器。

它如何运作

从核心层面来讲,“集群智能体(Swarm)”是一种群聊模式,在其中各个智能体轮流生成回复内容。与“选择器群聊(SelectorGroupChat)”和“循环轮询群聊(RoundRobinGroupChat)” 类似,参与的智能体将各自的回复进行广播,这样所有智能体就共享相同的消息上下文。

与另外两种群聊团队模式不同的是,在每一轮中,发言的智能体是根据上下文中最新的“任务移交消息(HandoffMessage)”来选定的。这自然就要求团队中的每个智能体都能够生成“任务移交消息”,以表明它将任务移交给了其他哪些智能体。

对于“助理智能体(AssistantAgent)”,我们可以设置“handoffs”参数来指定它能够将任务移交给哪些智能体。你可以使用“任务移交(Handoff)”来定制消息内容和任务移交行为。

整个过程可以总结如下:

  1. 每个智能体都具备生成 “任务移交消息(HandoffMessage)”的能力,以此来表明它可以将任务移交给其他哪些智能体。对于“助理智能体(AssistantAgent)”而言,这意味着要设置 “handoffs”参数。
  2. 当团队开始处理一项任务时,第一个发言的智能体对该任务进行处理,并就是否移交任务以及移交给谁做出局部决策。
  3. 当一个智能体生成一条 “任务移交消息” 时,接收任务的智能体将在相同的消息上下文下接手该任务。
  4. 这个过程会一直持续,直到满足终止条件为止。

博主笔记:"助理智能体(AssistantAgent)”利用模型的工具调用能力来生成任务移交信息。这意味着模型必须支持工具调用。如果模型进行并行工具调用,可能会同时生成多个任务移交信息,这可能会导致意外行为情况。为避免这种情况,我们可以通过配置模型客户端来禁用并行工具调用。对于 “OpenAIChatCompletionClient”和“AzureOpenAIChatCompletionClient”,我们可以在配置中设置parallel_tool_calls=False

为了加以说明,我将向大家展示两个关于如何使用“集群智能体(Swarm)”的示例:

  1. 一个有人参与其中进行任务移交的客户支持团队。
  2. 一个用于内容生成的自主团队。

客户支持示例

 该系统通过两个智能体实现了一个航班退票场景:

  1. 旅行社智能体:处理一般性的旅行事务以及退票协调工作。
  2. 航班退票智能体:擅长使用"refund_flight(办理航班退票)"工具来处理航班退票事宜。

此外,当智能体将任务移交给"用户"时,我们让用户与这些智能体进行交互。

工作流程

1. 旅行社智能体开启对话并评估用户的请求。
2. 根据该请求:
     · 对于与退票相关的任务,旅行社智能体将任务移交给航班退票智能体。
     · 对于需要从客户那里获取的信息,任意一个智能体都可以将任务移交给 “用户”。
3.航班退票智能体在适当时会使用 “办理航班退票(refund_flight)” 工具来处理退票事宜。
4.如果某个智能体将任务移交给“用户”,团队的执行将暂停,并等待用户输入回复。
5.当用户提供输入内容时,该内容会作为一条任务移交消息(HandoffMessage)发送回团队。这条消息会被发送给最初请求用户输入的智能体。
6.这个过程会持续进行,直到旅行社智能体判定任务已完成并终止工作流程。

首先,我们先引用“客户支持示例”需要用到的模块。

导入模块演示代码

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import HandoffTermination, TextMentionTermination
from autogen_agentchat.messages import HandoffMessage
from autogen_agentchat.teams import Swarm
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient

其次,我们实现一个“航班退票”功能。

航班退票代码演示

def refund_flight(flight_id: str) -> str:
    """办理航班退票"""
    return f"Flight {flight_id} refunded"

再次,我们声明并实例化两个智能体,一个是旅行社智能体,另一个是航班退票智能体。

实例化智能体代码演示

model_client = OpenAIChatCompletionClient(
    model="gpt-4o",
    # api_key="sk-...", # 如果已设置OPENAI_API_KEY环境变量,此步骤可选。
)

travel_agent = AssistantAgent(
    "travel_agent",
    model_client=model_client,
    handoffs=["flights_refunder", "user"],
    system_message="""You are a travel agent.
    The flights_refunder is in charge of refunding flights.
    If you need information from the user, you must first send your message, then you can handoff to the user.
    Use TERMINATE when the travel planning is complete.""",
)

flights_refunder = AssistantAgent(
    "flights_refunder",
    model_client=model_client,
    handoffs=["travel_agent", "user"],
    tools=[refund_flight],
    system_message="""You are an agent specialized in refunding flights.
    You only need flight reference numbers to refund a flight.
    You have the ability to refund a flight using the refund_flight tool.
    If you need information from the user, you must first send your message, then you can handoff to the user.
    When the transaction is complete, handoff to the travel agent to finalize.""",
)

 再次,我定义并实例化一个“终止条件”对象,和本次重点讲解的集群智能体(Swarm)对象。

终止条件代码演示

termination = HandoffTermination(target="user") | TextMentionTermination("TERMINATE")
team = Swarm([travel_agent, flights_refunder], termination_condition=termination)

而后,我们实现一个async(异步)方法def run_team_stream(),模拟一个智能体团队与用户之间的交互过程。

交互过程代码演示

task = "I need to refund my flight."


async def run_team_stream() -> None:
    task_result = await Console(team.run_stream(task=task))
    last_message = task_result.messages[-1]

    while isinstance(last_message, HandoffMessage) and last_message.target == "user":
        user_message = input("User: ")

        task_result = await Console(
            team.run_stream(task=HandoffMessage(source="user", target=last_message.source, content=user_message))
        )
        last_message = task_result.messages[-1]

asyncio.run(run_team_stream())

最后,我们展示完整代码并运行看结果。

完整代码

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import HandoffTermi
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老赵爱学习

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值