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

这篇文章瞄准的是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 部分,革命尚未成功,同志仍需努力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Compose Multiplatform+Kotlin Multiplatfrom 第四弹跨平台

文章目录 引言功能效果开发准备依赖使用gradle依赖库MVIFlow设计富文本显示 总结 引言 Compose Multiplatformkotlin Multiplatfrom 今天已经到compose v1.7.3,从界面UI框架上实战开发看,很多api都去掉实验性注解,表示稳定使用了!…

[Java基础-线程篇]7_线程设计模式与总结

摘要:懒汉单例模式怎么变得线程安全?Master-Worker归并模式,工作窃取算法。Java线程相关源码使用了什么设计模式? 资料引用:《Java高并发核心编程卷2》 目录 线程安全的单例模式 Master-Worker模式 工作窃取算法 …

Kubermetes 部署mysql pod

步骤 1: 创建 PersistentVolume 和 PersistentVolumeClaim 首先为 MySQL 创建一个 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来确保数据的持久性。 mysql-pv.yaml: apiVersion: v1 kind: PersistentVolume metadata:name: mysql-pv-volume spec:cap…

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】

在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…

交叉编译openssl及curl

操作环境:Ubuntu20.04 IDE工具:Clion2020.2 curl下载地址:https://curl.se/download/ openssl下载地址:https://openssl-library.org/source/old/index.html 直接交叉编译curl会报错找不到openssl,所以需要先交叉编…

在笔记本电脑上用DeepSeek搭建个人知识库

最近DeepSeek爆火,试用DeepSeek的企业和个人越来越多。最常见的应用场景就是知识库和知识问答。所以本人也试用了一下,在笔记本电脑上部署DeepSeek并使用开源工具搭建一套知识库,实现完全在本地环境下使用本地文档搭建个人知识库。操作过程共…

HarmonyOS 应用程序包结构 (发布态)

每个应用中至少包含一个.hap文件,可能包含若干个.hsp文件、也可能不含,一个应用中的所有.hap与.hsp文件合在一起称为Bundle,其对应的bundleName是应用的唯一标识(详见app.json5配置文件中的bundleName标签)。 当应用发…

idea中的查看git历史记录,不显示详细信息

一、正常情况显示 1、idea中git查看history正常显示如下图: 二、非正常情况下显示 1、idea中git查看history,现在不显示提交的历史文件详细信息,如下图: 三、解决方式 1、找到如下窗口中画红色框的黑色线条,鼠标放在…

江科大51单片机笔记【9】DS1302时钟可调时钟(下)

在写代码前,记得把上一节的跳线帽给插回去,不然LCD无法显示 一.DS1302时钟 1.编写DS1302.c文件 (1)重新对端口定义名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;(2)初始化 因为…

数学建模笔记——层次分析法(AHP)

本文借鉴了数学建模清风老师的视频和课件,如有错误欢迎大家批评指正。原视频地址:清风数学建模:https://www.bilibili.com/video/BV1DW411s7wihttps://www.bilibili.com/video/BV1DW411s7wi 1.预备知识 层次分析法: 层次分析法(The Analytic Hierarchy Process,AHP)是一…

阿里云扩容操作步骤

在快照中备份服务器快照,时间为1天 进入块存储模块进行扩容 付款完成后进入账单进行查询,确认成功后找售后确认挂载盘情况 [rootatcoin ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs…

【系统架构设计师】以数据为中心的体系结构风格

目录 1. 说明2. 仓库体系结构风格3. 黑板体系结构风格 1. 说明 1.以数据为中心的体系结构风格主要包括仓库体系结构风格和黑板体系结构风格。 2. 仓库体系结构风格 1.仓库(Repository)是存储和维护数据的中心场所。2.在仓库风格中,有两种不…

llamafactory大模型微调教程(周易大模型案例)

1.环境说明 操作系统:ubuntu 20 基础模型:Qwen2.5-1.5B-Instruct 工具:llamafactory GPU:四张4090 2、环境部署 2.1 下载基础模型 # 1、下载 modelscope pip install modelscope#2、模型下载 cd /data/ cat >> download…

go切片定义和初始化

1.简介 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。切片的使用和数组类似,遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的,因此切片是一个可以动态变化的数…

2025年03月07日Github流行趋势

项目名称:ai-hedge-fund 项目地址url:https://github.com/virattt/ai-hedge-fund项目语言:Python历史star数:12788今日star数:975项目维护者:virattt, seungwonme, KittatamSaisaard, andorsk, arsaboo项目…

蓝桥杯每日一题:第一周周四哞叫时间

蓝桥杯每日一题:第一周周四哞叫时间 疑惑:如何把复杂度控制在Q(n),怎么枚举a和b,longlong的形式又该怎么输入(考虑用string) 思路:枚举倒数第二个b前面有多少个a 这是一…

常见排序算法鉴赏(原理剖析+动图演示)

目录 一、冒泡排序(BubbleSort) 二、选择排序( SelectSort) 三、插入排序(InsertSort) 四、希尔排序(ShellSort) 五、堆排序 六、快排(QuickSort) Hoa…

易基因特异性R-loop检测整体研究方案

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 01.技术简述 R-loop是由DNA:RNA 杂交体和被置换的单链DNA组成的三链核酸结构,广泛参与基因转录、表观遗传调控及DNA修复等关键生物学过程。异常的R-loop积累会导致基因组不稳…

用低代码平台集成人工智能:无需专业开发也能实现智能化

引言:人工智能的普及与企业需求 随着人工智能(AI)技术的飞速发展,越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持,从数据分析到个性化推荐&#x…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件: uniapp-v8-release.aar 2.提供uniapp调用的接口,新建类文件继承UniModule, package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…