AutoGen学习笔记系列(七)Tutorial - Managing State

news2025/3/9 23:05:25

这篇文章瞄准的是AutoGen框架官方教程中的 Tutorial 章节中的 Managing State 小节,主要介绍了如何对Team内的状态管理,特别是如何 保存加载 状态,这对于Agent系统而言非常重要。

官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/state.html# ;

【注意】:AutoGen库中有一个函数名存在语意歧义,save_state() 实际是获取状态,至于如何本地化是需要自己完成的,但好在其状态的描述都是json格式,所以这部分很容易实现。


Managing State

在之前的文章中详细介绍了如何构建与使用Team、如何控制Team内部轮询节奏等。我们也提到过只要不调用 team.reset() 方法,Team内部的上下文状态是会持续被保留的。那么为什么会需要将这个上下文状态写到本地硬盘上呢?

  1. 节省成本:如果你想构建自己私有Team并让其拥有长期记忆,那么保存历史状态就是必须的,否则每次启动后都需要将你和Team的所有历史对话都重新发一遍,token会被快速消耗;
  2. 代码测试:在调试过程中难免会抛出异常,为了避免程序被意外中断,保存上下文信息也是非常必要的;
  3. 方便迁移:上下文状态相当于一个人的记忆,只要Team结构不变就可以将这个记忆复制很多份在其他地方使用,并行任务的神器;

AutoGen提供了Agent、Team快捷方便的存储方法 save_state() 成员函数,其返回值是一个python的dict类型,能够很容易地转换为json文本,这意味着我们甚至可以手动修改Agent、Team的状态信息。


Saving and Loading Agents

对于Agent而言可以使用save_state() 获取 状态,用 load_state() 加载状态。

  • 首先写一个demo,在运行后将Agent的状态保存到硬盘上:
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_core import CancellationToken
from autogen_ext.models.openai import OpenAIChatCompletionClient
import os, asyncio, json

os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
assistant_agent = AssistantAgent(
    name="assistant_agent",
    system_message="You are a helpful assistant",
    model_client=OpenAIChatCompletionClient(
        model="gpt-4o-2024-08-06",
    ),
)

#----------------------------------------------------#
# 写一个函数用来本地化Agent的状态信息
def persisting_state(file_name:str, state):
    with open(file_name, "w") as f:
        json.dump(state, f)

# 让Agent执行一小段交互
async def main():
    response = await assistant_agent.on_messages(
        [TextMessage(content="Write a 3 line poem on lake tangayika", source="user")], CancellationToken()
    )
    print(response.chat_message.content)
    print('-' * 50)
    # 等待运行完成后在获取其状态
    agent_state = await assistant_agent.save_state()
    print(agent_state)
    # 将Agent状态写入本地
    persisting_state("./agent_state.json", agent_state)

asyncio.run(main())

运行结果如下:

$ python demo.py 

在这里插入图片描述

当前目录下会生成一个这个Agent的状态信息,里面的messages字段就是Agent和LLM之间的聊天记录,也就是所谓的记忆:

{
    "type": "AssistantAgentState",
    "version": "1.0.0",
    "llm_context": {
        "messages": [
            {
                "content": "Write a 3 line poem on lake tangayika",
                "source": "user",
                "type": "UserMessage"
            },
            {
                "content": "In waters deep, where ancient secrets keep,  \nTanganyika mirrors the sky's boundless sweep,  \nSilent guardian of tales and dreams, it sleeps.  ",
                "source": "assistant_agent",
                "type": "AssistantMessage"
            }
        ]
    }
}
  • 然后再写一个demo从硬盘上读取Agent状态:
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_core import CancellationToken
from autogen_ext.models.openai import OpenAIChatCompletionClient
import os, asyncio, json

os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"

#----------------------------------------------------#
# 写一个函数用来加载本地json文件
def load_state(file_path:str) -> dict:
    with open(file_path, "r") as f:
        state = json.load(f)
        return state

# 定义一个新的Agent,此时这个Agent还没有记忆,是一个空的状态
new_assistant_agent = AssistantAgent(
    name="assistant_agent",
    system_message="You are a helpful assistant",
    model_client=OpenAIChatCompletionClient(
        model="gpt-4o-2024-08-06",
    ),
)

async def main():
	# 加载本地Agent状态
    agent_state = load_state("./agent_state.json")
    await new_assistant_agent.load_state(agent_state)
    # 让新的Agent与模型进行一次交互
    response = await new_assistant_agent.on_messages(
        [TextMessage(content="What was the last line of the previous poem you wrote", source="user")], CancellationToken()
    )
    print(response.chat_message.content)
    print('-' * 50)
    agent_state = await new_assistant_agent.save_state()
    print(agent_state)
    
asyncio.run(main())

运行结果如下:

$ python demo.py

在这里插入图片描述

此时如果你再将这个新的Agent状态保存一下就可以看到下面这些内容:

{
    "type": "AssistantAgentState",
    "version": "1.0.0",
    "llm_context": {
        "messages": [
        	// 这部分是之前Agent的聊天记录
            {
                "content": "Write a 3 line poem on lake tangayika",
                "source": "user",
                "type": "UserMessage"
            },
            {
                "content": "In waters deep, where ancient secrets keep,  \nTanganyika mirrors the sky's boundless sweep,  \nSilent guardian of tales and dreams, it sleeps.  ",
                "source": "assistant_agent",
                "type": "AssistantMessage"
            },
            // 从这开始是新Agent的聊天记录
            {
                "content": "What was the last line of the previous poem you wrote",
                "source": "user",
                "type": "UserMessage"
            },
            {
                "content": "The last line of the previous poem I wrote was:  \nSilent guardian of tales and dreams, it sleeps.",
                "source": "assistant_agent",
                "type": "AssistantMessage"
            }
        ]
    }
}

Saving and Loading Teams

和上面Agent状态获取与加载一样,Team的状态获取与加载使用的是同名函数save_state()load_state()

  • 先写一个demo用来保存team的状态:
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
import os, asyncio, json

os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
def persisting_state(file_name:str, state):
    with open(file_name, "w") as f:
        json.dump(state, f)

assistant_agent = AssistantAgent(
    name="assistant_agent",
    system_message="You are a helpful assistant",
    model_client=OpenAIChatCompletionClient(
        model="gpt-4o-2024-08-06",
    ),
)
agent_team = RoundRobinGroupChat([assistant_agent], termination_condition=MaxMessageTermination(max_messages=2))

#----------------------------------------------------#
async def main():
	stream = agent_team.run_stream(task="Write a beautiful poem 3-line about lake tangayika")
    await Console(stream)
    # 获取team的状态
    team_state = await agent_team.save_state()
    print(team_state)
    persisting_state("./team_state.json", team_state)
    
asyncio.run(main())

运行结果如下:

$ python demo.py

在这里插入图片描述

这里可以发现Team类型的状态要比单个Agent的内容多不少:

{
    "type": "TeamState",
    "version": "1.0.0",
    "agent_states": {
        "group_chat_manager/10c60d46-7e4d-4de0-ae64-e2b7eaf97119": {
            "type": "RoundRobinManagerState",
            "version": "1.0.0",
            "message_thread": [
                {
                    "source": "user",
                    "models_usage": null,
                    "content": "Write a beautiful poem 3-line about lake tangayika",
                    "type": "TextMessage"
                },
                {
                    "source": "assistant_agent",
                    "models_usage": {
                        "prompt_tokens": 29,
                        "completion_tokens": 34
                    },
                    "content": "In Tanganyika's embrace, skies mirror deep,  \nWhispering waves cradle secrets to keep,  \nNature's timeless dance, where the heart finds sleep.  ",
                    "type": "TextMessage"
                }
            ],
            "current_turn": 0,
            "next_speaker_index": 0
        },
        "collect_output_messages/10c60d46-7e4d-4de0-ae64-e2b7eaf97119": {},
        "assistant_agent/10c60d46-7e4d-4de0-ae64-e2b7eaf97119": {
            "type": "ChatAgentContainerState",
            "version": "1.0.0",
            "agent_state": {
                "type": "AssistantAgentState",
                "version": "1.0.0",
                "llm_context": {
                    "messages": [
                        {
                            "content": "Write a beautiful poem 3-line about lake tangayika",
                            "source": "user",
                            "type": "UserMessage"
                        },
                        {
                            "content": "In Tanganyika's embrace, skies mirror deep,  \nWhispering waves cradle secrets to keep,  \nNature's timeless dance, where the heart finds sleep.  ",
                            "source": "assistant_agent",
                            "type": "AssistantMessage"
                        }
                    ]
                }
            },
            "message_buffer": []
        }
    },
    "team_id": "10c60d46-7e4d-4de0-ae64-e2b7eaf97119"
}
  • 再写一个demo用来加载本地保存的状态:
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
import os, asyncio, json

os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
def load_state(file_path:str) -> dict:
    with open(file_path, "r") as f:
        state = json.load(f)
        return state
        
assistant_agent = AssistantAgent(
    name="assistant_agent",
    system_message="You are a helpful assistant",
    model_client=OpenAIChatCompletionClient(
        model="gpt-4o-2024-08-06",
    ),
)
agent_team = RoundRobinGroupChat([assistant_agent], termination_condition=MaxMessageTermination(max_messages=2))

#----------------------------------------------------#
async def main():
	# 从本地加载team的状态
    team_state = load_state("./team_state.json")
    await agent_team.load_state(team_state)
    stream = agent_team.run_stream(task="What was the last line of the poem you wrote?")
    await Console(stream)
    print('-' * 50)
    team_state = await agent_team.save_state()
    print(team_state)
    
asyncio.run(main())

运行结果如下:

$ python demo.py

在这里插入图片描述


Persisting State (File or Database)

剩下这一小段就是介绍如何将Agent和Team状态写入硬盘并加载,其实上面的示例中已经用到了这个函数,官方教程中没有对其进行封装,我这里直接把上面用到的函数贴在这:

# 将状态写入本地
def persisting_state(file_name:str, state):
    with open(file_name, "w") as f:
        json.dump(state, f)

# 从本地加载状态
def load_state(file_path:str) -> dict:
    with open(file_path, "r") as f:
        state = json.load(f)
        return state

Take a breath

至此,官方教程中的 Tutorial 章节就全部介绍完了,后面将开启官方教程中的进阶章节 Advanced 部分,革命尚未成功,同志仍需努力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2311010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis渐进式遍历数据库

目录 渐进式遍历 数据库 渐进式遍历 keys*可以一次性的把整个redis中所有key都获取到,这个操作是非常危险的,因为可能一下获取到太多的key,阻塞redis服务器。要想很好的获取到所有的key,又不想出现卡死的情况,就可以…

基于单片机的速度里程表设计(论文+源码)

1 系统方案 本次智能速度里程表的总体架构如图2-1所示,在硬件上包括了STC89C52单片机,电机,显示模块,报警模块,DS1302时钟模块,超速检测模块,按键等等。在软件设计功能的功能上,按下…

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)

Dify部署参考:Dify Rag部署并集成在线Deepseek教程(Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装) DifyDeepSeek - Excel数据一键可视化(创建步骤案例)-DSL工程文件(可直接导入&#x…

安装与配置 STK-MATLAB 接口

STK版本为11.6 Matlab版本为R2018a STK 提供 Connect 和 Object Model (COM) 两种接口与 MATLAB 交互,推荐使用 COM接口进行二次开发。 确保安装了 STK,并且 MATLAB 可以访问 STK Object Model。 在 MATLAB 中运行: % 添加 STK COM 库&#…

计算机二级MS之PPT

声明:跟着大猫和小黑学习随便记下一些笔记供大家参考,二级考试之前将持续更新,希望大家二级都能轻轻松松过啦,过了二级的大神也可以在评论区留言给点建议,感谢大家!! 文章目录 考题难点1cm25px…

python中采用opencv作常规的图片处理的方法~~~

在python中,我们经常会需要对图片做灰度/二值化/模糊等处理,这时候opencv就是我们的好帮手了,下面我来介绍一下相关用法: 首先,需要安装opencv-python库: 然后,在你的代码中引用: import cv2 最后就是代码了&#x…

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…

Redis数据结构,渐进式遍历,数据库管理

1.Redis的其他数据结构 前面我们主要讲述了Redis中比较常用的集中数据结构String,List,Hash,Set,Zset,但这并不代表Redis只用这几种数据结构还有如Streams,Geospatial,Hyperloglog,…

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程

记录工作实践 这是全新的系列,一直有个游戏制作梦 感谢AI时代,让这一切变得可行 长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…

LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

vs2019中属性设置 报错: vs2019中属性设置为 报错: 设置为 报错: 设置为 报错: 原因:是由于ncnn和paddleLite的库同时使用会冲突。只能用其中之一。 后面部署降lite都换成了ncnn就可以了。 要么都用ncnn&a…

SpringBoot校园管理系统设计与实现

在现代校园管理中,一个高效、灵活的管理系统是不可或缺的。本文将详细介绍基于SpringBoot的校园管理系统的设计与实现,涵盖管理员、用户和院校管理员三大功能模块,以及系统的部署步骤和数据库配置。 管理员功能模块 管理员是系统的核心管理…

[QT]开发全解析:从概念到实战

文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…

【pyqt】(十二)文本框

控件-文本框 文本框主要有两类,为富文本框(QTextEdit)和纯文本框(QPlainTextEdit),在学习新的控件的时候, 需要掌握的内容主要除了属性之外,其信号触发方法也非常重要。还可以利用Designer来辅助我们进行学习,尤其是利…

汽车免拆诊断案例 | 2023款丰田雷凌汽油版车行驶中偶尔出现通信故障

故障现象  一辆2023款丰田雷凌汽油版车,搭载1.5 L发动机,累计行驶里程约为4700 km。车主反映,行驶中偶尔组合仪表上的发动机转速信号丢失,转向变重,且有“闯车”感,同时车辆故障警报蜂鸣器鸣响。 故障诊断…

关于OceanBase与CDH适配的经验分享

CDH是Cloudera早期推出的一个开源平台版本,它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台,专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目,Cloudera构建了一个功能…

基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践

近年来,随着国产AI芯片的日益崛起,基于国产AI芯片的模型适配、性能优化以及应用落地是国产AI应用的一道重要关卡。如何在复杂的京东零售业务场景下更好地使用国产AI芯片,并保障算力安全,是目前亟需解决的问题。对此,京…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

Linux和gcc/g++常用命令总结

目录 Linux命令总结 文件操作相关命令 ls cd pwd cp mv rm cat mkdir rmdir touch 文本处理操作命令 grep awk sed 进程管理操作相关命令 ps top htop kill pkill killall chmod chown 网络操作相关命令 ping ifconfig netstat ss lsof curl …

Sqoop从入门到使用

安装和配置 修改文件配置&#xff1a;修改文件名将&#xff08;sqoop-env-template.sh改为sqoop-env.sh&#xff09; 编辑sqoop-env.sh内部文本&#xff0c;修改调用文件位置 将sqoop-env.sh&#xff0c;配置到全局变量中&#xff0c;方便调用。 查看正常运用 第一类&#xff1…