探索智能体的记忆:类型、策略和应用

AI Agent 中的记忆:类型、策略和应用

记忆实现是使智能体能够保持上下文、从过去的交互中学习并做出明智决策的关键组成部分。与人类记忆非常相似,智能体记忆允许 AI 系统随时间存储、检索和利用信息,从而为用户创造更连贯和个性化的体验。

Agent 记忆的不同类型

AI Agent 中的记忆系统可以根据两个关键维度进行分类:时间范围(信息保留多长时间)和可访问性范围(谁可以访问信息)。

时间分类

短期记忆

短期记忆侧重于在对话或任务中维持即时上下文:

  • 对话记忆:存储对话历史,允许 Agent 引用先前的消息并保持对话的连贯性。这对于自然的交互至关重要,因为早期交流的上下文会影响后续的响应。

  • 缓冲区记忆:在定义的时间窗口内管理最近的交互,对于多轮推理任务尤其有用。当函数调用依赖于先前操作的结果,形成依赖推理步骤链时,这种类型的记忆变得至关重要。

长期记忆

长期记忆支持跨不同会话的持久性:

  • 跨会话记忆:允许 Agent 回忆先前对话中的信息,即使在会话结束后也是如此。这会随着时间的推移创造一种连续性和个性化的感觉。

  • 知识库记忆:存储事实信息、用户偏好和学习模式,无论它们最初何时记录,都可以访问。

可访问性分类

私有记忆

为单个 Agent 使用而存储的信息:

  • 仅供创建或拥有该记忆的特定 Agent 访问
  • 该 Agent 可以随时读取和修改
  • 用于维护特定于 Agent 的上下文和个人用户信息
共享记忆

可供多个 Agent 使用的信息:

  • 可供系统内已定义的 Agent 组访问
  • 任何具有适当权限的 Agent 都可以读取并可能修改
  • 对于协作式多 Agent 系统至关重要,其中信息共享可提高集体绩效

Agent 记忆的实现方法

基于变量的记忆

实现记忆的最简单方法之一是通过系统或用户定义的变量:

# 基于变量的记忆实现示例
user_preferences = {"language": "English","units": "metric","notification_frequency": "daily"
}# 访问记忆
def generate_response(query, user_id):prefs = user_preferences.get(user_id, default_preferences)# 使用偏好自定义响应return personalized_response

这种方法简单直接,但在处理复杂或非结构化信息方面能力有限。

NL2SQL 数据库记忆

自然语言到 SQL (NL2SQL) 数据库记忆允许通过自然语言进行结构化数据管理:

# NL2SQL 记忆交互示例
async def update_expense_record(user_query):# 将自然语言转换为 SQLsql_query = nl2sql_converter.convert("今天午餐新增一笔 45 美元的开销")# 执行生成的 SQLresult = await database.execute(sql_query)return result

这种方法对于需要结构化数据存储和检索的应用(例如费用跟踪器或库存管理系统)特别强大。

向量数据库记忆

向量数据库将信息存储为嵌入,从而实现语义检索:

# 向量数据库记忆实现示例
from chromadb import ChromaDBVectorMemoryasync def store_information(text_content):# 将文本转换为向量嵌入并存储await vector_memory.add(MemoryContent(content=text_content,mime_type=MemoryMimeType.TEXT,metadata={"category": "user_information", "timestamp": current_time()}))async def retrieve_relevant_info(query):# 检索语义上相似的信息results = await vector_memory.query(query, k=3)return results

向量数据库擅长基于语义相似性而非精确匹配来检索信息,使其成为知识检索系统的理想选择。

记忆查询和更新工作流程

用户 Agent 短期记忆 长期记忆 初始查询 存储查询 查询相关上下文 返回个性化信息 以上下文感知的答案响应 后续问题 查询最近的对话 返回对话历史 用新学到的信息更新 以连贯的后续响应 用户 Agent 短期记忆 长期记忆

此工作流程演示了短期和长期记忆系统如何在整个对话过程中协同工作以维护上下文和个性化。

记忆更新策略

通过函数调用进行启发式更新

Agent 可以通过由上下文需求触发的特定函数调用来更新记忆:

  1. NL2SQL 数据库更新:Agent 识别何时应存储信息并生成适当的 SQL 命令。
  2. 向量数据库更新:当 Agent 确定新信息可能与未来检索相关时,会将其嵌入并存储。

这种方法允许动态的、上下文感知的记忆管理。

通过函数逻辑强制更新

某些记忆更新通过编程逻辑自动发生:

  1. 变量更新:系统变量根据直接用户输入或推断的偏好进行更新。
  2. 会话状态管理:关键信息在对话流程的特定点被强制存储。

这确保了无论 Agent 的决策如何,基本信息始终被捕获。

记忆查询策略

启发式查询

与更新类似,查询可以由 Agent 决策触发:

  1. 上下文检索:Agent 确定何时额外的上下文可以改善其响应。
  2. 知识增强:当面临复杂问题时,Agent 可能会查询其记忆以获取相关事实。
强制查询

某些记忆检索是程序化强制执行的:

  1. 用户识别:存储用户身份的变量在每个会话开始时自动检索。
  2. 偏好应用:在生成个性化内容之前强制查询用户偏好。

研究案例分析

Coze

Coze 支持短期和长期记忆实现:

  • 短期记忆:在会话中维护对话上下文
  • 长期记忆:跨会话记录用户配置文件信息和关键记忆点
  • 手动编辑:允许开发人员在调试模式下手动编辑记忆

Coze 的记忆方法在情感陪伴场景中尤其出色,其中个性化交互至关重要。

OpenAI

OpenAI 在 ChatGPT 中实现了跨对话的长期记忆:

  • 用户可以明确指示系统记住特定信息
  • 可以使用诸如“你记得关于我的什么?”之类的短语查询记忆
  • 用户通过删除特定记忆或完全禁用该功能的选项来保持控制

此实现平衡了实用性与用户隐私和控制。

AutoGen

微软的 AutoGen 框架提供全面的记忆支持:

  • 内置支持:多种记忆类型,包括基于列表和基于向量的实现
  • 集成:与向量数据库和外部记忆系统配合使用
  • 自定义:开发人员可以通过覆盖 addqueryupdate_context 等方法来扩展记忆协议

AutoGen 的记忆系统因其灵活性和可扩展性而特别引人注目。

LangChain 和 LlamaIndex

这两个框架都提供专门的记忆实现:

  • LangChain:专注于对话和实体记忆,对基于对话的应用有强大的支持
  • LlamaIndex:强调可组合和向量记忆,在数据检索场景中具有特殊优势

多智能体系统的记忆设计

在为多智能体设计记忆系统时,有以下几点考虑:

用于多 Agent 协作的共享记忆

对于多 Agent 系统,共享记忆变得至关重要:

  • 信息共享:诸如文件路径之类的简单信息可以使用以对话为维度的变量进行存储
  • 冲突解决:实施处理来自不同 Agent 的冲突记忆更新的策略

缓冲区记忆压缩

对于多轮任务,记忆压缩变得重要:

  • 摘要:将先前的对话轮次压缩成摘要
  • 任务初始化:开始新任务时,总结先前任务的结果
  • 上下文窗口管理:确保最相关的信息适合模型上下文窗口

长期记忆注意事项

实施长期记忆的决定取决于实际需求:

  • 用户个性化:对于需要个性化体验的应用是必要的
  • 知识积累:对于通过持续使用而改进的系统很有价值

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

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

相关文章

leetcode 2395. Find Subarrays With Equal Sum

题目描述 代码&#xff1a; class Solution { public:bool findSubarrays(vector<int>& nums) {int len nums.size();if(len <2)return false;unordered_set<int> table;int sum 0;for(int i 1;i < len;i){sum nums[i-1]nums[i];if(table.contains(…

Kubernetes(k8s)学习笔记(七)--KubeSphere 最小化安装

前情提要 可视化操作面板对于开发、运维绝对是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可视化操作来管理Kubernetes。 可视化面板有多种&#xff1a; 1.Kubernetes官方提供的默认面板&#xff1a;dashboard&#xff0c;用处不大&#xff0c;放弃&#xff1b…

MCP连接Agent:AI时代的TCP/IP

介绍 2023年&#xff0c;生成式AI爆发。2024年&#xff0c;智能体&#xff08;Agent&#xff09;接棒成为AI新焦点。2025年&#xff0c;智能体似乎已经要开始爆发了。目前的智能体更像一个“单机App”&#xff1a;彼此不了解、无法通信&#xff0c;更不能协作。类似互联网早期…

交换机工作原理(MAC地址表、VLAN)

目录 一、交换机的基本工作原理 数据帧的转发 MAC地址表的作用 交换机的转发方式 二、VLAN&#xff08;虚拟局域网&#xff09; VLAN的定义 VLAN的作用 VLAN的实现方式 VLAN的帧标记 VLAN的通信 三、交换机与VLAN的结合 四、交换机与VLAN的实际应用场景 交换机是局…

eFish-SBC-RK3576工控板外部RTC测试操作指南

备注&#xff1a; 1&#xff09;测试时一定要接电池&#xff0c;否则外部RTC断电后无法工作导致测试失败&#xff1b; 2&#xff09;如果连接了网络&#xff0c;系统会自动同步NTP时钟&#xff0c;所以需要关闭自动同步时钟。 关闭自动同步NTP时钟方法&#xff1a; 先查看是…

淘宝按图搜索商品(拍立淘)Java 爬虫实战指南

在电商领域&#xff0c;按图搜索商品功能为用户提供了更直观、便捷的购物体验。淘宝的拍立淘功能更是凭借其强大的图像识别技术&#xff0c;成为许多开发者和商家关注的焦点。本文将详细介绍如何利用 Java 爬虫技术实现淘宝按图搜索商品功能&#xff0c;包括注册账号、上传图片…

【Redis】List类型

文章目录 List的特点介绍lpush&#xff0c;lpushx&#xff0c;rpush&#xff0c;rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小结list的内部编码List的应用场景 List的特点介绍 列表相当于一个数…

QT:qt5调用打开exe程序并获取调用按钮控件实例2025.5.7

为实现在 VS2015 的 Qt 开发环境下打开外部 exe&#xff0c;列出其界面按钮控件的序号与文本名&#xff0c;然后点击包含特定文本的按钮控件。以下是更新后的代码&#xff1a; #include <QCoreApplication> #include <QProcess> #include <QDebug> #include…

基于Jenkins的DevOps工程实践之Jenkins共享库

文章目录 前言Jenkins共享库结构1、共享库演示2、知识点补充3、实践使用共享库格式化输出日志4、groovy基础语法4.1、 什么是 Groovy&#xff1f;4.2、groovy特点4.3、运行方法4.4、标识符4.5、基本数据类型4.5.1、string类型4.5.2、list类型 4.6、函数使用4.7、正则表达式 5、…

【Qt4】Qt4中实现PDF预览

方案一&#xff1a; 在Qt4中预览PDF文件&#xff0c;你可以使用多种方法&#xff0c;但最常见和简单的方法之一是使用第三方库。Qt本身并没有内置直接支持PDF预览的功能&#xff0c;但你可以通过集成如Poppler、MuPDF等库来实现这一功能。下面我将展示如何使用Poppler库在Qt4中…

php artisan resetPass 执行密码重置失败的原因?php artisan resetPass是什么 如何使用?-优雅草卓伊凡

php artisan resetPass 执行密码重置失败的原因&#xff1f;php artisan resetPass是什么 如何使用&#xff1f;-优雅草卓伊凡 可能的原因 命令不存在&#xff1a;如果你没有正确定义这个命令&#xff0c;Laravel 会报错而不是提示”重置密码失败”用户不存在&#xff1a;’a…

ai说什么是注解,并以angular ts为例

在编程中&#xff0c;注解&#xff08;Annotation&#xff09; 是一种特殊的语法结构&#xff0c;用于为代码添加元数据&#xff08;metadata&#xff09;&#xff0c;从而在不修改代码逻辑的情况下&#xff0c;提供额外的信息或指示编译器、框架、工具如何处理这些代码。注解通…

【MySQL】-- 联合查询

文章目录 1. 简介1.1 为什么要使用联合查询1.2 多表联合查询时MySQL内部是如何进行计算的 2. 内连接2.1 语法2.2 示例 3. 外连接3.1 语法3.2 示例 4. 自连接4.1 应用场景4.2 示例4.3 表连接练习 5. 子查询5.1 语法5.2 单行子查询5.3 多行子查询5.4 多列子查询5.5 在from 子句中…

【多线程】六、基于阻塞队列的生产者消费者模型

文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cpp Ⅳ. 如何理解提高了效率❓❓❓ Ⅰ. 生产者消费者模型的概念 ​ 生产者消费者模型是一种常见的并发模式&#xff0c;用于解决生产者…

【Vue】全局事件总线 TodoList 事件总线

目录 一、 实现所有组件看到x事件 二、 实现$on $off 以及 $emit 总结不易~ 本章节对我有很大的收获&#xff0c; 希望对你也是&#xff01;&#xff01;&#xff01; 本节素材已上传至Gitee&#xff1a;yihaohhh/我爱Vue - Gitee.com 全局事件总线图&#xff1a; 本节素材…

Python编程virtualenv库的简介和使用方法

Python编程virtualenv库的简介和使用方法 virtualenv和conda的区别是什么

MySQL的行级锁锁的到底是什么?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL的行级锁锁的到底是什么?】面试题。希望对大家有帮助&#xff1b; MySQL的行级锁锁的到底是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的行级锁是数据库管理系统&#xff08;DBMS&#xff09;的一…

【C++游戏引擎开发】第33篇:物理引擎(Bullet)—射线检测

一、射线检测核心理论体系 1.1 射线检测的数学基础 1.1.1 参数化射线方程 射线在三维空间中的数学表达采用参数方程: r ( t ) = o + t d ^ ( t ∈ [

【操作系统】线程崩溃机制详解

在分布式系统与多线程编程的世界里&#xff0c;一个看似简单的问题却暗藏玄机&#xff1a;当某条线程突然崩溃&#xff0c;其所属进程会随之消亡吗&#xff1f;这个问题背后隐藏着操作系统与编程语言的精妙设计&#xff0c;本文将从底层原理到工程实践层层剖析。 一、线程崩溃…

无人机 | 无人机设计概述

无人机设计是一个复杂的系统工程&#xff0c;涉及空气动力学、电子技术、材料科学、控制算法等多个领域的综合应用。以下是无人机设计的主要模块和关键要素概述&#xff1a; 一、总体设计目标 任务需求定义 用途&#xff1a;航拍、物流、农业、军事侦察、环境监测等性能指标&am…