一文读懂 AutoGen SelectorGroupChat:多智能体协作的"最强大脑"!

注意补充:
Ollama 当前并不支持模型工具(function calling)功能,因此在 SelectorGroupChat 场景下,无法体验到如工具调用、函数执行等高级能力。笔者推荐:

  • 可以在 LM Studio 中尝试支持 function calling 的模型(如 OpenAI GPT-4/3.5、Gemini Pro 等),体验完整的多智能体工具协作。
  • 或者直接在 Linux 环境下安装 vllm,结合 HuggingFace 支持 function calling 的大模型,获得最佳效果。

前言

在AI应用日益复杂的今天,单一智能体(Agent)已难以满足多变的业务需求。如何让多个智能体高效协作、动态分工,成为AI开发者关注的焦点。微软AutoGen框架应运而生,其中 SelectorGroupChat 机制,堪称多智能体协作的"最强大脑"!本文将带你全面了解SelectorGroupChat的原理、用法与实战技巧。


一、SelectorGroupChat 是什么?(概念与作用)

SelectorGroupChat 是 AutoGen 框架中支持多智能体协作的群聊模式。它允许通过自定义选择器(selector)机制,动态决定每轮由哪些Agent参与响应,适合复杂分工、动态决策、多角色协作等场景。

官方文档AutoGen Selector Group Chat


二、核心工作流程全解析(附流程图)

SelectorGroupChat 的典型工作流如下:

  1. 任务由 SelectorGroupChat 接收,根据各Agent描述,选择最合适的Agent(通常是Planning Agent)处理初始任务。
  2. Planning Agent 分析任务,拆解为若干子任务,并用 <代理名称> : <任务描述> 格式分配给其他Agent。
  3. SelectorGroupChat 管理器根据上下文和Agent描述,动态选择下一个Agent处理分配的子任务。
  4. Web Search Agent 逐步检索信息,结果存入共享对话历史。
  5. Data Analyst 在被选中时,利用工具处理和分析信息。
  6. 该流程循环,直到:
    • Planning Agent 判断所有子任务完成并发送"TERMINATE"
    • 或达到其它终止条件(如最大消息数)

流程图

任务输入
SelectorGroupChat 选择合适Agent
Planning Agent 拆解任务
分配子任务给其他Agent
Web Search Agent 检索信息
Data Analyst 计算分析
SelectorGroupChat 动态选择下一个Agent
任务是否全部完成?
Planning Agent 总结并 TERMINATE

三、SelectorGroupChat 的核心机制

  • Selector 选择器机制:每轮对话,SelectorGroupChat 会调用 selector 函数,根据当前上下文和历史消息,选择本轮参与的Agent。
  • 终止条件(Termination)机制:可灵活配置终止条件,如关键词、最大消息数等,自动控制对话流程。
  • 支持异步/同步 selector:selector 可为同步或异步函数,适配多种业务场景。
  • 选择逻辑灵活:可基于消息内容、轮次、外部信号等自定义选择逻辑。

四、实战:SelectorGroupChat 代码示例与讲解

下面以一个典型的多智能体协作任务为例,演示 SelectorGroupChat 的用法:

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import SelectorGroupChat
from autogen_agentchat.conditions import TextMentionTermination, MaxMessageTermination

# 定义模型客户端(以Ollama为例)
model_client = OllamaChatCompletionClient(
    model="qwen2.5-coder:latest",
    model_info={
        "family": "ollama",
        "vision": False,
        "function_calling": True,
        "json_output": False,
        "structured_output": True,
    }
)

def search_web_tool(query: str) -> str:
    # 伪造数据,实际可接API
    if "2006-2007" in query:
        return "德怀恩·韦德:1397分"
    elif "2007-2008" in query:
        return "德怀恩·韦德2007-2008赛季总篮板:214"
    elif "2008-2009" in query:
        return "德怀恩·韦德2008-2009赛季总篮板:398"
    return "未找到数据"

def percentage_change_tool(start: float, end: float) -> float:
    return ((end - start) / start) * 100

planning_agent = AssistantAgent(
    "PlanningAgent",
    description="一个用于规划任务的代理。",
    model_client=model_client,
    system_message="""
    你是一个规划代理。
    你的工作是将复杂任务分解为更小的子任务,并分配给团队成员:
        WebSearchAgent:搜索信息
        DataAnalystAgent:数据分析
    你只负责规划和分配任务,不执行具体操作。
    分配任务格式:1. <代理名称> : <任务描述>
    分配完任务后直接结束输出。
    在其它智能体回复之后,分析任务是否完成,当所有任务完成后,总结发现并以"TERMINATE"结束。
    """,
)

web_search_agent = AssistantAgent(
    "WebSearchAgent",
    description="一个用于网络检索的代理。",
    tools=[search_web_tool],
    model_client=model_client,
    system_message="""
    你是一个网络搜索代理。
    你唯一的工具是search_tool,只能用它查找信息。
    你一次只进行一次搜索,不做数据分析。
    """,
)

data_analyst_agent = AssistantAgent(
    "DataAnalystAgent",
    description="一个用于数据分析的代理。",
    model_client=model_client,
    tools=[percentage_change_tool],
    system_message="""
    你是一个数据分析师。
    你只负责分析和计算,不负责检索信息。
    如果没有数据,请主动索取。
    """,
)

termination = TextMentionTermination("TERMINATE") | MaxMessageTermination(25)

selector_prompt = """选择一个代理来执行任务。
{roles}
当前对话上下文:
{history}
阅读上述对话,然后从{participants}中选择一个代理来执行下一个任务。
确保规划代理在其他代理开始工作之前分配了任务。
只选择一个代理。
"""

team = SelectorGroupChat(
    [planning_agent, web_search_agent, data_analyst_agent],
    model_client=model_client,
    termination_condition=termination,
    selector_prompt=selector_prompt,
    allow_repeated_speaker=True,
)

# 运行任务
import asyncio
async def main():
    task = "谁是2006-2007赛季迈阿密热火队得分最高的球员,他在2007-2008和2008-2009赛季之间的总篮板数变化百分比是多少?"
    await Console(team.run_stream(task=task))

# asyncio.run(main())  # 取消注释即可运行

关键参数说明

  • participants:参与的Agent列表
  • selector:自定义选择器函数(可选)
  • termination_condition:终止条件
  • selector_prompt:选择器提示词

五、典型应用场景盘点

  • 多角色问答/专家系统:如医疗问诊、法律咨询等多专家协作场景
  • 流程审批/动态决策:如企业审批流、自动化办公
  • 多Agent博弈、竞赛、协作:如AI对弈、团队竞赛
  • 与其它群聊模式结合:如与RoundRobinGroupChat混合,灵活切换

六、实用技巧与注意事项

  • selector函数需保证每轮至少有一个Agent被选中,否则对话会中断
  • 终止条件建议结合实际业务需求合理设置,防止死循环
  • selector可根据消息内容、轮次、外部信号等灵活定制
  • 调试时可打印每轮被选中的Agent,便于排查问题
  • 性能优化建议:合理设置消息上限,避免无效轮询

七、进阶玩法

  • 异步selector:适合需要外部数据或异步决策的场景
  • 与外部信号、数据库、API集成:实现更复杂的动态选择
  • 结合业务需求的高级定制:如多层级审批、跨部门协作

八、更多资料与参考


SelectorGroupChat 让多智能体协作变得高效、灵活且可控。无论是AI开发者还是企业应用者,都能从中受益。赶快动手实践,体验多Agent协作的强大威力吧!

如果你觉得本文有用,欢迎点赞、收藏、评论交流!关注我,带你玩转AI多智能体协作!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐