AutoGen多智能体协作、人机交互与终止条件

一、Agent Team 核心概念详解

1.1 什么是 Agent Team?

在 AutoGen 框架中,Agent Team(多智能体团队)是突破传统单智能体局限的核心功能。它并非单一 AI 独立工作,而是由多个具备特定专业能力的智能代理(AI Agent)组成协作系统,通过明确分工与互动,共同应对复杂任务。
与传统单智能体相比,多智能体团队的差异主要体现在 "能力定位" 和 "工作模式" 上。单智能体更像 "全能型选手",试图独立处理所有任务,容易在专业深度不足或任务复杂度较高时出现偏差;而多智能体团队则是 "专家协作组",每个智能体专注某一领域,比如创作、评审、测试等,通过协作弥补单一智能体的短板。
其核心价值集中在四个方面:

  • **专业分工:**让具备对应技能的智能体处理专属任务,比如让 "创作智能体" 写诗歌,"评审智能体" 查质量,提升任务处理的精准度。
  • **质量保证:**通过多轮反馈与评审,比如评审智能体对创作内容提出修改建议,创作智能体优化后再提交,逐步提升输出质量。
  • **复杂问题分解:**将大型任务拆分成子任务,比如 "开发一个完整工具" 可拆分为 "写代码""做测试""写文档",由不同智能体分别完成,降低任务难度。
  • **错误纠正:**多个智能体可相互检查,比如测试智能体发现开发智能体代码中的逻辑错误,避免单一智能体遗漏问题。

1.2 团队协作模式

多智能体团队主要通过三种关键机制实现高效协作,确保信息同步与流程有序:

  • **对话式协作:**智能体之间以 "消息传递" 为核心互动方式,且每个智能体都能查看完整的对话历史。比如创作智能体提交诗歌后,评审智能体可通过历史对话了解创作背景,给出更贴合需求的建议,避免因信息断层导致协作脱节。
  • **轮询机制:**在 RoundRobinGroupChat(轮询式群聊)模式下,智能体按照预设的固定顺序轮流发言。例如先让创作智能体输出内容,再让评审智能体进行评估,每个智能体发言时都能基于前序对话内容响应,保证协作流程的规律性。
  • **上下文共享:**所有团队成员共用同一套对话上下文,意味着每个智能体做出决策或输出内容时,都能参考其他智能体的历史操作与反馈,确保整个团队的工作方向一致,不会出现 "各做各的" 的情况。

二、创建第一个Agent Team

2.1 环境准备和基础设置

创建多智能体团队前,需先完成 "模型客户端配置" 这一核心基础工作,它是智能体与 AI 模型(如 GPT-4、GPT-3.5)通信的桥梁。
首先需导入必要的工具库,包括处理异步任务的 asyncio、管理系统环境的 os,以及 AutoGen 框架中与智能体、团队、终止条件相关的模块,还有对接 OpenAI 模型的客户端模块。
随后配置模型客户端,关键参数包括:

  • model:指定使用的 AI 模型。
  • api_key:用于验证 OpenAI 服务权限,若已在系统环境变量中设置 "OPENAI_API_KEY",可省略该参数;若未设置,则需在此处手动填写。
  • temperature:控制 AI 输出的创造性,取值范围 0-1,值越高(如 0.7),输出内容越灵活有创意;值越低(如 0.2),输出越严谨固定。
    配置完成后,可通过打印提示确认模型客户端已就绪,为后续创建智能体做好准备。
python 复制代码
import asyncio
import os
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient

# 创建一个自定义的大模型客户端实例(文本模型)
model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",
    base_url="https://api.deepseek.com/v1",
    api_key="sk-xxxxxxxxxx",
    model_info={
        "vision": False,
        "function_calling": True,
        "json_output": True,
        "family": ModelFamily.UNKNOWN,
        "structured_output": True,
        "multiple_system_messages": True
    },
)

print("模型客户端配置完成")

2.2 创建专业化的智能体

智能体是团队的核心组成部分,需根据任务需求创建 "专业化" 角色,示例中重点创建了两种核心智能体:

(1)主要创作智能体(primary_agent)

该智能体的核心定位是 "内容生产者",负责根据用户需求生成诗歌、故事、技术文档等内容。在创建时,需通过 "system_message" 明确其角色职责与创作原则:

  • 职责:聚焦 "高质量内容创作""创意与专业性平衡""接受反馈改进""保证内容准确有吸引力",确保创作方向符合需求。
  • 创作原则:针对不同内容类型制定具体标准,比如诗歌需注重韵律、意象与情感,技术文档需结构清晰、术语准确,故事需情节连贯、人物鲜明,让智能体的创作有明确依据。
(2)评审智能体(critic_agent)

该智能体的核心定位是 "质量把控者",负责评估创作内容的质量并提供改进建议,只有当内容达标时才会批准通过。其 "system_message" 需明确评审职责、标准与批准条件:

  • 职责:涵盖 "全面质量评估""提供建设性改进建议""检查内容准确性 / 一致性 / 完整性""达标后批准",确保质量审核无遗漏。
  • 评审标准:从内容质量(主题、逻辑)、语言表达(流畅度、用词)、结构组织(层次、重点)、创意价值(新颖性、启发性)四个维度制定标准,让评审有量化依据。
  • 批准条件:仅当所有反馈问题被解决、内容达到专业标准时,回复 "APPROVE",避免随意批准导致质量不达标。
    创建完成后,通过打印提示确认两种智能体已就绪,为组建团队奠定基础。
python 复制代码
# 步骤2:创建主要创作智能体
# 这个智能体负责主要内容生成,如写作、编程等
primary_agent = AssistantAgent(
    name="primary",  # 智能体名称,用于在对话中标识
    description="一位专业的创作助手,擅长诗歌、故事和技术文档创作",
    model_client=model_client,  # 使用的模型客户端
    system_message="""
    你是一位专业的创作助手,擅长诗歌、故事和技术文档创作。
    
    你的职责:
    1. 根据用户需求创作高质量内容
    2. 保持创意和专业性的平衡
    3. 积极接受反馈并进行改进
    4. 确保内容准确且有吸引力
    
    创作原则:
    - 诗歌:注重韵律、意象和情感表达
    - 技术文档:结构清晰、术语准确
    - 故事:情节连贯、人物鲜明
    """,  # 系统提示词,定义智能体的角色和行为
)

print("主要创作智能体创建完成")

# 步骤3:创建评审智能体
# 这个智能体负责质量控制和反馈提供
critic_agent = AssistantAgent(
    name="critic",  # 评审者角色
    description="一位严格但公正的质量评审专家",
    model_client=model_client,
    system_message="""
    你是一位严格但公正的质量评审专家。
    
    你的职责:
    1. 对创作内容进行全面的质量评估
    2. 提供具体、建设性的改进建议
    3. 检查内容的准确性、一致性和完整性
    4. 当内容达到高质量标准时给予批准
    
    评审标准:
    - 内容质量:主题明确、逻辑清晰
    - 语言表达:流畅自然、用词准确
    - 结构组织:层次分明、重点突出
    - 创意价值:新颖独特、有启发性
    
    批准条件:只有当所有反馈点都被妥善解决,内容达到专业标准时,才回复"APPROVE"
    """,
)

print("评审智能体创建完成")

2.3 配置团队终止条件

终止条件是避免团队 "无限循环协作" 的关键,需明确团队何时停止工作。示例中使用 "TextMentionTermination"(文本提及终止)机制,核心逻辑围绕 "关键词检测" 展开:

  • 工作原理:持续监控所有智能体的输出内容,一旦在任意智能体的消息中检测到预设关键词(示例中为 "APPROVE"),立即自动停止团队运行。
  • 核心作用:确保团队在内容达到质量标准(即评审智能体批准)时及时结束任务,既避免协作过度消耗资源,也防止因无终止信号导致的无限对话。
    配置完成后,打印提示确认终止条件已生效,确保团队协作有明确的 "结束节点"。
python 复制代码
# 步骤4:定义智能终止条件
# 终止条件决定团队何时停止工作,避免无限循环
termination_condition = TextMentionTermination("APPROVE")
print("终止条件配置完成")

2.4 组建协作团队

组建团队的核心是将已创建的智能体、终止条件与协作模式结合,示例中采用 "RoundRobinGroupChat"(轮询式群聊)作为协作模式,关键配置参数包括:

  • participants:指定团队成员列表,示例中为 "主要创作智能体 + 评审智能体",确保团队有明确的 "生产者" 与 "审核者"。
  • termination_condition:关联已配置的终止条件(TextMentionTermination),让团队知道何时停止。
  • 可选参数:包括 "max_turns"(最大对话轮次,如 10 轮,防止因未检测到关键词导致无限协作)。
    组建完成后,通过打印 "团队配置摘要",明确团队成员、协作模式、停止条件,让开发者清晰了解团队的核心配置。
python 复制代码
# 步骤5:创建多智能体团队
team = RoundRobinGroupChat(
    participants=[primary_agent, critic_agent],  # 团队成员列表
    termination_condition=termination_condition,  # 停止条件
    # max_turns=10  # 可选:最大对话轮次,防止无限循环
)

print("多智能体团队创建完成")
print("团队配置摘要:")
print(f"- 团队成员: {[agent.name for agent in [primary_agent, critic_agent]]}")
print(f"- 协作模式: 轮询协作")
print(f"- 停止条件: 评审通过(APPROVE)")

2.5 运行

运行团队协作任务需通过 "异步函数" 实现,核心步骤包括:

  1. 定义异步函数(如 "run_complete_example"),在函数内明确任务需求(示例中为 "创作关于人工智能发展与人类关系的诗歌,体现技术与人性平衡")。
  2. 调用团队的 "run" 方法,传入任务描述,启动协作流程 ------ 此时团队会按照轮询模式,先让创作智能体输出诗歌,再让评审智能体评估,若评审不通过则提出修改建议,创作智能体优化后再次提交,直至评审智能体回复 "APPROVE"。
  3. 任务完成后,输出 "任务完成报告",包括 "停止原因"(如 "检测到 APPROVE")、"总消息数"(协作过程中产生的消息总量)、"最终结果"(最后一条消息内容,即达标后的诗歌),让开发者了解协作过程与成果。
    最后,通过 "if name == "main": asyncio.run (run_complete_example ())" 启动异步函数,正式触发团队协作。
python 复制代码
# 步骤6:运行团队协作任务
async def run_complete_example():
    print("开始团队协作任务...")
    print("任务: 创作一首关于人工智能的诗歌")
    print("-" * 50)

    # 运行团队任务
    result = await team.run(task="请创作一首关于人工智能发展与人类关系的诗歌,要求体现技术与人性的平衡。")

    print("\n" + "=" * 50)
    print("任务完成报告")
    print("=" * 50)
    for message in result.messages:
        if message.source == 'user':
            print(f"- 用户: {message.content}")
        elif message.source == 'primary':
            print(f"- 主要创作智能体: {message.content}")
        elif message.source == 'critic':
            print(f"- 评审智能体: {message.content}")

# 执行示例
if __name__ == "__main__":
    asyncio.run(run_complete_example())

三、团队运行与监控

3.1 实时流式监控

实时流式监控的核心是 "动态跟踪协作过程",让开发者清晰了解每个智能体的操作、输出内容与资源消耗,示例中通过异步函数 "detailed_stream_monitoring" 实现,关键步骤包括:

  1. 明确任务描述:详细定义任务需求(示例中为 "创作关于四季变换与人生哲理的现代诗歌,8-12 行,每季至少两行"),让监控有明确的 "任务目标"。
  2. 流式获取并分析消息:通过 "async for message in team.run_stream (task=task_description)" 实时获取团队协作中的每一条消息,对每条消息进行多维度分析:
  • 消息来源:检测消息是否有 "source" 属性,输出发送消息的智能体名称(如 "primary""critic"),明确各智能体的操作时机。
  • 内容预览:让开发者快速了解消息核心。
  • Token 使用情况:检测消息是否有 "models_usage" 属性,输出输入 token(prompt_tokens)与输出 token(completion_tokens)数量,帮助开发者监控资源消耗。
  1. 任务完成统计:任务结束后,统计 "总消息数""各智能体发言次数",让开发者了解协作的整体效率与各角色的参与度。
    最后,通过 "asyncio.run (detailed_stream_monitoring ())" 启动监控函数,实现协作过程的实时跟踪。
python 复制代码
# 步骤6:运行团队协作任务
async def detailed_stream_monitoring():
    """
    实时监控团队协作过程,深入了解每个智能体的思考和工作流程
    功能特点:
    - 实时显示对话流
    - 统计消息数量和来源
    - 分析Token使用情况
    - 提供任务完成摘要
    """
    print("开始实时监控团队协作...")
    # 定义具体的创作任务描述
    task_description = """
    创作任务要求:
    1. 主题:四季变换与人生哲理
    2. 形式:现代诗歌
    3. 长度:8-12行
    4. 要求:每季至少两行,体现季节特色和人生启示
    """
    print(f"任务内容: {task_description}")
    print("-" * 60)  # 分隔线,提高输出可读性

    message_count = 0  # 消息计数器
    # 使用异步流式处理实时获取团队对话消息
    async for message in team.run_stream(task=task_description):
        message_count += 1
        print(f"\n#{message_count} ", end="")  # 显示消息序号

        # 分析消息类型和内容
        if hasattr(message, 'source'):  # 检查是否为普通对话消息
            print(f"【{message.source}】", end="")  # 显示消息来源(哪个智能体)

            if hasattr(message, 'content'):  # 检查消息是否有内容
                content_preview = str(message.content)  # 获取消息内容
                print(f": {content_preview}")  # 显示消息内容预览

            # 显示token使用情况(如果可用)
            if hasattr(message, 'models_usage') and message.models_usage:
                usage = message.models_usage  # 获取使用量统计
                print(f"Token使用: 输入{usage.prompt_tokens}, 输出{usage.completion_tokens}")  # 显示输入输出token数量
        else:
            # 任务结果分析(当收到最终结果消息时)
            print(f"任务完成!")
            print(f"停止原因: {message.stop_reason}")  # 显示会话停止的具体原因
            print(f"总消息数: {len(message.messages)}")  # 显示总对话轮数

            # 统计各智能体的发言次数
            source_count = {}
            for msg in message.messages:
                if hasattr(msg, 'source'):
                    source_count[msg.source] = source_count.get(msg.source, 0) + 1

            print("各角色发言统计:")
            for source, count in source_count.items():
                print(f"{source}: {count}次")  # 显示每个智能体的发言次数统计

# 主程序入口:运行详细监控函数
asyncio.run(detailed_stream_monitoring())  # 执行异步监控函数

3.2 控制台美化输出

控制台美化输出的核心是 "提升可视化体验",通过 AutoGen 的 "Console" 类对协作过程的输出进行格式化处理,让信息展示更清晰,示例中通过异步函数 "enhanced_console_demo" 实现,关键步骤包括:

  1. 启动美化控制台:调用 "Console" 类,传入 "team.run_stream (task = 任务描述)"(任务示例为 "创作关于城市夜晚的诗歌,体现繁华与孤独"),并设置 "output_stats=True"(显示详细统计信息)。
  2. 输出效果:Console 类会自动对消息来源、内容、token 消耗等信息进行格式化排版(如用不同标识区分智能体、清晰展示统计数据),避免原始输出的杂乱,让开发者更易读取协作信息。
    任务完成后,打印提示确认协作过程分析完成,通过美化输出降低监控信息的读取成本。
python 复制代码
async def enhanced_console_demo():
    """
    使用增强的控制台输出,提供更好的可视化体验
    """
    print("启动增强型控制台界面...")
    # 使用Console类提供格式化的输出
    print("开始团队协作创作...")
    await Console(
        team.run_stream(task="写一首关于城市夜晚的诗歌,要求体现现代都市的繁华与孤独"),
        output_stats=True  # 显示详细统计信息
    )
    print("\n协作过程分析完成")

# 运行美化输出示例
asyncio.run(enhanced_console_demo())

四、高级团队控制:精准管理

4.1 智能状态管理

智能状态管理的核心是 "灵活控制团队的历史上下文",根据任务需求选择 "清空历史" 或 "保留历史",实现不同场景下的高效协作,示例中通过异步函数 "advanced_state_management" 演示三种核心场景:

场景 1:完全重置(全新任务)

当需要启动与历史任务无关的全新任务时,通过 "await team.reset ()" 清空团队的对话历史,让智能体以 "无历史干扰" 的状态开始工作。示例中先重置团队,再执行 "创作关于春天的诗歌" 任务,任务完成后统计消息数,确保全新任务的独立性。

场景 2:保持状态继续(相关任务)

当需要基于上一任务的成果进行后续优化时,不重置团队状态,直接提交新任务(示例中为 "保留之前的诗歌,在之前诗歌的下方,再写一首关于冬天的诗歌")。此时智能体可参考历史对话中的诗歌内容,避免重复创作,提升协作效率,任务完成后统计总消息数,体现 "历史上下文复用" 的价值。

最后,通过 "asyncio.run (advanced_state_management ())" 启动函数,演示不同状态管理场景的实际效果。

python 复制代码
async def advanced_state_management():
    """
    演示状态管理技巧,包括重置和状态保持
    """

    # 场景1:完全重置 - 开始全新任务
    print("场景1: 完全重置团队")
    await team.reset()
    print("团队历史已清空,准备新任务")

    # 执行第一个任务
    result1 = await team.run(task="写一首关于春天的诗歌")
    print(f"任务1完成,消息数: {len(result1.messages)}")

    # 场景2:保持状态继续 - 相关任务延续
    print("\n场景2: 保持状态继续任务")
    print("基于之前的诗歌,进行新的版本创作")
    result2 = await team.run(task="保留之前的诗歌,在之前诗歌的下方,再写一首关于冬天的诗歌")
    print(f"任务2完成,消息数: {len(result2.messages)}")
    print(f"总消息数: {len(result2.messages)}")

asyncio.run(advanced_state_management())

4.2 外部控制机制

外部控制机制的核心是 "突破关键词终止的单一限制",允许从团队外部主动触发停止信号,适用于 "需要人工干预" 或 "定时停止" 的场景,示例中通过 "ExternalTermination"(外部终止)机制实现,关键步骤包括:

  1. 创建外部终止控制器:实例化 "ExternalTermination" 类,作为外部控制的 "信号发生器"。
  2. 组建支持外部控制的团队:创建新的 RoundRobinGroupChat 团队,将 "外部终止控制器" 与 "原有关键词终止条件" 通过 "|"(或逻辑)结合,意味着团队停止的条件有两个 ------ 要么检测到 "APPROVE" 关键词,要么收到外部停止信号。
  3. 模拟外部干预:定义异步函数 "simulate_user_interruption",模拟用户在协作过程中主动中断 ------ 通过 "await asyncio.sleep (5)" 让程序等待 5 秒,随后调用 "external_controller.set ()" 发送停止信号,触发团队停止。
  4. 并行运行任务与干预:通过 "asyncio.create_task" 分别创建 "团队协作任务"(执行 "创作机器学习长文" 任务,用 Console 美化输出)和 "外部干预任务",再通过 "asyncio.gather" 让两个任务并行运行,模拟 "协作过程中突然外部中断" 的场景。
  5. 任务完成反馈:外部干预触发团队停止后,打印提示确认演示完成,展示外部控制的实际效果。
    最后,通过 "asyncio.run (external_control_demonstration ())" 启动函数,实现外部控制机制的演示。
python 复制代码
async def external_control_demonstration():
    """
    演示如何从外部控制团队的运行和停止
    """
    # 创建外部终止控制器
    external_controller = ExternalTermination()
    # 创建支持外部控制的团队
    controllable_team = RoundRobinGroupChat(
        [primary_agent, critic_agent],
        termination_condition=external_controller | termination_condition)
    print("开始外部控制演示...")
    print("团队将在5秒后被外部停止")

    async def simulate_user_interruption():
        """
        模拟用户中断操作
        """
        await asyncio.sleep(5)
        print("用户触发停止指令...")
        external_controller.set()
        print("停止信号已发送")
        return

    # 同时运行团队任务和中断模拟
    team_task = asyncio.create_task(controllable_team.run(task="写一篇关于机器学习的长文,包含历史、现状和未来展望"))
    interruption_task = asyncio.create_task(simulate_user_interruption())
    # 等待任务完成
    await asyncio.gather(team_task, interruption_task)
    print("外部控制演示完成")


asyncio.run(external_control_demonstration())

五、智能体团队实际应用案例

该案例聚焦 "代码开发" 场景,创建包含 "开发、测试、文档" 三个角色的完整团队,实现 "从代码编写到测试、文档的全流程协作",核心步骤包括:

5.1 代码开发团队

定义 "create_development_team" 函数,在函数内创建三个专业智能体,并组建团队:

(1)开发工程师智能体(developer)

核心定位是 "代码编写者",通过 "system_message" 明确其专业能力与编码原则:

  • 专业能力:擅长编写高效可读的 Python 代码、遵循 PEP8 规范、实现算法与数据结构、代码优化与性能调优,确保代码质量与规范性。
  • 编码原则:强调 "优先可读性""添加必要注释""处理边界情况""编写单元测试",避免代码仅能运行但难以维护或存在隐藏问题。
(2)测试工程师智能体(tester)

核心定位是 "代码质量审核者",通过 "system_message" 明确其测试职责、禁止批准的问题与批准条件:

  • 测试职责:涵盖代码审查、测试用例设计、边界测试、异常测试、性能测试建议、安全漏洞检查,全面排查代码问题。
  • 禁止批准的问题:明确 "明显逻辑错误""未处理异常""性能问题""安全风险" 这四类问题必须解决,否则不批准,确保代码稳定性与安全性。
  • 批准条件:仅当代码质量达标时,回复 "APPROVED"(注意与前文 "APPROVE" 区分,需严格匹配关键词)。
(3)技术文档工程师智能体(technical_writer)

核心定位是 "文档生产者",通过 "system_message" 明确其文档职责与质量要求:

  • 文档职责:负责 API 文档编写、使用示例创建、代码注释审查、用户指南制作,确保代码有完整的配套文档。
  • 质量要求:强调文档需 "准确反映代码功能""包含使用示例""格式规范清晰",让用户能通过文档快速理解并使用代码。
(4)组建代码开发团队

创建 RoundRobinGroupChat 团队,将上述三个智能体作为成员,设置终止条件为 "检测到 APPROVED"(与测试工程师的批准关键词匹配),并限制 "max_turns=8"(最大 8 轮协作,避免无限循环),确保团队高效且有序地完成代码开发全流程。

python 复制代码
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient


# 配置DeepSeek模型的API连接参数,用于后续智能体的对话生成
model_client = OpenAIChatCompletionClient(
    model="qwen-plus",  # 指定使用的模型名称
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # DeepSeek API的基础URL
    api_key="sk-xxxxxxxxxx",  # API密钥(注意:在实际应用中应使用环境变量保护密钥)
    model_info={  # 模型能力配置信息
        "vision": False,  # 不支持视觉功能
        "function_calling": True,  # 支持函数调用
        "json_output": True,  # 支持JSON格式输出
        "family": ModelFamily.UNKNOWN,  # 模型家族分类
        "structured_output": True,  # 支持结构化输出
        "multiple_system_messages": True  # 支持多条系统消息
    },
)
print("模型客户端配置完成")


# 开发工程师
developer = AssistantAgent(
    "developer",
    description="一位资深Python开发工程师",
    model_client=model_client,
    system_message="""
    你是资深Python开发工程师,擅长:
    - 编写高效、可读的代码
    - 遵循PEP8规范
    - 实现算法和数据结构
    - 代码优化和性能调优

    编码原则:
    1. 优先考虑代码可读性
    2. 添加必要的注释
    3. 处理边界情况
    4. 编写单元测试
    """
)

# 测试工程师
tester = AssistantAgent(
    "tester",
    description="一位专业的QA测试工程师",
    model_client=model_client,
    system_message="""
    你是专业的QA测试工程师,负责:
    - 代码审查和测试用例设计
    - 边界测试和异常测试
    - 性能测试建议
    - 安全漏洞检查

    发现以下问题时阻止批准:
    - 明显的逻辑错误
    - 未处理的异常
    - 性能问题
    - 安全风险

    当代码质量达标时回复:APPROVED
    """
)

# 技术文档工程师
technical_writer = AssistantAgent(
    "documentation",
    description="一位专业的技术文档工程师",
    model_client=model_client,
    system_message="""
    你是技术文档专家,负责:
    - API文档编写
    - 使用示例创建
    - 代码注释审查
    - 用户指南制作

    确保文档:
    - 准确反映代码功能
    - 包含使用示例
    - 格式规范清晰
    """
)
dev_team = RoundRobinGroupChat([developer, tester, technical_writer],termination_condition=TextMentionTermination("APPROVED"), max_turns=10)

5.2 运行代码开发示例

定义异步函数 "development_example",启动代码开发团队的协作,关键步骤包括:

  1. 调用 "create_development_team ()" 获取组建好的代码开发团队。
  2. 明确任务需求:开发一个 Python 函数,功能包括 "接收字符串列表→统计每个字符串出现频率→按频率降序返回字典结果",同时需处理空列表与异常情况;输出要求包括 "完整文档字符串""使用示例""单元测试用例",确保任务需求清晰具体。
  3. 启动协作并美化输出:通过 "Console (dev_team.run_stream (task = 任务描述))" 启动团队协作,同时用美化控制台展示过程,让开发者清晰看到 "开发→测试→文档" 的协作流程 ------ 开发工程师写代码,测试工程师审核并提出问题,开发工程师修改,直至测试工程师批准,最后文档工程师编写配套文档。
    最后,通过 "asyncio.run (development_example ())" 启动函数,实现代码开发团队的全流程协作演示。
python 复制代码
# 运行代码开发示例
async def development_example():
    print("开始代码开发协作...")
    await Console(dev_team.run_stream(task="""
        开发一个Python函数,实现:
        功能要求:
        1. 接收一个字符串列表
        2. 统计每个字符串的出现频率
        3. 返回按频率降序排列的结果
        4. 处理空列表和异常情况
        输出要求:
        - 返回字典:{字符串: 频率}
        - 包含完整的文档字符串
        - 提供使用示例
        - 包含单元测试用例
        """
    ))

asyncio.run(development_example())

六、人机交互

AutoGen 提供了灵活的人机交互机制,允许在智能体团队运行过程中或运行结束后与用户进行交互。这对于需要人工监督、反馈或决策的应用场景至关重要。

6.1 人机交互的两种主要方式

6.1.1 运行中交互(使用 UserProxyAgent)

在团队执行过程中通过 UserProxyAgent 提供实时反馈。

UserProxyAgent 的工作原理:
  1. 代理机制 :UserProxyAgent 作为用户在智能体团队中的代表
  2. 阻塞等待:当团队执行到该智能体时,暂停并等待用户输入
  3. 输入函数 :可以通过 input_func 参数自定义输入方式(控制台、WebSocket、GUI等)
特点:
  • 阻塞式交互 :当团队调用 UserProxyAgent 时,执行会暂停等待用户输入
  • 即时反馈:适合需要立即确认或决策的场景
  • 会话连续性:交互后团队继续执行
适用场景:
  • 需要人工批准的敏感操作
  • 实时决策点
  • 紧急情况处理
6.1.2 运行后交互

在团队运行结束后提供反馈,然后重新运行团队。

特点:
  • 非阻塞式:团队完整运行后才请求反馈
  • 持久化友好:适合保存和恢复团队状态
  • 批处理友好:可以批量处理多个任务
实现方法:
  • 设置最大轮次 (max_turns)
  • 使用终止条件 (Termination Conditions)

6.2 演示示例

6.2.1 运行中交互
python 复制代码
import asyncio
from autogen_agentchat.agents import AssistantAgent, UserProxyAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient

# 创建模型客户端
model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",  # 指定使用的模型名称
    base_url="https://api.deepseek.com/v1",  # DeepSeek API的基础URL
    api_key="sk-xxxxxxxxxx",  # API密钥(注意:在实际应用中应使用环境变量保护密钥)
    model_info={  # 模型能力配置信息
        "vision": False,  # 不支持视觉功能
        "function_calling": True,  # 支持函数调用
        "json_output": True,  # 支持JSON格式输出
        "family": ModelFamily.UNKNOWN,  # 模型家族分类
        "structured_output": True,  # 支持结构化输出
        "multiple_system_messages": True  # 支持多条系统消息
    }
)

async def main():
    """
    运行中交互示例:诗歌创作需要人工审批
    """
    # 创建智能体
    assistant = AssistantAgent("assistant", model_client=model_client, system_message="你是一个诗人,创作优美的诗歌。完成创作后请说'请审批'等待用户批准。")
    # 创建用户代理智能体,使用控制台输入
    user_proxy = UserProxyAgent("user_proxy", input_func=lambda prompt: input(prompt))
    # 设置终止条件:当用户说"批准"时结束
    termination = TextMentionTermination("批准")
    # 创建轮询团队
    team = RoundRobinGroupChat([assistant, user_proxy],termination_condition=termination)
    # 运行团队并流式输出到控制台
    print("=== 诗歌创作审批系统 ===")
    stream = team.run_stream(task="创作一首关于春天的四行诗")
    await Console(stream)


# 运行示例
if __name__ == "__main__":
    asyncio.run(main())
6.2.2 运行后交互
python 复制代码
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient


# 创建模型客户端
model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",  # 指定使用的模型名称
    base_url="https://api.deepseek.com/v1",  # DeepSeek API的基础URL
    api_key="sk-xxxxxxxxxx",  # API密钥(注意:在实际应用中应使用环境变量保护密钥)
    model_info={  # 模型能力配置信息
        "vision": False,  # 不支持视觉功能
        "function_calling": True,  # 支持函数调用
        "json_output": True,  # 支持JSON格式输出
        "family": ModelFamily.UNKNOWN,  # 模型家族分类
        "structured_output": True,  # 支持结构化输出
        "multiple_system_messages": True  # 支持多条系统消息
    }
)

async def main():
    """
    运行后交互示例:多轮对话修改诗歌
    """
    # 创建助理智能体
    assistant = AssistantAgent("assistant", model_client=model_client, system_message="你是一个专业的诗人,根据用户反馈修改诗歌。每次完成修改后说'修改完成'。")
    # 创建团队,设置每轮最大对话次数为1
    team = RoundRobinGroupChat([assistant], max_turns=1)
    # 初始任务
    task = "创作一首关于月亮的四行诗"
    print("=== 诗歌修改对话系统 ===")
    print("输入'退出'结束对话")
    while True:
        # 运行团队
        print(f"\n当前任务: {task}")
        stream = team.run_stream(task=task)
        await Console(stream)
        # 获取用户反馈
        feedback = input("\n请输入修改意见(输入'退出'结束): ")
        if feedback.lower().strip() in ['退出', 'exit']:
            break
        # 设置下一轮任务为用户的反馈
        task = feedback

# 运行示例
if __name__ == "__main__":
    asyncio.run(main())

七、终止条件(Termination)

在 AutoGen 多智能体协作系统中,终止条件是保障团队高效、可控运行的核心机制。它不仅能避免智能体陷入无限对话循环、过度消耗资源,还能确保任务在达到预期目标时及时收尾,平衡 "质量达标" 与 "资源成本" 的关系。本部分将结合代码示例,从核心概念、工作机制、内置类型、组合策略到自定义开发,全面补充终止条件的细节说明,帮助开发者深入理解并灵活应用。

7.1 终止条件的核心概念与工作机制

7.1.1 终止条件的重要性与设计哲学
为什么必须设置终止条件?

多智能体协作的本质是 "动态交互"------ 智能体之间会基于任务需求持续传递消息、优化结果。若缺乏终止条件,可能出现两种风险:

  • 资源浪费:智能体反复迭代却无法确定 "何时停止",导致 Token 消耗激增、运行时间过长(例如创作智能体不断修改内容,评审智能体持续提建议,陷入无限循环);
  • 结果失控:任务可能在未达质量标准时 "意外停止",或在已达标后 "过度优化"(例如代码已通过测试,仍反复调整格式)。
    因此,终止条件相当于多智能体团队的 "交通警察",既规范协作流程,又守护资源边界。
终止条件的核心价值拆解
设计哲学:三层防护理念

终止条件的设计需遵循 "主次结合、多重保障" 原则,通常分为三层防护,确保极端场景下系统仍可控:

  1. 主要条件(业务驱动):基于核心业务逻辑的正常终止,是任务的 "预期结束方式"。例如 "评审通过(APPROVE)""经理确认",确保任务在达到业务目标时停止;
  2. 保护条件(资源驱动):基于资源消耗的强制终止,是 "成本防护网"。例如 "最大消息数 10 轮""Token 上限 2000",防止主要条件未触发时资源过度消耗;
  3. 紧急条件(时间驱动):基于时间的绝对终止,是 "最后防线"。例如 "超时 60 秒",即使前两层条件失效,也能强制停止任务,避免进程僵死。
7.1.2 终止条件的工python作机制详解
核心逻辑:"监控 - 判断 - 触发" 循环

终止条件的运行遵循固定流程,以代码示例中的 MaxMessageTermination(消息数量限制)为例:

  1. 初始化配置 :创建终止条件实例时,定义触发阈值(如 max_messages=3,即总消息数达到 3 条时停止);
  2. 实时监控:团队运行过程中,终止条件会监听每一条智能体消息、用户消息,实时统计消息总数;
  3. 条件判断:每新增一条消息,都会与阈值对比(如当前消息数是否 ≥ 3);
  4. 触发停止 :当条件满足时,立即生成 StopMessage,通知团队停止协作,并返回 "停止原因"(如 "消息数达到 3 条");
  5. 自动重置:每次任务运行结束后,终止条件会自动重置状态(如消息计数清零),避免影响下一次任务。
    以下代码演示了 "消息数量限制" 的完整工作流程,关键细节已标注:
python 复制代码
import asyncio

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient

model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",  # 指定使用的模型名称
    base_url="https://api.deepseek.com/v1",  # DeepSeek API的基础URL
    api_key="sk-xxxxxxxxxx",  # API密钥(注意:在实际应用中应使用环境变量保护密钥)
    model_info={  # 模型能力配置信息
        "vision": False,  # 不支持视觉功能
        "function_calling": True,  # 支持函数调用
        "json_output": True,  # 支持JSON格式输出
        "family": ModelFamily.UNKNOWN,  # 模型家族分类
        "structured_output": True,  # 支持结构化输出
        "multiple_system_messages": True  # 支持多条系统消息
    },
)

async def termination_mechanism_deep_dive():
    """
    解析终止条件的工作机制和调用流程
    """
    # 创建主要智能体 - 负责内容生成
    primary_agent = AssistantAgent(
        "primary",
        description="一位专业的创意作家,擅长诗歌和创意内容创作",
        model_client=model_client,
        system_message="""
        你是一位专业的创意作家,擅长诗歌和创意内容创作。

        创作流程:
        1. 接收创作任务
        2. 生成初稿内容
        3. 根据反馈进行改进
        4. 持续优化直到满意

        请在内容达到高质量时提示"最终完成"。
        """
    )

    # 创建评审智能体 - 负责质量把关
    critic_agent = AssistantAgent(
        "critic",
        description="一位严格且专业的质量检查员",
        model_client=model_client,
        system_message="""
        你是严格的质量评审专家。

        评审标准:
        - 内容质量:主题明确、表达清晰
        - 创意价值:新颖独特、有启发性  
        - 技术规范:符合格式要求
        - 用户体验:易于理解、有吸引力

        评审流程:
        1. 对每个版本进行详细评审
        2. 提供具体的改进建议
        3. 当内容达到优秀标准时回复"APPROVE"
        4. 发现严重问题时要求重写
        """
    )

    print("智能体配置完成")
    print("主要智能体职责: 内容创作和迭代优化")
    print("评审智能体职责: 质量评审和最终批准")

    # 创建消息数量限制终止条件
    max_msg_termination = MaxMessageTermination(max_messages=3)

    print(f"\n终止条件配置: MaxMessageTermination(max_messages=3)")
    print("工作机制:")
    print("  • 监控所有消息的数量")
    print("  • 当总消息数达到3条时触发停止")
    print("  • 包括用户任务消息和智能体响应消息")
    print("  • 自动重置机制: 每次运行后自动重置计数")

    # 创建团队并配置终止条件
    round_robin_team = RoundRobinGroupChat([primary_agent, critic_agent], termination_condition=max_msg_termination)

    print("\n开始终止条件演示...")
    print("任务: 创作一首关于春天的诗句")
    print("-" * 50)

    # 运行第一轮对话
    result1 = await round_robin_team.run(task="创作一首关于春天的诗句")

    print(f"第一轮完成 - 停止原因: {result1.stop_reason}")
    print(f"消息数量: {len(result1.messages)}")

    # 显示终止条件状态
    print(f"\n终止条件状态分析:")
    print(f"MaxMessageTermination.terminated: {max_msg_termination.terminated}")
    print(f"自动重置: 是 (在每次run()完成后自动重置)")

    # 继续对话 - 终止条件已自动重置
    print("\n继续对话 (终止条件已自动重置)...")
    result2 = await round_robin_team.run(task="创作一首关于冬天的诗句")

    print(f"第二轮完成 - 停止原因: {result2.stop_reason}")
    print(f"消息数量: {len(result2.messages)}")
    print(f"累计总消息: {len(result1.messages) + len(result2.messages)}")
    await model_client.close()

asyncio.run(termination_mechanism_deep_dive())
关键细节说明
  • 消息计数范围 :MaxMessageTermination 会统计 "所有消息",包括用户提交的任务描述、智能体的响应消息(如创作智能体的初稿、评审智能体的反馈);
  • 自动重置的必要性:若不自动重置,第二轮任务会继承第一轮的消息计数(如第一轮已 3 条,第二轮刚启动就触发停止),导致任务无法正常运行;
  • 停止原因透明度 :result.stop_reason 会明确返回终止触发的具体原因(如 "max_messages reached"),便于开发者排查问题(例如判断是正常达标还是资源超限)。

7.2 内置终止条件全面解析

AutoGen 提供了两类核心内置终止条件:资源控制型 (保障成本与效率)和业务逻辑型 (匹配业务目标),覆盖绝大多数常见场景。

7.2.1 资源控制型终止条件
1. MaxMessageTermination(消息数量限制)
  • 核心作用:限制团队协作的总消息数,防止无限对话循环;
  • 配置参数 :max_messages(最大消息数,整数);
  • 适用场景:所有对话场景的 "基础防护",尤其适合任务流程较固定的场景(如 "创作→评审→修改"3 轮即可完成);
  • 优势:逻辑简单、判断高效,无需依赖复杂计算(如 Token 统计);
  • 注意事项:计数包含 "用户任务消息 + 智能体响应消息",需根据任务复杂度合理设置(例如简单诗歌创作设 5 条,复杂代码开发设 10 条)。
2. TokenUsageTermination(Token 使用限制)
  • 核心作用:精确控制 API 调用的 Token 消耗(输入 Token + 输出 Token),直接关联成本控制;
  • 配置参数
    • max_prompt_token:输入 Token 上限(智能体接收的提示词、历史对话等);
    • max_completion_token:输出 Token 上限(智能体生成的响应内容);
  • 适用场景:成本敏感的生产环境(如批量处理任务、API 费用有限额);
  • 优势:精准控制成本,避免单任务 Token 消耗过高(例如 GPT-4 按 Token 计费,可通过此条件限制单任务费用);
  • 要求 :智能体必须支持 Token 统计(需模型客户端返回 models_usage 信息,如 OpenAI、DeepSeek 等主流模型均支持)。
3. TimeoutTermination(超时控制)
  • 核心作用:限制任务的总运行时间,保障实时性,避免长时间无响应;
  • 配置参数 :timeout_seconds(超时时间,单位:秒);
  • 适用场景:实时性要求高的应用(如客服机器人、实时数据分析);
  • 优势:防止任务 "僵死"(例如智能体因网络问题长时间未响应),保障用户体验;
  • 机制 :从 team.run() 调用开始计时,无论任务是否在迭代,超时后立即强制停止。
    以下代码演示了三种资源控制型终止条件的配置与组合使用:
python 复制代码
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.conditions import MaxMessageTermination, TokenUsageTermination, TimeoutTermination

model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",  # 指定使用的模型名称
    base_url="https://api.deepseek.com/v1",  # DeepSeek API的基础URL
    api_key="sk-xxxxxxxxxx",  # API密钥(注意:在实际应用中应使用环境变量保护密钥)
    model_info={  # 模型能力配置信息
        "vision": False,  # 不支持视觉功能
        "function_calling": True,  # 支持函数调用
        "json_output": True,  # 支持JSON格式输出
        "family": ModelFamily.UNKNOWN,  # 模型家族分类
        "structured_output": True,  # 支持结构化输出
        "multiple_system_messages": True  # 支持多条系统消息
    },
)

async def resource_control_terminations():
    """
    资源控制型终止条件详解 - 防止资源过度消耗
    """
    # 创建基础智能体
    primary_agent = AssistantAgent("primary", model_client=model_client)
    critic_agent = AssistantAgent("critic", model_client=model_client)

    # 1. 消息数量限制 - 最基本的保护机制
    message_limit = MaxMessageTermination(max_messages=5)
    print("1.MaxMessageTermination - 消息数量限制")
    print(f"配置: max_messages=5")
    print("适用场景: 所有对话场景的基础保护")
    print("优势: 简单可靠,防止无限对话循环")
    print("注意: 计数包括所有消息类型")

    # 2. Token使用限制 - 成本控制核心
    token_limit = TokenUsageTermination(
        max_prompt_token=1000,  # 输入token限制
        max_completion_token=500  # 输出token限制
    )
    print("\n2.TokenUsageTermination - Token使用限制")
    print(f"配置: max_prompt_tokens=1000, max_completion_tokens=500")
    print("适用场景: 成本敏感的生产环境")
    print("优势: 精确控制API调用成本")
    print("要求: 智能体必须报告token使用情况")

    # 3. 超时控制 - 响应时间保障
    timeout_limit = TimeoutTermination(timeout_seconds=30)
    print("\n3.TimeoutTermination - 超时控制")
    print(f"配置: timeout_seconds=30")
    print("适用场景: 实时性要求高的应用")
    print("优势: 防止长时间无响应")
    print("机制: 从任务开始计算总时间")

    # 演示资源控制组合
    print("\n资源控制组合演示")
    resource_guard = message_limit | token_limit | timeout_limit
    protected_team = RoundRobinGroupChat([primary_agent, critic_agent], termination_condition=resource_guard)
    print("保护策略: 消息数超5 或 Token超限 或 超时30秒")
    print("确保系统在任何情况下都不会失控")
    # 运行受保护的对话
    result = await Console(protected_team.run_stream(task="讨论人工智能的未来发展趋势"))
    print(result)

asyncio.run(resource_control_terminations())python
组合使用的优势
  • 互补性:单一条件可能存在漏洞(例如 "消息数未超但 Token 超支"),组合后可覆盖所有资源风险;
  • 灵活性 :通过 "或逻辑"(|)实现 "任一触发",既保障资源安全,又不影响任务正常完成(例如任务提前达标,无需等待超时或消息数上限)。
7.2.2 业务逻辑型终止条件

业务逻辑型终止条件以 "匹配业务目标" 为核心,根据任务的具体需求触发停止,适用于需要 "质量达标""角色决策" 的场景。以下结合代码示例解析两种常用类型:

1. TextMentionTermination(文本提及终止)
  • 核心作用:监控智能体 / 用户消息中是否包含指定关键词,包含则触发停止;
  • 配置参数 :text(关键词,字符串,支持多个关键词用列表传入);
  • 工作机制:逐句扫描消息内容,不区分大小写(例如 "APPROVE""approve" 均会触发);
  • 适用场景:审批流程、质量确认、任务完成通知(如评审通过、用户确认);
  • 优势:直接匹配业务目标,逻辑直观(例如 "APPROVE" 代表质量达标,"REJECT" 代表任务终止)。
2. SourceMatchTermination(来源匹配终止)
  • 核心作用:指定某一智能体发言后触发停止,即 "特定角色拥有终止决策权";
  • 配置参数 :sources(智能体名称列表,如 ["critic", "manager"]);
  • 工作机制:只要指定名称的智能体发送消息,无论内容如何,立即触发停止;
  • 适用场景:需要 "权威角色最终决策" 的场景(如经理确认后任务停止、测试工程师反馈后结束);
  • 优势:明确决策链,避免其他角色越权终止(例如只有评审智能体可停止任务,创作智能体无法终止)。
    以下代码演示了两种业务逻辑型终止条件的配置与组合:
python 复制代码
import asyncio
from autogen_agentchat.conditions import TextMentionTermination, SourceMatchTermination

async def business_logic_terminations():
    """
    业务逻辑型终止条件 - 基于对话内容的智能停止
    """
    # 1. 文本提及终止 - 最常用的业务终止条件
    text_termination = TextMentionTermination("APPROVE")
    print("1.TextMentionTermination - 文本提及终止")
    print(f"配置: 关键词='APPROVE'")
    print("工作机制: 监控所有消息内容,检测关键词")
    print("适用场景: 审批流程、质量确认、任务完成")

    # 2. 来源匹配终止 - 基于发言者身份
    source_termination = SourceMatchTermination(sources=["critic"])
    print("2.SourceMatchTermination - 来源匹配终止")
    print(f"配置: source='critic'")
    print("工作机制: 当指定智能体发言后停止")
    print("适用场景: 最终决策权赋予特定角色")

    # 业务逻辑组合示例
    print("业务逻辑组合策略")
    business_termination = TextMentionTermination("APPROVE") | TextMentionTermination("REJECT") | SourceMatchTermination(["manager"])

    print("业务终止条件: 审批通过 或 审批拒绝 或 经理决定")

# asyncio.run(business_logic_terminations())
关键注意事项
  • 关键词精准性 :TextMentionTermination 的关键词需避免歧义(例如用 "APPROVED" 而非 "通过",防止消息中正常提及 "通过测试" 时误触发);
  • 角色名称一致性 :SourceMatchTermination 的 sources 需与智能体的 name 参数完全一致(例如智能体创建时 name="critic",则 sources 必须是 ["critic"],不能是 ["评审"])。

7.3 终止条件组合策略

实际业务场景中,单一终止条件往往无法覆盖所有需求(例如仅用 "APPROVE" 可能导致无限等待,仅用 "消息数限制" 可能导致未达标就停止)。因此,需要通过逻辑运算符 组合多个终止条件,实现复杂业务逻辑。

7.3.1 逻辑运算符深度应用

AutoGen 支持两种核心逻辑运算符:

  • 或运算符( | :任一条件满足即停止("宽松策略",优先保障效率与资源);
  • 与运算符( & :所有条件满足才停止("严格策略",优先保障质量与安全性)。
    以下结合代码示例,解析四种常用组合策略:
策略 1:OR 组合(资源敏感型应用)
  • 核心逻辑:业务达标、资源超限、时间超时,任一条件满足即停止;
  • 适用场景:批量任务处理、成本敏感型应用(如每天处理 1000 个创作任务,需控制总 Token 消耗);
  • 优势:快速响应,避免不必要的资源消耗(例如任务提前达标则停止,无需等待资源上限)。
策略 2:AND 组合(高安全性审批)
  • 核心逻辑:必须同时满足 "业务达标" 和 "权威决策",才停止任务;
  • 适用场景:高安全性要求的场景(如金融领域的合同生成,需 "法务审核通过(APPROVE)" 且 "经理确认(manager 发言)");
  • 优势:双重保障,避免单一角色决策失误(例如法务通过但经理未确认,任务不停止)。
策略 3:混合组合(企业级复杂工作流)
  • 核心逻辑:将多个 OR 组合与 AND 组合嵌套,覆盖复杂业务场景;
  • 适用场景:企业级工作流(如代码开发:"开发完成 + 测试通过"OR "资源超限" OR "超时");
  • 优势:平衡效率与安全性,既保障正常流程,又防止异常场景。
策略 4:分层防护(生产环境系统)
  • 核心逻辑:按 "优先级" 分层,优先触发业务正常终止,其次触发资源保护,最后触发紧急超时;
  • 适用场景:生产环境的核心业务(如电商平台的智能客服,需保障用户体验与系统稳定);
  • 优势:主次分明,正常场景下按业务目标停止,极端场景下有资源 / 时间防护兜底。
    以下代码演示了四种组合策略的配置:
python 复制代码
from autogen_agentchat.conditions import MaxMessageTermination, TokenUsageTermination, TimeoutTermination, TextMentionTermination, SourceMatchTermination


async def termination_combination_strategies():
    """
    终止条件组合策略 - 使用AND和OR运算符创建复杂逻辑
    """
    # 创建基础终止条件
    conditions = {
        'quality_approve': TextMentionTermination("APPROVE"),
        'manager_decide': SourceMatchTermination(["manager"]),
        'message_limit': MaxMessageTermination(max_messages=8),
        'token_budget': TokenUsageTermination(max_prompt_token=1500, max_completion_token=500),
        'timeout': TimeoutTermination(timeout_seconds=60)
    }

    print("可用终止条件:")
    for name, condition in conditions.items():
        print(f"{name}: {condition}")

    # 策略1: OR组合 - 任一条件满足即停止
    print("策略1: OR组合 (任一条件满足)")
    flexible_strategy = (
            conditions['quality_approve'] |  # 质量批准
            conditions['manager_decide'] |  # 经理决定
            conditions['message_limit'] |  # 消息限制
            conditions['token_budget'] |  # Token限制
            conditions['timeout']  # 超时保护
    )
    print("适用场景: 资源敏感型应用")
    print("优势: 快速响应,避免不必要消耗")
    print("配置: condition1 | condition2 | condition3")

    # 策略2: AND组合 - 所有条件满足才停止
    print("\n策略2: AND组合 (所有条件满足)")
    strict_strategy = (
            conditions['quality_approve'] &  # 必须质量批准
            conditions['manager_decide']  # 必须经理决定
    )
    print("适用场景: 高安全性要求的审批流程")
    print("优势: 双重保障,决策更可靠")
    print("配置: condition1 & condition2")

    # 策略3: 混合组合 - 复杂业务逻辑
    print("\n策略3: 混合组合 (复杂业务逻辑)")
    hybrid_strategy = (
            (conditions['quality_approve'] & conditions['manager_decide']) |  # 双审批
            (conditions['message_limit'] & conditions['token_budget']) |  # 资源耗尽
            conditions['timeout']  # 超时
    )
    print("适用场景: 企业级复杂工作流")
    print("优势: 平衡效率与安全性")
    print("配置: (A&B) | (C&D) | E")

    # 策略4: 分层防护体系
    print("\n策略4: 分层防护体系")
    layered_strategy = (
            conditions['quality_approve'] |  # 第一层: 业务正常完成
            (
                    conditions['message_limit'] |  # 第二层: 资源保护
                    conditions['token_budget'] |
                    conditions['timeout']
            )
    )
    print("适用场景: 生产环境系统")
    print("优势: 主次分明,保障系统稳定性")
组合策略的设计建议
  • 优先 OR 组合:绝大多数场景下,OR 组合更灵活(既保障业务目标,又防止资源浪费),AND 组合仅用于高安全性场景;
  • 明确优先级 :分层防护策略中,业务正常终止(如 quality_approve)应放在最前面,确保优先触发;
  • 避免过度复杂:组合条件不宜超过 5 个,否则会增加调试难度(例如判断停止原因时,需排查多个条件)。

7.4 自定义终止条件开发

当内置终止条件无法满足特殊业务需求时(例如 "基于质量评分终止""基于用户满意度终止"),AutoGen 支持通过继承 TerminationCondition 类开发自定义终止条件。

7.4.1 自定义终止条件框架
核心开发步骤

自定义终止条件需遵循固定框架,核心是实现以下四个部分:

  1. 配置类(Config) :定义自定义条件的参数(如目标质量分、最大消息数),基于 pydantic.BaseModel 实现,确保参数合法性校验;
  2. 核心类(CustomTermination) :继承 TerminationCondition 和 Component[Config],实现以下关键方法:
  • init:初始化参数(如目标评分、计数变量);
  • call:核心逻辑,接收消息列表,判断是否触发终止;
  • reset:任务结束后重置状态(如清空评分列表、计数清零);
  • _to_config/_from_config:实现配置的序列化 / 反序列化,支持保存 / 加载配置;
  1. 辅助方法 :根据业务需求编写辅助逻辑(如从消息中提取质量评分的 _extract_quality_score);
  2. 测试验证:创建智能体和团队,绑定自定义条件,验证触发逻辑是否符合预期。
    以下代码实现了 "基于质量评分的自定义终止条件"(当平均质量分≥8 且消息数≥3 时停止):
python 复制代码
import asyncio
from typing import Sequence
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.base import TerminatedException, TerminationCondition
from autogen_agentchat.messages import BaseAgentEvent, BaseChatMessage, StopMessage, ToolCallExecutionEvent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core import Component
from autogen_core.models import ModelFamily
from autogen_ext.models.openai import OpenAIChatCompletionClient
from pydantic import BaseModel
from typing_extensions import Self


class QualityScoreTerminationConfig(BaseModel):
    """
    质量评分终止条件配置
    """
    target_score: float
    max_messages: int


class QualityScoreTermination(TerminationCondition, Component[QualityScoreTerminationConfig]):
    """
    基于质量评分的自定义终止条件
    当平均质量评分达到目标值且消息数合理时停止
    """

    component_config_schema = QualityScoreTerminationConfig
    component_provider_override = "custom.conditions.QualityScoreTermination"

    def __init__(self, target_score: float, max_messages: int) -> None:
        self._terminated = False
        self.target_score = target_score
        self.max_messages = max_messages
        self.quality_scores = []
        self.message_count = 0

    @property
    def terminated(self) -> bool:
        return self._terminated

    async def __call__(self, messages: Sequence[BaseAgentEvent | BaseChatMessage]) -> StopMessage | None:
        if self._terminated:
            raise TerminatedException("终止条件已触发")
        # 更新消息计数
        self.message_count += len(messages)
        # 分析消息内容,提取质量评分
        for message in messages:
            if hasattr(message, 'content'):
                content = str(message.content)
                score = self._extract_quality_score(content)
                if score is not None:
                    self.quality_scores.append(score)
                    print(f"检测到质量评分: {score}")
        # 检查终止条件
        if self.quality_scores:
            avg_score = sum(self.quality_scores) / len(self.quality_scores)
            print(f"当前平均质量分: {avg_score:.2f}, 目标: {self.target_score}")
            if avg_score >= self.target_score and self.message_count >= 3:
                self._terminated = True
                return StopMessage(content=f"质量达标: 平均分{avg_score:.2f} ≥ 目标{self.target_score}", source="QualityScoreTermination")
        # 消息数量保护
        if self.message_count >= self.max_messages:
            self._terminated = True
            return StopMessage(content=f"达到最大消息数: {self.message_count}", source="QualityScoreTermination")
        return None

    def _extract_quality_score(self, content: str) -> float | None:
        """
        从消息内容中提取质量评分
        """
        import re

        # 匹配评分模式: "评分: 8.5" 或 "质量分: 7/10"
        score_patterns = [r'评分[::]\s*(\d+(?:\.\d+)?)', r'质量分[::]\s*(\d+(?:\.\d+)?)\s*[/]?\s*10', r'score[::]\s*(\d+(?:\.\d+)?)']
        for pattern in score_patterns:
            match = re.search(pattern, content, re.IGNORECASE)
            if match:
                score = float(match.group(1))
                # 标准化到0-10分
                if score > 10:
                    score = 10.0
                return score
        return None

    async def reset(self) -> None:
        self._terminated = False
        self.quality_scores = []
        self.message_count = 0

    def _to_config(self) -> QualityScoreTerminationConfig:
        return QualityScoreTerminationConfig(target_score=self.target_score, max_messages=self.max_messages)

    @classmethod
    def _from_config(cls, config: QualityScoreTerminationConfig) -> Self:
        return cls(target_score=config.target_score, max_messages=config.max_messages)


model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",  # 指定使用的模型名称
    base_url="https://api.deepseek.com/v1",  # DeepSeek API的基础URL
    api_key="sk-xxxxxxxxxx",  # API密钥(注意:在实际应用中应使用环境变量保护密钥)
    model_info={  # 模型能力配置信息
        "vision": False,  # 不支持视觉功能
        "function_calling": True,  # 支持函数调用
        "json_output": True,  # 支持JSON格式输出
        "family": ModelFamily.UNKNOWN,  # 模型家族分类
        "structured_output": True,  # 支持结构化输出
        "multiple_system_messages": True  # 支持多条系统消息
    },
)


async def custom_termination_demo():
    """
    自定义终止条件的应用
    """
    # 创建支持质量评分的智能体
    quality_agent = AssistantAgent(
        "quality_agent",
        description="一位质量评估专家",
        model_client=model_client,
        system_message="""
        你是质量评估专家,对每个内容版本进行评分。
        评分标准(0-10分):
        - 内容质量: 主题明确、逻辑清晰 (0-4分)
        - 语言表达: 流畅自然、用词准确 (0-3分)  
        - 创意价值: 新颖独特、有启发性 (0-3分)
        请在评审结束时提供格式化的评分:
        "评分: 8.5" 或 "质量分: 7/10"
        当平均评分达到8分时可以考虑停止。
        """
    )

    # 创建自定义终止条件
    quality_termination = QualityScoreTermination(
        target_score=8.0,  # 目标质量分数
        max_messages=10  # 最大消息数保护
    )

    print("自定义终止条件配置:")
    print(f"目标质量分: {quality_termination.target_score}")
    print(f"最大消息数: {quality_termination.max_messages}")
    print("工作机制: 监控质量评分,计算平均值")

    quality_team = RoundRobinGroupChat([quality_agent], termination_condition=quality_termination)
    print("开始质量评分监控...")
    await Console(quality_team.run_stream(task="""评审下面这首诗歌的质量:床前明月光,疑是地上霜。举头望明月,低头思故乡。"""))

asyncio.run(custom_termination_demo())
自定义终止条件的开发建议
  • 参数化设计 :通过配置类(如 QualityScoreTerminationConfig)定义参数,避免硬编码(例如目标分、最大消息数可灵活调整);
  • 状态可重置 :必须实现 reset 方法,否则多轮任务会相互干扰;
  • 错误处理 :在 call 方法中加入异常捕获(如 try-except),避免因消息格式异常导致终止条件崩溃;
  • 日志输出:适当打印关键信息(如提取的评分、平均分),便于调试(例如判断为何未触发终止);
  • 兼容性 :确保自定义条件与 AutoGen 版本兼容(继承 TerminationCondition 时,关注方法签名是否匹配最新版本)。
相关推荐
Turnsole_y8 小时前
pytest与Selenium结合使用指南
开发语言·python
达芬奇科普9 小时前
俄罗斯全面禁止汽油出口对俄、欧、中能源市场的多维影响分析
大数据·人工智能
AI量化投资实验室9 小时前
年化398%,回撤11%,夏普比5,免费订阅,5积分可查看参数|多智能体的架构设计|akshare的期货MCP代码
人工智能·python
电鱼智能的电小鱼9 小时前
基于电鱼 ARM 工控机的煤矿主控系统高可靠运行方案——让井下控制系统告别“死机与重启”
arm开发·人工智能·嵌入式硬件·深度学习·机器学习
OAFD.9 小时前
深度学习之图像分割:从基础概念到核心技术全解析
人工智能·深度学习
武子康9 小时前
AI研究-116 特斯拉 HW3.0 与 HW4.0 区别详解:摄像头分辨率、FSD算力、雷达与Vision泊车
人工智能·深度学习·计算机视觉·ai·自动驾驶·汽车·视觉检测
Mrliu__9 小时前
Opencv(六) : 颜色识别
人工智能·opencv·计算机视觉
Liudef069 小时前
基于LLM的智能数据查询与分析系统:实现思路与完整方案
前端·javascript·人工智能·easyui
芥子沫9 小时前
《人工智能基础》[算法篇3]:决策树
人工智能·算法·决策树