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 可以通过由上下文需求触发的特定函数调用来更新记忆:
- NL2SQL 数据库更新:Agent 识别何时应存储信息并生成适当的 SQL 命令。
- 向量数据库更新:当 Agent 确定新信息可能与未来检索相关时,会将其嵌入并存储。
这种方法允许动态的、上下文感知的记忆管理。
通过函数逻辑强制更新
某些记忆更新通过编程逻辑自动发生:
- 变量更新:系统变量根据直接用户输入或推断的偏好进行更新。
- 会话状态管理:关键信息在对话流程的特定点被强制存储。
这确保了无论 Agent 的决策如何,基本信息始终被捕获。
记忆查询策略
启发式查询
与更新类似,查询可以由 Agent 决策触发:
- 上下文检索:Agent 确定何时额外的上下文可以改善其响应。
- 知识增强:当面临复杂问题时,Agent 可能会查询其记忆以获取相关事实。
强制查询
某些记忆检索是程序化强制执行的:
- 用户识别:存储用户身份的变量在每个会话开始时自动检索。
- 偏好应用:在生成个性化内容之前强制查询用户偏好。
研究案例分析
Coze
Coze 支持短期和长期记忆实现:
- 短期记忆:在会话中维护对话上下文
- 长期记忆:跨会话记录用户配置文件信息和关键记忆点
- 手动编辑:允许开发人员在调试模式下手动编辑记忆
Coze 的记忆方法在情感陪伴场景中尤其出色,其中个性化交互至关重要。
OpenAI
OpenAI 在 ChatGPT 中实现了跨对话的长期记忆:
- 用户可以明确指示系统记住特定信息
- 可以使用诸如“你记得关于我的什么?”之类的短语查询记忆
- 用户通过删除特定记忆或完全禁用该功能的选项来保持控制
此实现平衡了实用性与用户隐私和控制。
AutoGen
微软的 AutoGen 框架提供全面的记忆支持:
- 内置支持:多种记忆类型,包括基于列表和基于向量的实现
- 集成:与向量数据库和外部记忆系统配合使用
- 自定义:开发人员可以通过覆盖
add
、query
和update_context
等方法来扩展记忆协议
AutoGen 的记忆系统因其灵活性和可扩展性而特别引人注目。
LangChain 和 LlamaIndex
这两个框架都提供专门的记忆实现:
- LangChain:专注于对话和实体记忆,对基于对话的应用有强大的支持
- LlamaIndex:强调可组合和向量记忆,在数据检索场景中具有特殊优势
多智能体系统的记忆设计
在为多智能体设计记忆系统时,有以下几点考虑:
用于多 Agent 协作的共享记忆
对于多 Agent 系统,共享记忆变得至关重要:
- 信息共享:诸如文件路径之类的简单信息可以使用以对话为维度的变量进行存储
- 冲突解决:实施处理来自不同 Agent 的冲突记忆更新的策略
缓冲区记忆压缩
对于多轮任务,记忆压缩变得重要:
- 摘要:将先前的对话轮次压缩成摘要
- 任务初始化:开始新任务时,总结先前任务的结果
- 上下文窗口管理:确保最相关的信息适合模型上下文窗口
长期记忆注意事项
实施长期记忆的决定取决于实际需求:
- 用户个性化:对于需要个性化体验的应用是必要的
- 知识积累:对于通过持续使用而改进的系统很有价值