微软AutoGen高级功能——Memory
介绍
大家好,博主又来给大家分享知识了。这次又要给大家分享什么呢?哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能:Memory。在微软AutoGen中,Memory(记忆)是一个重要概念,它主要用于存储和管理智能体之间交互的历史信息,有助于智能体在对话和协作过程中参考过往内容,以更智能地推进任务。那我们直接进入正题。
Memory
在几种用例中,维护一个有用事实的存储库是很有价值的,这些事实能在特定步骤即将开始前被智能地添加到智能体的上下文中。这里的典型用例是检索增强生成(RAG)模式,在这种模式下,一个查询被用于从数据库中检索相关信息,然后这些信息会被添加到智能体的上下文中。
AgentChat提供了一种记忆协议,该协议可以进行扩展以实现这一功能。其关键方法包括查询(query)、更新上下文(update_context)、添加(add)、清除(clear)和关闭(close)。
- 添加(add):向记忆存储中添加新的条目。
- 查询(query):从记忆存储中检索相关信息。
- 更新上下文(update_context):通过添加检索到的信息来改变智能体的内部模型上下文(在助理智能体类中使用)。
- 清除(clear):从记忆存储中清除所有条目。
- 关闭(close):清理记忆存储所使用的任何资源。
ListMemory示例
Python类autogen_core.memory.ListMemory作为Python类autogen_core.memory.Memory协议的一个示例实现被提供。它是一个基于简单列表的记忆实现方式,按时间顺序保存记忆内容,将最新的记忆添加到模型的上下文中。这种实现方式设计得简单直接且具有可预测性,便于理解和调试。我们通过一个示例来演示,我们将使用ListMemory来维护一个用户偏好的记忆库,并展示随着时间推移,它如何被用来为智能体的回复提供一致的上下文信息。
完整代码
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType
from autogen_ext.models.openai import OpenAIChatCompletionClient# 初始化用户记忆
user_memory = ListMemory()async def get_weather(city: str, units: str = "imperial") -> str:if units == "imperial":return f"The weather in {city} is 73 °F and Sunny."elif units == "metric":return f"The weather in {city} is 23 °C and Sunny."else:return f"Sorry, I don't know the weather in {city}."async def run_stream() -> None:# 将用户偏好添加到记忆中await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))assistant_agent = AssistantAgent(name="assistant_agent",model_client=OpenAIChatCompletionClient(model="gpt-4o",),tools=[get_weather],memory=[user_memory],)stream = assistant_agent.run_stream(task="What is the weather in Beijing?")await Console(stream)asyncio.run(run_stream())
运行结果
---------- user ----------
What is the weather in Beijing?
---------- assistant_agent ----------
[MemoryContent(content='The weather should be in metric units', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None), MemoryContent(content='Meal recipe must be vegan', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None)]
---------- assistant_agent ----------
[FunctionCall(id='call_pHq4p89gW6oGjGr3VsVETCYX', arguments='{"city":"Beijing","units":"metric"}', name='get_weather')]
---------- assistant_agent ----------
[FunctionExecutionResult(content='The weather in Beijing is 23 °C and Sunny.', call_id='call_pHq4p89gW6oGjGr3VsVETCYX')]
---------- assistant_agent ----------
The weather in Beijing is 23 °C and Sunny.进程已结束,退出代码为 0
我们可以查看发现,assistant_agent的模型上下文实际上已用检索到的记忆条目进行了更新。transform方法被用于将检索到的记忆条目格式化为可供智能体使用的字符串。在这种情况下,我们只是简单地将每个记忆条目的内容连接成一个单一的字符串。
从上述内容我们可以看到,正如用户偏好中所要求的那样,天气信息是以摄氏度为单位返回的。
同样地,假设我们另外提出一个关于制定一份餐食计划的问题,智能体能够从记忆存储中检索到相关信息,并给出个性化的回复。
完整代码
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType
from autogen_ext.models.openai import OpenAIChatCompletionClient# 初始化用户记忆
user_memory = ListMemory()async def get_weather(city: str, units: str = "imperial") -> str:if units == "imperial":return f"The weather in {city} is 73 °F and Sunny."elif units == "metric":return f"The weather in {city} is 23 °C and Sunny."else:return f"Sorry, I don't know the weather in {city}."async def run_stream() -> None:# 将用户偏好添加到记忆中await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))assistant_agent = AssistantAgent(name="assistant_agent",model_client=OpenAIChatCompletionClient(model="gpt-4o",),tools=[get_weather],memory=[user_memory],)await assistant_agent._model_context.get_messages()stream = assistant_agent.run_stream(task="Write brief meal recipe with broth")await Console(stream)asyncio.run(run_stream())
运行结果
---------- user ----------
Write brief meal recipe with broth
---------- assistant_agent ----------
[MemoryContent(content='The weather should be in metric units', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None), MemoryContent(content='Meal recipe must be vegan', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None)]
---------- assistant_agent ----------
Here's a simple vegan meal recipe using broth:**Vegan Vegetable Soup****Ingredients:**
- 1 liter vegetable broth
- 1 cup chopped carrots
- 1 cup chopped celery
- 1 cup diced tomatoes
- 1 cup chopped zucchini
- 1 cup cooked chickpeas (optional)
- 2 cloves garlic, minced
- 1 tablespoon olive oil
- Salt and pepper to taste
- Fresh parsley for garnish**Instructions:**
1. Heat olive oil in a large pot over medium heat.
2. Add minced garlic and sauté until fragrant (about 1 minute).
3. Add carrots, celery, zucchini, and diced tomatoes to the pot. Stir and cook for 5 minutes.
4. Pour in the vegetable broth and bring it to a boil.
5. Lower the heat and let the soup simmer for 20–25 minutes, until the vegetables are tender.
6. Add cooked chickpeas (if using), and season with salt and pepper.
7. Garnish with fresh parsley before serving. Enjoy your warm vegan vegetable soup! TERMINATE进程已结束,退出代码为 0
自定义记忆存储(向量数据库等)
我们可以基于记忆协议来实现更复杂的记忆存储方式。例如,我们可以实现一个自定义的记忆存储系统,利用向量数据库来存储和检索信息,或者创建一个使用机器学习模型的记忆存储系统,以便根据用户的偏好等生成个性化的回复。
具体来说,我们需要重载add、query和update_context方法,以实现所需的功能,并将记忆存储传递给你的智能体。
完整代码
import asyncio
from typing import Any
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core import CancellationToken
from autogen_core.memory import Memory, MemoryContent, MemoryMimeType, UpdateContextResult
from autogen_core.model_context import ChatCompletionContext
from autogen_ext.models.openai import OpenAIChatCompletionClient# 自定义记忆存储类
class CustomMemory(Memory):def __init__(self):self.memory_store = []async def add(self, entry: MemoryContent, cancellation_token: CancellationToken | None = None) -> None:self.memory_store.append(entry)print(f"Added entry: {entry.content}")async def query(self, query_str: str | MemoryContent, cancellation_token: CancellationToken | None = None,**kwargs: Any) -> list[Any]:passasync def update_context(self, agent: ChatCompletionContext) -> UpdateContextResult:passasync def clear(self):self.memory_store = []print("Memory store cleared")async def close(self):print("Memory store closed")async def get_weather(city: str, units: str = "imperial") -> str:if units == "imperial":return f"The weather in {city} is 73 °F and Sunny."elif units == "metric":return f"The weather in {city} is 23 °C and Sunny."else:return f"Sorry, I don't know the weather in {city}."async def run_stream() -> None:# 初始化自定义用户记忆user_memory = CustomMemory()# 将用户偏好添加到记忆中await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))assistant_agent = AssistantAgent(name="assistant_agent",model_client=OpenAIChatCompletionClient(model="gpt-4o",),tools=[get_weather],memory=[user_memory],)await assistant_agent._model_context.get_messages()stream = assistant_agent.run_stream(task="Write brief meal recipe with broth")await Console(stream)asyncio.run(run_stream())
运行结果
Added entry: The weather should be in metric units
Added entry: Meal recipe must be vegan
---------- user ----------
Write brief meal recipe with broth
---------- assistant_agent ----------
**Chicken Broth Soup****Ingredients:**
- 4 cups chicken broth
- 1 cup shredded cooked chicken
- 1 cup chopped vegetables (carrots, celery, peas)
- 1/2 cup small pasta or rice
- 1-2 garlic cloves (minced)
- Salt and pepper to taste
- 1 tbsp olive oil**Instructions:**
1. In a pot, heat olive oil over medium heat and sauté garlic until fragrant.
2. Add vegetables and cook for 2-3 minutes.
3. Pour in chicken broth and bring to a boil.
4. Add pasta or rice and cook according to package directions.
5. Stir in shredded chicken, season with salt and pepper, and simmer for 5-10 minutes.
6. Serve hot and enjoy!TERMINATE进程已结束,退出代码为 0
说明
如果大家在运行上述代码的时候有AutoGen相关的提示或报错(例如:该参数不存在,没有此类方法等),请尝试更新一下AutoGen,博主在分享这篇博文的时候,AutoGen的版本是0.4.6稳定版。
安装或更新命令
pip install -U "autogen-agentchat" "autogen-ext[openai,azure]"
另外大家要根据业务需求,设置使用的LLM,不一定要按照我给大家分享代码中的设置来,如果只是为了测试并看运行结果可直接复制粘贴代码(完整代码)。
结束
好了,以上就是本次分享的全部内容,细心的小伙伴可能会发现该功能有点类似于之前博主给大家分享的Managing State(管理状态)机制。那么它们二者之间的区别是什么呢?博主在这里给大家整理如下:
在微软的AutoGen框架中,Memory和Managing State机制在功能和应用场景上存在一些区别。
Memory
- 功能特性:Memory主要用于存储和检索与交互过程相关的信息,它提供了一种结构化的方式来保存历史对话、用户偏好、任务相关的上下文等内容。通过记忆功能,智能体可以参考之前的交互信息,从而在后续的对话或任务处理中提供更连贯、更符合上下文的回复。例如,用户在之前的对话中提到了自己喜欢的食物类型(如素食),记忆模块可以存储这个信息,当后续询问关于餐食推荐的问题时,智能体能够从记忆中检索到该信息并据此给出合适的建议。
- 接口和方法:Memory通常定义了一系列接口和方法,如add(添加记忆条目)、query(根据特定条件检索记忆条目)、update_context(将检索到的记忆信息更新到智能体的上下文)等。这些方法使得开发者可以方便地操作记忆存储,实现对记忆数据的管理和利用。比如,通过add方法可以将新的用户输入或重要信息添加到记忆中,query方法则可以根据关键词或其他条件从记忆中查找相关的历史记录。
- 应用场景:主要应用于多轮对话场景,帮助智能体维护对话的上下文连贯性,提升对话质量;也适用于需要记住用户特定偏好、设置等信息的场景,以便为用户提供个性化的服务。例如在智能客服系统中,记忆功能可以记录用户之前反馈的问题和解决方案,当用户再次咨询类似问题时,客服智能体能够快速给出准确的答复。
Managing State
- 功能特性:Managing State机制更侧重于管理智能体在执行任务过程中的整体状态信息。这包括任务的当前阶段、已经执行的操作、任务的目标和约束条件等。它关注的是智能体在处理复杂任务时的状态流转和协调,确保智能体能够按照正确的流程和逻辑完成任务。例如,在一个涉及多个步骤的任务(如策划一次旅行,包括选择目的地、预订机票、酒店等步骤)中,管理状态机制会记录每个步骤的完成情况和相关的状态信息,以便智能体能够合理地推进后续操作。
- 实现方式:管理状态可能涉及到状态机、状态变量的维护和更新等技术手段。通过定义不同的状态和状态转换规则,智能体可以根据当前的任务状态决定下一步的行动。例如,当智能体处于 “预订机票” 的状态时,它会执行与机票预订相关的操作,如查询航班信息、选择合适的航班等,并在预订成功后更新状态为 “机票已预订”。
- 应用场景:主要应用于复杂任务的执行和管理,如工作流自动化、多步骤问题解决等场景。在这些场景中,智能体需要根据不同的状态来协调多个子任务的执行,确保任务能够顺利完成。例如在一个项目管理智能体中,管理状态机制可以跟踪项目的各个阶段(如规划、执行、监控等),并根据项目状态做出相应的决策和调整。
综上所述,Memory主要聚焦于存储和利用交互历史和上下文信息,而Managing State更关注智能体在任务执行过程中的状态管理和协调,两者在AutoGen中分别承担着不同但又相互关联的重要角色,共同支持智能体的高效运行和复杂任务处理。
通过本次分享,大家有所收获吗?请大家多去大胆的尝试和使用。博主还是那句话:成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。这次分享就到这,如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。
相关文章:
微软AutoGen高级功能——Memory
介绍 大家好,博主又来给大家分享知识了。这次又要给大家分享什么呢?哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能:Memory。在微软AutoGen中,Memory(记忆)是一个重要概念,它主要用于存储和管理智能体…...
【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导
目录 1 自定义组件混用场景指导 1.1 概述 1.2 状态管理装饰器总览 状态管理V1的装饰器 状态管理V2的装饰器 状态管理装饰器支持的数据类型总览 1.3 限制条件 1.3.1 V1和V2的装饰器不允许混用 1.V1的自定义组件中不可以使用V2的装饰器 2.V2的自定义组件…...
轮子项目--消息队列的实现(3)
上一篇文章中我把一些关键的类以及表示出来,如何对这些类对应的对象进行管理呢?管理分为硬盘和内存上,硬盘又分为数据库(管理交换机,队列和绑定)和文件(管理消息),本文就…...
一文深入了解DeepSeek-R1:模型架构
本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...
秘密信息嵌入到RGB通道的方式:分段嵌or完整嵌入各通道
目录 1. 将秘密信息分为三部分的理由 (1)均匀分布负载 (2)提高鲁棒性 (3)容量分配 2. 不将秘密信息分为三部分的情况 (1)嵌入容量 (2)视觉质量 &#…...
Ai人工智能的未来:趋势、挑战与机遇
Ai人工智能的未来:趋势、挑战与机遇 引言 人工智能(AI)已经成为当代科技发展的核心驱动力,其影响力渗透到各个行业,并塑造了我们未来的社会结构。无论是在医疗、金融、制造业,还是在自动驾驶、智能客服、…...
理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口
在 WebGPU 开发中, GPUDevice 是一个至关重要的对象,它是与 GPU 进行交互的核心接口。通过 GPUDevice ,开发者可以创建和管理 GPU 资源(如缓冲区、纹理、管线等),并提交命令缓冲区以执行渲染和计算任…...
Java 设计模式之桥接模式
文章目录 Java 设计模式之桥接模式概述UML代码实现 Java 设计模式之桥接模式 概述 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过桥接模式,可以避免类爆炸问题,并提高系统的可扩展性。 UML 核心…...
机器学习(李宏毅)——GAN
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 不得不说GAN真是博大精深! 二、大纲 GAN问世基本思想原理剖析Tips of GANGAN的应用Cycle GANEva…...
QT无弹窗运行和只允许运行一个exe
最近做一个小功能,需要后台运行QT程序,无弹窗,并且只允许一个exe运行,不关闭程序,无法2次启动。 main.cpp #include "deleteshotcurveflie.h" #include <QApplication> #include <QSharedMemory&…...
C++ STL 容器
C 的 STL(Standard Template Library) 提供了多种容器,分为以下几类: 序列容器(Sequence Containers)关联容器(Associative Containers)无序关联容器(Unordered Associa…...
开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码
工业物联网的机遇与挑战:为什么企业需要Odoo? 《中国智能制造发展研究报告2023》指出,85%的制造企业已启动数字化转型,但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备,而定…...
CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display
核心逻辑 // 获取 URL 查询参数的值 function getQueryParam(param) { // 使用 URLSearchParams 从 URL 查询字符串中提取参数 const urlParams new URLSearchParams(window.location.search); // 返回查询参数的值 return urlParams.get(param); } // 使用 DOMPuri…...
K8s组件
一、Kubernetes 集群架构组件 K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点,master节点上有 apis…...
python面试题
以下是一些Python面试题: 一、基础语法 Python中的列表(list)和元组(tuple)有什么区别? 答案: 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。语法:列表使用方括号[]定义,元组使用圆括号()定义(单个元素的元组…...
AOS安装及操作演示
文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...
蓝桥杯单片机组第十三届初赛试题-程序题(第2批)
题目到官网看即可,有点久了有些细节记不清了,可能以前发的帖子解释详细一点。 这是我单片机初学的时候写的,像代码结构什么的肯定有可以提升的地方,多多包涵,将就看一下。 i2c文件使用官方的,pcf8591函数…...
企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略
一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...
Python Pandas(11):Pandas 数据可视化
数据可视化是数据分析中的重要环节,它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式,数据可视化将复杂的数字和统计信息转化为易于理解的图像,从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...
【练习】图论
F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
