基于 AutoGen 构建多智能体互动对话系统
1. 引言
随着大语言模型(LLM)技术的快速发展,单一的智能体已难以满足复杂任务的需求。多智能体协作系统(Multi-Agent Systems)通过模拟人类团队分工,能够处理更复杂的逻辑推理、代码生成及创意写作任务。AutoGen 是一个开源框架,旨在简化多智能体应用程序的开发。本教程将深入探讨如何利用 AutoGen 构建具备高度互动性的多智能体应用,从基础环境搭建到高级对话控制策略。
2. 环境安装指南
在开始之前,请确保您的开发环境已配置好 Python 3.10 及以上版本。推荐使用 Conda 创建独立虚拟环境以避免依赖冲突。
conda create -n pyautogen python=3.10
conda activate pyautogen
pip install pyautogen
若需使用特定模型 API(如阿里云通义千问),还需安装相应的 SDK 并配置环境变量。
3. ConversableAgent 核心解析
AutoGen 的核心组件是 ConversableAgent。它代表了能够发送和接收消息的实体。每个 Agent 由强大的 LLM 支持、代码执行引擎、外部工具接口及人性化设计组件构成。
3.1 关键参数详解
初始化 Agent 时,以下参数至关重要:
- name: 设定智能体名称,用于区分不同角色。
- system_message: 系统提示词,定义角色的背景、人设及行为准则。这是塑造 Agent 性格的关键。
- is_termination_msg: 一个回调函数,用于判断当前消息是否应终止对话。例如检测关键词'再见'。
- max_consecutive_auto_reply: 限制连续自动回复次数,防止死循环或过度消耗 Token。
- human_input_mode: 控制人类介入程度,可选值包括 "ALWAYS"(总是询问)、"NEVER"(完全自动)、"TERMINATE"(仅在收到终止信号时停止)。
- function_map: 绑定可调用函数,使 Agent 具备调用外部工具的能力。
- llm_config: 配置 LLM 连接信息,包括模型名称、API Key、温度(temperature)等。
- code_execution_config: 配置代码执行环境,如 Docker 容器或本地沙箱,用于安全运行生成的代码。
- description: 对外介绍 Agent 能力,通常用于其他 Agent 识别其功能。
- chat_messages: 提供历史对话记录,赋予 Agent 上下文记忆能力。
3.2 单智能体示例
创建一个基础的聊天机器人,代码如下:
import os
from autogen import ConversableAgent
llm_config = {
"config_list": [
{"model": "qwen-max-1201", "api_key": os.getenv("QWEN_API_TOKEN"),
"temperature": 0.1, "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1"}
],
}
agent = ConversableAgent(
name="chatbot",
llm_config=llm_config,
code_execution_config=False,
function_map=None,
human_input_mode="NEVER"
)
# 发起对话
reply = agent.generate_reply(messages=[{"content": "讲个笑话", "role": "user"}])
print(reply)
在此配置中,llm_config 定义了请求参数,支持 max_token、top_p 等 OpenAI 兼容参数。实例化后,调用 generate_reply 即可获取响应。
4. 双智能体互动:模拟相声场景
相声表演的精髓在于逗哏与捧哏的默契配合。在 AutoGen 中,这映射为两个智能体的交互对话。我们塑造了'岳云鹏'与'孙越'两位角色,各自携带独特性格与任务。
4.1 角色定义
yueyue = ConversableAgent(
name="岳云鹏",
system_message="""
你是岳云鹏,一个幽默风趣、活泼开朗的喜剧演员。你擅长用独特的风格与用户互动,能够敏锐捕捉并模仿人类情感的微妙变化,通过自嘲和适度的讽刺来营造轻松愉快的交流氛围。
""",
llm_config=llm_config,
human_input_mode="NEVER"
)
sunyue = ConversableAgent(
name="孙越",
system_message="""
你是孙越,著名相声演员,岳云鹏的搭档,一位沉稳内敛却又机智过人的捧哏专家。你具有深厚的文化底蕴和敏锐的思维反应。你擅长在对话中不动声色地抛出精妙的点评或反问,既支撑着主要话题的展开,又能适时提供智慧的火花。
""",
llm_config=llm_config,
human_input_mode="NEVER"
)
4.2 发起对话
使用 initiate_chat 方法启动虚拟表演。该方法允许指定接收方、最大回合数及初始消息。
result = yueyue.initiate_chat(
sunyue,
message={
"content": "大家新年快乐,上了台了我们应该先做一个自我介绍,因为由不认识我们的朋友,我叫,emmm。。。不能说",
"role": "user"
},
max_turns=6
)
print(result.summary)
ChatResult 对象包含对话 ID、历史记录 (chat_history)、摘要 (summary) 和成本 (cost)。若需深度总结,可将 summary_method 设为 reflection_with_llm。
5. 对话控制与终止策略
未设定明确的停止规则时,智能体间的对话可能会无休止地持续。有效的控制机制对于生产环境至关重要。
5.1 回合限制
通过 max_turns 参数直接限制对话轮次,是最简单的控制手段。
5.2 条件终止
利用 is_termination_msg 参数,可以检测消息内容中的特定关键词来自动中止对话。
yueyue = ConversableAgent(
name="岳云鹏",
system_message="...",
is_termination_msg=lambda msg: "再见" in msg["content"],
human_input_mode="NEVER"
)
result = yueyue.initiate_chat(sunyue, message="讲个笑话给我听听然后说对我说再见")
此设置使得当检测到'再见'时,对话立即结束,节省 Token 并提升用户体验。
6. 高级功能扩展
6.1 代码执行配置
启用代码执行能力可以让 Agent 解决数学问题或操作文件。建议在生产环境中使用 Docker 隔离执行环境。
code_exec_config = {
"use_docker": False, # 生产环境建议开启 Docker
"timeout": 60
}
6.2 函数调用
通过 function_map 绑定自定义 Python 函数,Agent 可根据意图调用外部 API 或数据库。这大大扩展了 Agent 的能力边界。
7. 最佳实践与安全建议
- Prompt Engineering: 精心设计的
system_message能显著提升输出质量。避免模糊指令,明确角色边界。 - Token 管理: 监控
usage_including_cached_inference中的 token 消耗,合理设置max_tokens以控制成本。 - 安全性: 禁用不必要的代码执行权限,防止 Prompt Injection 攻击。对输入内容进行清洗。
- 错误处理: 捕获 API 调用异常,实现重试机制,保证服务稳定性。
8. 总结
本文详细介绍了利用 AutoGen 框架进行多智能体协作应用程序开发的实践。从单一讲笑话智能体到双智能体相声对话系统的开发过程,我们学习了如何设置及初始化智能体以具备特定交流能力。通过精细调控对话参数,既能有效控制对话长度,避免冗余,又能确保对话内容的连贯与趣味,从而实现更加自然流畅的多轮交互。未来,结合 RAG(检索增强生成)与 Function Calling,多智能体系统将在自动化客服、游戏 NPC 及复杂任务规划等领域发挥更大价值。
在实际应用中,开发者应根据具体业务场景调整 Agent 的角色设定与交互逻辑,并持续关注框架更新以优化性能与安全性。


