简介:本文面向AI应用开发者与架构师,系统讲解如何为智能体设计并实现从短期工作记忆到长期持久记忆的分层记忆系统。教程从无状态模型与有状态应用的矛盾切入,依次介绍记忆分类、存储选型、写入策略、检索机制、遗忘策略及结果验证方法,帮助读者在自有技术栈中搭建具备持续学习能力的记忆模块,提升智能体在多轮交互中的一致性与个性化水平。
本教程将带领读者完成以下核心任务:
本教程适合以下人群:
在开始实施前,请确认具备以下条件:
大语言模型本质上是无状态的函数映射器:给定输入token序列,输出预测的下一个token。模型本身不保留任何跨请求的信息。而智能体应用却需要连续理解用户意图、记住历史偏好、逐步完成任务。解决这一矛盾的关键在于,在模型外部构建一层独立于推理引擎的记忆管理层。
该管理层需要承担三项基本职责:
在认知科学中,人类记忆被划分为工作记忆、情景记忆与语义记忆。映射到智能体系统,我们可以采用三层架构:
| 层级 | 功能定位 | 存储介质 | 生命周期 | 典型数据 |
|---|---|---|---|---|
| 短期记忆(工作上下文) | 维持当前会话的即时状态 | 内存缓存或临时键值表 | 会话结束即销毁 | 最近几轮对话原文、当前任务进度、未完成表单字段 |
| 情景记忆(长期) | 记录历史交互的具体事件 | 文档型数据库或关系表 | 数周至数月 | 用户偏好、历史订单记录、投诉处理过程 |
| 语义记忆(长期) | 沉淀提炼后的通用知识与规则 | 向量数据库 | 长期保留 | 用户画像标签、产品知识摘要、业务规则映射 |
这种拆分的核心价值在于:不同层级的访问频率、数据量、一致性要求差异巨大。短期记忆要求低延迟读写,长期记忆则更关注检索相关性与存储容量。混用同一种技术方案会导致性能瓶颈或存储浪费。
实现时需要明确记忆内容如何进入模型上下文。目前业界普遍采用两种协同模式:
本教程推荐先实现显式注入,因为它不依赖具体模型内部实现,更换模型厂商时无需改动记忆模块。
在动手写代码前,先定义统一的数据结构。建议采用以下最小字段集合:
记忆记录对象:- memory_id: 全局唯一标识,用于更新与删除- user_id: 归属用户或会话标识- memory_type: 枚举值,短期/情景/语义- content: 文本内容,为提取后的关键信息- metadata: JSON对象,包含来源轮次、时间戳、重要度评分、过期时间- embedding: 向量数组(维度依据所用嵌入模型而定)
需要注意:短期记忆与长期记忆在结构上可以统一,但区分管理。例如,短期记忆的过期时间字段设置为会话剩余时间,情景记忆的过期时间设置为30天,而语义记忆不设过期时间,仅由重要度评分决定保留与否。
为防止数据表字段膨胀,建议将 embedding 单独存放在向量存储中,与主数据表通过memory_id关联。这样在需要按关键词过滤时,无需加载所有向量参与计算,降低索引维护成本。
短期记忆目标是保证当前会话内的连贯性。实现时并不需要额外引入重组件,最常见的做法是在应用进程内使用一个基于LRU(最近最少使用)策略的缓存字典。
操作流程如下:
需要重点考虑的是上下文窗口预算。128K的上下文虽然容量较大,但过多无关历史会稀释模型对关键信息的注意力。建议对每条历史消息预估token长度,并设置总预算上限(例如不超过窗口的70%),超出部分优先丢弃用户早期的寒暄内容,保留任务相关的指令性内容。
长期记忆的核心难点不在于存储,而在于“记住什么”。如果将所有对话原封不动存入数据库,检索时噪声极大。建议采用“信息提取-重要性评分-入库”三步流程:
请从以下对话中提取关于用户的持久性事实,要求:- 排除与事实无关的寒暄、情绪表达;- 提取范围包括用户身份属性、明确的偏好陈述、对具体事件的完成状态;- 输出格式为JSON数组,每项含fact(事实文本)和category(类别)。对话内容:[用户输入] + [模型输出]
重要性评分:设定规则或让模型输出一个1到5的整数值。例如:涉及食物过敏、疾病、支付信息等安全相关事实评分不低于4;用户当前的工作项目进度评分3;普通兴趣话题评分1。
写入存储:将评分高于阈值的记录连同embedding向量写入数据库。同时检查是否已存在同一用户的相似记录(通过向量相似度或时间窗口内的文本完全匹配判断),若存在则执行更新合并而非重复插入。
这一流程建议采用异步队列处理,避免在用户请求热路径上增加额外延迟。例如,可以使用消息队列将对话日志异步发送给提取服务,提取完成后回写存储。
检索阶段的目标是从海量长期记忆中找出与当前问题最相关的3至5条记录。检索策略决定智能体到底能“想”到多少过去的信息。
推荐采用混合检索策略,融合两种互补手段:
将两种结果做加权融合,例如:向量检索得分权重0.7,关键词匹配权重0.3,排序后取TopK。
在注入时还需要注意排序问题。更贴近当前时间点的记忆应排得更靠后(更接近模型输出端),这样模型在生成回答时更容易回看近期状态。伪造的时序顺序会导致模型混淆到底哪条记忆是用户最近表达的。
记忆系统如果只增不改,随着时间推移会积累大量过时甚至冲突的信息。比如用户第一天说“我住在北京”,第三天说“我搬家到上海了”,如果两条记录都存在,模型在回答推荐地点时会混乱。
遗忘策略还需考虑用户隐私权。向用户提供“清除我的记忆”入口是合规性上的必要操作,该功能只需按user_id删除全部对应记录即可。
在多租户应用场景下,记忆数据的安全隔离是必须建立的防线。核心原则是:
此外,对于涉及敏感信息的记忆内容(如账户余额、健康指标),建议在写入前加密存储密钥,并在检索结果注入模型前进行脱敏展示。脱敏规则可由业务方配置,比如将信用卡号替换为尾号后四位。
建立一组涵盖典型记忆需求的测试用例,例如:
建议监控以下核心指标以量化记忆系统效果:
定期统计每条记忆的平均存储字节数与向量维度开销,估算单用户存储成本。当长期记忆总数超过百万条规模时,需考虑增加索引分片或适当降低向量维度(例如从1536维降到768维)来控制成本。
后续可考虑为记忆系统引入分层衰减机制:近期记忆权重更高,远期记忆权重递减但不删除,模拟人类遗忘曲线。同时可增加用户主动反馈机制,允许用户对某条历史记忆点击“删除”或“不要记住我”,进一步提升个性化与隐私保护水平。
本教程完整覆盖了为智能体构建分层记忆系统的技术路径:从架构矛盾分析、数据模型设计,到短期缓存、长期写入、混合检索、遗忘策略及多租户安全管控,每一环节均提供了可直接落地的操作指导。记忆系统的核心价值在于将大语言模型从无状态的推理引擎升级为具备持续学习能力的应用实体。建议读者先以简单场景原型验证检索有效性,再逐步迭代到高并发、多租户的生产架构,并在实现过程中始终以用户隐私与数据安全为首要约束条件。