多智能体协作架构的工程需求
单Agent系统在处理复杂任务时存在能力边界,多智能体协作(Multi-Agent Collaboration)通过角色分工与消息传递机制,将复杂工作流拆解为多个专业子任务并行或串行执行。在代码生成、数据分析、文档撰写等场景中,多Agent架构的输出质量显著优于单Agent。AutoGen、CrewAI、LangGraph是当前主流的三个多Agent框架,其中微软开源的AutoGen以Group Chat模式提供了灵活的Agent编排能力。
AutoGen框架核心组件与消息机制
AutoGen的协作模型围绕三个核心抽象构建:
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
llm_config = {
"model": "gpt-4o",
"api_key": "your-api-key",
"temperature": 0.7
}
planner = AssistantAgent(
name="Planner",
system_message="你是一个项目规划专家,负责拆解任务并制定执行计划。",
llm_config=llm_config
)
coder = AssistantAgent(
name="Coder",
system_message="你是一个高级Python开发工程师,根据规划编写代码实现。",
llm_config=llm_config
)
reviewer = AssistantAgent(
name="Reviewer",
system_message="你是一个代码审查专家,检查代码质量、安全性和性能问题。",
llm_config=llm_config
)
user_proxy = UserProxyAgent(
name="User",
human_input_mode="NEVER",
max_consecutive_auto_reply=0
)
AssistantAgent是具备LLM推理能力的智能体,UserProxyAgent是用户交互代理,GroupChatManager负责管理多Agent之间的对话轮转。消息在Agent之间以广播方式传递,Manager根据配置的Speaker Selection策略决定下一个发言的Agent。
Group Chat编排策略与Speaker Selection
Group Chat的编排核心在于Speaker Selection——决定每轮对话由哪个Agent发言。AutoGen提供了三种内置策略:
# 自动选择
group_chat = GroupChat(
agents=[planner, coder, reviewer, user_proxy],
messages=[],
max_round=12,
speaker_selection_method="auto"
)
# 轮询
group_chat_round = GroupChat(
agents=[planner, coder, reviewer, user_proxy],
messages=[],
max_round=12,
speaker_selection_method="round_robin"
)
# 自定义选择函数
def custom_speaker(last_speaker, groupchat):
if last_speaker is planner:
return coder
elif last_speaker is coder:
return reviewer
elif last_speaker is reviewer:
return planner
return user_proxy
group_chat_custom = GroupChat(
agents=[planner, coder, reviewer, user_proxy],
messages=[],
max_round=15,
speaker_selection_method=custom_speaker
)
auto模式由LLM根据对话上下文自主选择下一个发言者,灵活但成本较高;round_robin模式按固定顺序轮转,适合流程明确的场景;自定义函数模式精确控制流转路径,适合有固定工作流的业务场景。
完整工作流:自动化代码生成与审查
manager = GroupChatManager(
groupchat=group_chat_custom,
llm_config=llm_config
)
user_proxy.initiate_chat(
manager,
message="请实现一个Python异步HTTP客户端,支持连接池管理和请求重试"
)
Planner分析需求后制定模块拆分计划,Coder按计划编写代码,Reviewer检查质量并反馈问题。max_round限制对话轮数防止无限循环。
Agent状态管理与上下文压缩
多轮对话中消息历史会快速增长,超过上下文窗口限制时需要压缩:
from autogen import ConversableAgent
class StatefulAgent(ConversableAgent):
def __init__(self, name, max_messages=20, **kwargs):
super().__init__(name, **kwargs)
self.max_messages = max_messages
self.summary = ""
def compress_history(self, messages):
if len(messages) > self.max_messages:
recent = messages[-5:]
summary_msg = {
"role": "system",
"content": f"此前对话摘要:{self.summary}"
}
return [summary_msg] + recent
return messages
生产环境中必须实现上下文压缩,否则长对话场景下Token消耗会指数级增长。
工具调用与代码执行安全
import docker
def safe_execute(code: str) -> str:
client = docker.from_env()
container = client.containers.run(
image="python:3.11-slim",
command=f"python -c {repr(code)}",
mem_limit="512m",
cpu_period=100000,
cpu_quota=50000,
network_mode="none",
remove=True,
stdout=True,
stderr=True
)
return container.decode("utf-8")
生产级部署时,Agent生成的代码必须在沙箱中执行,限制网络访问、内存上限和CPU配额。Docker容器是最常用的隔离方案。
多Agent系统的监控与可观测性
import structlog
logger = structlog.get_logger()
class InstrumentedGroupChatManager(GroupChatManager):
def _log_speaker_transition(self, last_speaker, next_speaker, message):
logger.info(
"agent_transition",
from_agent=last_speaker.name,
to_agent=next_speaker.name,
message_length=len(message.get("content", "")),
round=self.groupchat._round
)
def _log_completion(self, chat_result):
total_tokens = sum(
msg.get("usage", {}).get("total_tokens", 0)
for msg in chat_result.chat_history
)
logger.info("chat_completed",
total_rounds=self.groupchat._round,
total_tokens=total_tokens)
结构化日志记录每轮Agent切换、消息内容和Token消耗,结合OpenTelemetry可以建立完整的调用链路追踪。
性能调优与成本控制
1. System Prompt精简——每个Agent的system_message应精确描述职责,避免冗余指令浪费Token
2. 小模型路由——对简单判断任务使用小模型,复杂推理使用大模型
3. 缓存重复推理——对Agent的常见判断结果做语义缓存,避免重复调用LLM
4. 提前终止——在自定义Speaker Selection中增加终止条件判断,避免无效轮次
多智能体协作框架的工程落地需要在灵活性、可靠性和成本之间取得平衡。AutoGen的Group Chat模式提供了较好的编排能力,适合需要角色分工的复杂任务场景。生产部署时务必关注上下文管理、执行安全和可观测性这三个关键环节。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/aiagent-duo-zhi-neng-ti-xie-zuo-kuang-jia-she-ji-yu/