对话系统记忆架构设计笔记

一、记忆时效分类

类型 定义 更新频率 存储方式 检索方式
语义记忆 通用知识 向量知识库 语义检索
情节记忆 具体事件、用户画像 随交互变化 结构化向量库(如 Mysql)或知识图谱,与用户ID强绑定 用户ID + 向量检索
程序性记忆 操作流程、规则 按需变更 Skill Manager 规则库 根据意图/关键词加载提示词或函数调用

二、记忆存储策略(以对话后处理为例)

2.1 瞬时记忆

  • 内容:上下文 N 轮对话原文

  • 实现:直接存放在会话的 messages 数组中

2.2 短期记忆

  • 机制:每 N 轮用 LLM 生成一次摘要,存入缓存(如 Redis)

  • 下次对话加载:摘要 + 最近几轮原始对话

  • 高级做法:后台轻量模型实时增量抽取关键实体、核心约束、用户身份、待办事项、禁忌规则,结构化后钉入 System Prompt。只要 Session 不断,该状态不会被滑动窗口截断,优先级高于普通对话内容。

2.3 长期记忆(情节记忆)

按数据类型选择存储引擎:

数据类型 存储选型 适用场景 召回优先级
强事实结构化数据 MySQL / MongoDB 用户基础信息、手机号、过敏史、明确禁忌、确定性标签 最高(零容错,不可推翻)
半结构化长文本 Elasticsearch(BM25) 历史对话总结、长文本需求、过往方案、关键词相关内容 (关键字匹配准确率远超向量检索)
非结构化模糊语义 向量数据库(Milvus) 发散性经验、聊天风格、情绪片段、隐性偏好 最低(结果必须让步于前两类)

三、记忆更新管理(异步事件驱动)

3.1 核心思想

  • 读写分离、惰性更新

  • 使用 Mem0 在对话结束后(或异步)进行 ADD / UPDATE / DELETE / NOOP 判断

3.2 四种记忆操作

操作 触发条件
ADD 新信息与现有记忆无冲突,且语义上不属于已有实体
UPDATE 语义相似度超过阈值,判定为同一实体的信息更新
DELETE TTL 过期 / 用户主动删除(逻辑删除 is_deleted
NOOP 无需变更

3.3 典型异步更新流程(事件驱动)

  1. 投递消息队列:主链路将用户输入 + LLM 输出打包丢入 RocketMQ/Kafka,主线程立即返回,不等待记忆更新。

  2. 路由与意图分类:后台消费者用轻量模型判断是否包含需要长期记住的事实或状态变更。若无则丢弃;若有则解析为结构化 JSON 指令。

  3. 异构路由更新落盘

    • MySQL:更新强事实(如饮食禁忌、出行目的地)

    • 向量库:对长文本经验重新 Embedding 后存入

  4. 短期记忆清理:长期记忆落盘成功后,通过 ACK 机制清理 Redis 中的临时数据。

3.4 更新时机

  • 事件驱动:仅在对话流中识别到“状态变更”“新事实新增”事件时,才异步丢入 MQ 触发记忆更新。


四、记忆检索读取(每次新窗口开始时)

4.1 实际做法

  1. 注入系统提示词

  2. 查强事实标签(MySQL):按 UserID 并发查询确定性画像(如 allergy=seafood),取 top‑k 作为“用户历史事件”,零容错,优先级最高

  3. 查短期缓存(Redis):按 SessionID 取最近 5 轮完整对话 + 当前 Session 动态状态机 State

  4. 查经验与补充知识(ES + 向量库):对用户输入做意图识别,若涉及历史信息查询,同时向 ES(关键字检索)和向量库(语义检索)发起检索,结果经 Rerank 重排与截断

  5. 知识库检索(可选):仅用问题向量检索,注入为“背景知识”

  6. Prompt 组装与大模型调用

  • 最终输入按以下顺序组装:

    最终输入 = 系统角色提示词 + 用户画像 + (历史上下文摘要 + 最近 N 轮对话)+ 历史信息查询结果(ES/向量库检索) + 问题及通用知识检索答案(RAG)

        ①系统角色提示词:固定角色设定与行为约束

        ②用户画像:从 MySQL 读取的强事实标签(确定性信息)

        ③摘要与N轮摘要:从 Redis 读取的短期记忆摘要(由轻量模型定期生成)+最近 N 轮对话:从 Redis 读取的原始对话原文

        ④历史信息查询结果:当意图识别判定需要查询用户历史事件时,从 ES / 向量库检索到的相关内容(情节记忆)

        ⑤问题及通用知识检索答案:当需要外部通用知识时,通过 RAG 从向量知识库检索得到的背景知识。

这样分层明确:用户专属的强事实 + 短期会话上下文 + 用户历史行为/事件 + 通用知识,按优先级与依赖关系依次注入,避免信息冲突或冗余。


五、优化方向

优化点 说明
图数据库补充实体关系 引入 Nebula / Neo4j 存储实体间关系(如“用户 A 的母亲是 B,B 对海鲜过敏”),解决多实体关联召回问题,比关系型库和向量库更适配
标量过滤 + 向量检索混合查询 给向量数据加上结构化标量标签(如 UserID、记忆类型),检索时先标量过滤再语义检索,大幅降低召回错误
实时 + 离线双链路更新 除实时事件驱动外,通过离线大数据分析挖掘隐性偏好,批量更新用户画像,补充实时链路盲区
记忆生命周期分级管理 不同记忆类型设置分级 TTL,严格控制存储成本,不永久存储所有记忆

哲学视角

“记忆不是为了回到过去,而是为了在未来的每一个当下,都能认出自己。”
—— 这种分类存储 + 异步更新 + 分层检索 + 主动遗忘的记忆机制,正是对“身份在时间中通过不断重构而保持连续”这一哲学思想的工程化体现。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐