在开发多智能体应用时,我们常常面临一个关键挑战:如何在智能体团队中断后恢复之前的协作状态?想象一下,当用户关闭应用后重新打开,智能体团队若能记忆之前的对话历史和任务进度,将极大提升用户体验。AutoGen 框架提供的状态管理机制正是解决这一问题的核心方案。今天,我们将系统拆解团队状态的保存、持久化和恢复技术,帮助你构建具有 "记忆" 能力的智能体协作系统。
python
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
# 初始化模型客户端
model_client = OpenAIChatCompletionClient(model="gpt-4o-2024-08-06")
# 创建智能体并生成内容
poet_agent = AssistantAgent(
name="poet_agent",
system_message="你是一位擅长自然主题的诗人",
model_client=model_client
)
# 智能体创作诗歌
first_poem = await poet_agent.on_messages(
[TextMessage(content="写一首关于坦噶尼喀湖的三行诗", source="user")],
CancellationToken()
)
print("首次创作:", first_poem.chat_message)
# 保存智能体状态(包含对话历史)
agent_state = await poet_agent.save_state()
print("智能体状态结构:", agent_state.keys())
# 输出: dict_keys(['type', 'version', 'llm_messages'])
python
# 新建智能体并加载状态
new_agent = AssistantAgent(
name="poet_agent",
system_message="你是一位擅长自然主题的诗人",
model_client=model_client
)
await new_agent.load_state(agent_state)
# 询问之前的创作内容
recall_response = await new_agent.on_messages(
[TextMessage(content="你上次写的诗最后一行是什么?", source="user")],
CancellationToken()
)
print("状态恢复后响应:", recall_response.chat_message)
text
在坦噶尼喀湖的蓝调里,
古老水波轻摇着秘密,
天际线在涟漪中沉睡。
text
上次创作的最后一行是:"天际线在涟漪中沉睡。"
AssistantAgent 状态字典包含三大核心字段:
python
{
"content": "用户输入或智能体回复内容",
"source": "user"或智能体名称,
"type": "UserMessage"或"AssistantMessage"
}
python
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import MaxMessageTermination
# 创建智能体与团队
single_agent = AssistantAgent(
name="team_member",
system_message="团队协作智能体",
model_client=model_client
)
# 配置团队(2条消息后终止)
poem_team = RoundRobinGroupChat(
[single_agent],
termination_condition=MaxMessageTermination(max_messages=2)
)
# 运行团队任务
await Console(poem_team.run_stream("创作关于星空的三行诗"))
# 保存团队完整状态
team_full_state = await poem_team.save_state()
print("团队状态顶级字段:", team_full_state.keys())
# 输出: dict_keys(['type', 'version', 'agent_states', 'team_id'])
python
{
"group_chat_manager/...": { # 群聊管理状态
"type": "RoundRobinManagerState",
"message_thread": [ # 完整对话线程
{"source": "user", "content": "任务指令", ...},
{"source": "team_member", "content": "智能体回复", ...}
],
"current_turn": 0, # 当前轮次
"next_speaker_index": 0 # 下一个发言者索引
},
"collect_output_messages/...": {}, # 输出消息收集状态(暂存中间结果)
"team_member/...": { # 智能体具体状态
"type": "ChatAgentContainerState",
"agent_state": { # 嵌套智能体状态
"type": "AssistantAgentState",
"llm_messages": [...] # 智能体对话历史
},
"message_buffer": [] # 消息缓冲区
}
}
python
import json
# 保存团队状态到文件
with open("poem_team_state.json", "w") as f:
json.dump(team_full_state, f, indent=2)
# 从文件加载状态
with open("poem_team_state.json", "r") as f:
loaded_state = json.load(f)
# 新建团队并恢复状态
new_team = RoundRobinGroupChat([single_agent], MaxMessageTermination(2))
await new_team.load_state(loaded_state)
# 验证状态恢复
verify_response = await new_team.run_stream("你上次创作的诗中提到了什么自然元素?")
print("状态恢复验证:", verify_response.messages[-1].content)
加载状态后智能体正确回复:
text
上次创作的诗歌中提到了星空、银河和沉睡的星座等自然元素。
python
# 创建创作与审核双智能体团队
writer_agent = AssistantAgent(
name="writer",
system_message="内容创作者"
)
reviewer_agent = AssistantAgent(
name="reviewer",
system_message="内容审核者"
)
# 配置团队
collab_team = RoundRobinGroupChat(
[writer_agent, reviewer_agent],
termination_condition=TextMentionTermination("APPROVED")
)
# 运行团队任务
await collab_team.run("创作并审核一篇科技文章")
# 保存复杂团队状态
complex_state = await collab_team.save_state()
print("多智能体状态结构:", complex_state["agent_states"].keys())
# 输出: dict_keys(['group_chat_manager/...', 'collect_output_messages/...', 'writer/...', 'reviewer/...'])
agent_states
包含两个智能体的独立状态group_chat_manager
记录轮次顺序(writer→reviewer→writer...)message_thread
保存完整协作历史(创作→审核→修改→再审核)python
async def upgrade_team_state(old_state):
"""处理团队状态版本升级"""
if old_state.get("version") == "1.0.0":
new_state = {
**old_state,
"version": "2.0.0",
"new_feature": "支持多模态消息",
"agent_states": { # 升级智能体状态
k: (v if "agent_state" in v else {"agent_state": v})
for k, v in old_state["agent_states"].items()
}
}
return new_state
return old_state
# 加载时自动升级状态
async def load_upgraded_team(team, state_dict):
upgraded = await upgrade_team_state(state_dict)
await team.load_state(upgraded)
python
# 保存客服团队状态(包含多个客服智能体)
customer_service_team = RoundRobinGroupChat(
[agent1, agent2, agent3], # 多个客服智能体
termination_condition=TimeoutTermination(300)
)
# 持久化时关联会话ID
session_id = "user_12345"
team_state = await customer_service_team.save_state()
save_to_db(session_id, team_state)
python
from autogen_core.model_context import BufferedChatCompletionContext
# 限制团队对话历史为最近10条
trimmed_team = RoundRobinGroupChat(
[agent],
termination_condition=MaxMessageTermination(5),
model_context=BufferedChatCompletionContext(buffer_size=10)
)
python
def get_state_diff(current, previous):
"""仅保存状态变化部分"""
# 简化实现:实际应递归对比字典差异
if current["version"] != previous["version"]:
return current
# 对比llm_messages差异...
return {"incremental": "..." }
通过本文的深度解析,我们系统掌握了 AutoGen 团队状态管理的核心技术,从智能体个体状态到多智能体协作状态的完整生命周期。这些技术能够帮助你构建具有记忆能力的智能体团队,在客服、代码协作、内容创作等场景中大幅提升用户体验。
如果本文对你有帮助,别忘了点赞收藏,关注我,一起探索更高效的开发方式~