微软AutoGen高级功能——Memory

news2025/3/14 0:59:04

介绍

大家好,博主又来给大家分享知识了。这次又要给大家分享什么呢?哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能:Memory。在微软AutoGen中,Memory(记忆)是一个重要概念,它主要用于存储和管理智能体之间交互的历史信息,有助于智能体在对话和协作过程中参考过往内容,以更智能地推进任务。那我们直接进入正题。

Memory

在几种用例中,维护一个有用事实的存储库是很有价值的,这些事实能在特定步骤即将开始前被智能地添加到智能体的上下文中。这里的典型用例是检索增强生成(RAG)模式,在这种模式下,一个查询被用于从数据库中检索相关信息,然后这些信息会被添加到智能体的上下文中。

AgentChat提供了一种记忆协议,该协议可以进行扩展以实现这一功能。其关键方法包括查询(query)、更新上下文(update_context)、添加(add)、清除(clear)和关闭(close)。

  • 添加(add):向记忆存储中添加新的条目。
  • 查询(query):从记忆存储中检索相关信息。
  • 更新上下文(update_context):通过添加检索到的信息来改变智能体的内部模型上下文(在助理智能体类中使用)。
  • 清除(clear):从记忆存储中清除所有条目。
  • 关闭(close):清理记忆存储所使用的任何资源。

ListMemory示例

Pythonautogen_core.memory.ListMemory作为Pythonautogen_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

自定义记忆存储(向量数据库等)

我们可以基于记忆协议来实现更复杂的记忆存储方式。例如,我们可以实现一个自定义的记忆存储系统,利用向量数据库来存储和检索信息,或者创建一个使用机器学习模型的记忆存储系统,以便根据用户的偏好等生成个性化的回复。

具体来说,我们需要重载addqueryupdate_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]:
        pass

    async def update_context(self, agent: ChatCompletionContext) -> UpdateContextResult:
        pass

    async 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框架中,MemoryManaging State机制在功能和应用场景上存在一些区别。

Memory

  1. 功能特性:Memory主要用于存储和检索与交互过程相关的信息,它提供了一种结构化的方式来保存历史对话、用户偏好、任务相关的上下文等内容。通过记忆功能,智能体可以参考之前的交互信息,从而在后续的对话或任务处理中提供更连贯、更符合上下文的回复。例如,用户在之前的对话中提到了自己喜欢的食物类型(如素食),记忆模块可以存储这个信息,当后续询问关于餐食推荐的问题时,智能体能够从记忆中检索到该信息并据此给出合适的建议。
  2. 接口和方法:Memory通常定义了一系列接口和方法,如add(添加记忆条目)、query(根据特定条件检索记忆条目)、update_context(将检索到的记忆信息更新到智能体的上下文)等。这些方法使得开发者可以方便地操作记忆存储,实现对记忆数据的管理和利用。比如,通过add方法可以将新的用户输入或重要信息添加到记忆中,query方法则可以根据关键词或其他条件从记忆中查找相关的历史记录。
  3. 应用场景:主要应用于多轮对话场景,帮助智能体维护对话的上下文连贯性,提升对话质量;也适用于需要记住用户特定偏好、设置等信息的场景,以便为用户提供个性化的服务。例如在智能客服系统中,记忆功能可以记录用户之前反馈的问题和解决方案,当用户再次咨询类似问题时,客服智能体能够快速给出准确的答复。

Managing State

  1. 功能特性:Managing State机制更侧重于管理智能体在执行任务过程中的整体状态信息。这包括任务的当前阶段、已经执行的操作、任务的目标和约束条件等。它关注的是智能体在处理复杂任务时的状态流转和协调,确保智能体能够按照正确的流程和逻辑完成任务。例如,在一个涉及多个步骤的任务(如策划一次旅行,包括选择目的地、预订机票、酒店等步骤)中,管理状态机制会记录每个步骤的完成情况和相关的状态信息,以便智能体能够合理地推进后续操作。
  2. 实现方式:管理状态可能涉及到状态机、状态变量的维护和更新等技术手段。通过定义不同的状态和状态转换规则,智能体可以根据当前的任务状态决定下一步的行动。例如,当智能体处于 “预订机票” 的状态时,它会执行与机票预订相关的操作,如查询航班信息、选择合适的航班等,并在预订成功后更新状态为 “机票已预订”。
  3. 应用场景:主要应用于复杂任务的执行和管理,如工作流自动化、多步骤问题解决等场景。在这些场景中,智能体需要根据不同的状态来协调多个子任务的执行,确保任务能够顺利完成。例如在一个项目管理智能体中,管理状态机制可以跟踪项目的各个阶段(如规划、执行、监控等),并根据项目状态做出相应的决策和调整。

综上所述,Memory主要聚焦于存储和利用交互历史和上下文信息,而Managing State更关注智能体在任务执行过程中的状态管理和协调,两者在AutoGen中分别承担着不同但又相互关联的重要角色,共同支持智能体的高效运行和复杂任务处理。

通过本次分享,大家有所收获吗?请大家多去大胆的尝试和使用。博主还是那句话:成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。这次分享就到这,如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。

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

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

相关文章

【Java 面试 八股文】Spring Cloud 篇

Spring Cloud 篇 1. Spring Cloud 5大组件有哪些&#xff1f;2. 服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册发现&#xff1f;3. 我看你之前也用过nacos&#xff0c;你能说下nacos与eureka的区别&#xff1f;4. 你们项目负载均衡如何实现的&#xff1f…

Esxi8.0设置nvidia显卡直通安装最新驱动

ESXI8.0设置显卡直通 在某些情况下&#xff0c;我们需要多次切换操作系统&#xff0c;以测试软件是否适用于特定系统和环境&#xff0c;减少多次重装系统的麻烦 ESXI8.0安装包 通过网盘分享的文件&#xff1a;ESXi-8.0U2-22380479-USB-NVME-集成网卡镜像.iso 链接: https://…

LabVIEW袜品压力测试系统

开发了一种基于LabVIEW开发的袜品压力测试系统。该系统利用LabVIEW并结合灵敏的传感器和高精度的处理模块&#xff0c;实现了对袜品压力的精确测量和分析。系统不同于传统的服装压力测试方法&#xff0c;为研究和评价袜子的舒适性提供了新的测试手段。 ​ 项目背景 该系统的…

TestHubo基础教程-创建项目

TestHubo是一款国产开源一站式测试工具&#xff0c;涵盖功能测试、接口测试、性能测试&#xff0c;以及 Web 和 App 测试&#xff0c;可以满足不同类型项目的测试需求。本文将介绍如何快速创建第一个项目&#xff0c;以快速入门上手。 1、创建项目 在 TestHubo 中&#xff0c;…

深度求索—DeepSeek API的简单调用(Java)

DeepSeek简介 DeepSeek&#xff08;深度求索&#xff09;是由中国人工智能公司深度求索&#xff08;DeepSeek Inc.&#xff09;研发的大规模语言模型&#xff08;LLM&#xff09;&#xff0c;专注于提供高效、智能的自然语言处理能力&#xff0c;支持多种场景下的文本生成、对…

企业使用统一终端管理(UEM)工具提高端点安全性

什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法&#xff0c;包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台&#xff0c;用于跨所有作系统和设备类型部署、配置、管理和…

爱彼(Audemars Piguet):瑞士制表艺术的巅峰之作(中英双语)

爱彼&#xff08;Audemars Piguet&#xff09;&#xff1a;瑞士制表艺术的巅峰之作 在瑞士高级制表界&#xff0c;Audemars Piguet&#xff08;爱彼&#xff09; 以其大胆创新、卓越工艺和独立家族经营的传统&#xff0c;成为世界顶级腕表品牌之一。作为瑞士“三大制表品牌”之…

1134. 国王的魔镜

题目 AC代码 #include<bits/stdc.h> using namespace std; bool hw(char s[]) {bool rtrue;int i;for(i0;i<strlen(s)/2;i){if(s[i]!s[strlen(s)-i-1]){rfalse;break;}}return r; } int main() {char s[1005];gets(s);while(hw(s)true&&strlen(s)%20){s[strl…

浅说树形dp

文章目录 前言树形dp的转移方式树形dp的使用的场景小结 初步感知——简单的树形dp例题1例题2 深入分析——树形dp的经典模型最大独立集最小点覆盖最小支配集树上直径 前言 因为树的形式非常适合递归&#xff0c;他所带来的访问顺序也是非常符合拓扑排序的&#xff0c;故而在处…

使用Charles进行mock请求

在 Charles 中&#xff0c;“Compose”&#xff08;构建请求&#xff09;功能允许你手动创建和发送 HTTP 或 HTTPS 请求&#xff0c;方便进行 API 测试、调试等操作。以下是 Compose 功能的详细使用方式&#xff1a; 1. 打开 Compose 界面 启动 Charles 后&#xff0c;在菜单…

RAMinit 程序编译运行考古记录

本科的时候浅浅研究了DOSBox&#xff0c;今天看到网上挺多关于雷军代码的新闻&#xff0c;我把雷军代码在web上编译出来了&#xff0c;但是我是业余选手&#xff0c;所以做得比较差&#xff0c;不过大家感兴趣可以关注我的dosplay项目&#xff0c;旨在利用js-dos实现汇编语言在…

【Pico】使用Pico进行无线串流搜索不到电脑

使用Pico进行无线串流搜索不到电脑 官串方式&#xff1a;使用Pico互联连接电脑。 故障排查 以下来自官方文档 请按照以下步骡排除故障&#xff1a; 确认电脑和一体机连接了相同的路由器WiFi网络(相同网段) IP地址通常为192.168.XX&#xff0c;若两设备的IP地址前三段相同&…

Golang Model 字段自动化校验设计

背景 在我们日常开发中&#xff0c;不可避免的总要去进行各种参数校验&#xff0c;但是如果在某个场景中&#xff0c;要校验的字段非常多&#xff0c;并且在其中还有耦合关系&#xff0c;那么我们手写校验逻辑就变得非常的低效且难以维护。本篇文档就基于 DDD 领域模型设计的思…

移动端测试的挑战与解决方案:兼容性、网络问题及实战策略

引言 移动应用已成为用户触达服务的核心入口,但移动端测试面临设备多样性、网络波动、用户场景复杂等多重挑战。据Statista统计,2023年全球活跃移动设备超180亿台,操作系统(Android/iOS)版本碎片化率超30%,这对测试工程师提出了极高要求。本文深度解析移动端测试的核心痛…

Spring安装和使用(Eclipse环境)

一、Spring框架概述 1、 什么是Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复…

图论- Dijkstra算法

Dijkstra算法 前言概念BFS基础模版DijkstraDijkstra函数签名State类distTo 记录最短路径伪代码模版第一个问题解答第二个问题解答第三个问题解答 前言 学习这个算法之间,必须要对BFS遍历比较熟悉,它的本质就是一个特殊改造过的BFS算法. 概念 Dijkstra算法是一种计算图中单源…

CAS单点登录(第7版)9.属性

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 属性 属性定义 概述 属性定义 从身份验证或属性存储库源获取和解析 CAS 中属性的定义时&#xff0c;往往使用其名称进行定义和引用&#xff0c;而无需任何其他元数据或修饰。例如&#…

【电路笔记】-双向计数器

双向计数器 文章目录 双向计数器1、概述2、双向计数器双向计数器能够通过任何给定的计数序列向上或向下方向计数。 1、概述 双向计数器是同步向上/向下二进制计数器,能够在两个方向上向或从某个预设值以及零进行计数。 除了从零开始“向上”计数并增加或递增到某个预设值之外…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网&#xff0c;https://www.deepseek.com/ 点击左侧“API Keys”&#xff0c;创建API key&#xff0c;输出名称为“AI” 点击“创建"&#xff0c;将API key保存&#xff0c;复制在其它地方。 在PyCharm中下…

从ARM官方获取自己想要的gcc交叉编译工具链接(Arm GNU Toolchain),并在Ubuntu系统中进行配置

前言 本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 的分支博文。 在本博文中我们完成gcc交叉编译工具gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz的下载、配置、测试。 下载自己想要的gcc交叉编译工具的源码 目标文件的名字及说…