← 返回文档归集

持久记忆框架设计 · 代聊系统(多租户 · persona维度修正版)

版本 v0.2 | 2026-06-06 | 状态:设计稿,待评审 适用:tx代聊系统 AI 破冰(AI-01~06)与代聊员辅助场景 规模假设:百万级用户 × 万级创作者,多对多交叉关系,用户/创作者均可有多 persona v0.2 修正了 v0.1 的根本错误(见 §0.2) 输入来源:①技术视频《向量 vs 知识图谱:Agent 记忆何时该切换》转写 ②agentmemory 插件 v0.9.21 源码 ③确权机制(消息分流 v3.x)


0. 前置纠偏

0.1 不存在「autoDream 梦境引擎」

Claude Code 真实机制是「静态 MEMORY.md + 即时上下文压缩」,没有定时做梦 daemon。「定时离线提炼记忆」方向可行,但应实现为「异步任务队列 + 定时批处理」,PRD 别引用不存在的「autoDream」。

0.2 v0.1 的根本错误(本版核心修正)

v0.1 把场景判定为「单用户 × 单 persona,关系简单」,这个假设在百万×万级规模下不成立。真实的实体关系是:

这把场景推到了视频判断框架的右上角(结构化高 + 关系复杂)。但这不等于"上 Neo4j 全套知识图谱从对话里抽实体"——见 §1 的关键转折。

0.3 合规底线(不变)

记忆目标是「服务连续性」,产品已披露 AI 介入、创作者在环。记忆不用于制造「用户以为在和真人谈恋爱」的欺骗。


1. 核心判断(修正后):关系是图,但图来自元数据不来自对话

1.1 重新对照视频的 5 个信号

# 信号 v0.1判定 v0.2判定(百万×万级)
1 多跳查询 ⚠️ 部分命中:跨关系/跨persona的身份归并是一种"沿关系走"
2 实体关系即核心业务 命中:用户↔创作者↔persona↔对话关系的拓扑就是业务本身
3 消歧需求强 强命中:"上次那次"+"同一用户的不同关系"双重消歧
4 可解释推理链 ❌ 仍不需要
5 信息更新频繁有冲突,需时间线 命中

命中数从 2 升到 4(含部分)。确实进入"该认真评估图"的区间。

1.2 关键转折:拆成两个平面,避免落入 KG 成本陷阱

视频里最该用足、但 v0.1 没用足的一句话(来自 OpenLore 项目):

「图谱记忆不一定要从对话来。结构化的元数据本身就是现成的图谱。」

代聊系统的关系拓扑——谁是谁、用户和哪个 persona 在对话、确权归属——本来就是你数据库里的结构化外键关系,是一张现成的图。它不需要花钱用 LLM 从对话文本里抽实体/做消歧(视频反复警告:实体消歧每判断一次一次 LLM 调用,对话量一大费用可能超过整条业务链)。

所以正确架构是两个平面分离

平面 解决什么 怎么建 成本
A. 身份/关系平面(图) "这条消息属于哪个用户的哪个facet × 哪个creator persona" → 路由 + 隔离 + 跨关系身份归并 已有的结构化元数据/外键构建,不从对话抽 低(无 LLM 抽取)
B. 对话内容记忆平面(向量+时间) 单条关系内"上次聊了啥、偏好、情绪、承诺" → 召回 向量检索 + 时间索引 + 轻量消歧,按平面A的key分区 中(仅会话结束一次 LLM 归纳)

一句话:图只用来"定位/隔离/归并身份"(addressing & scoping),不用来"理解对话内容"(content)。 内容召回仍是向量+时间。这样既拿到图的隔离/归并能力,又躲开 KG 从对话抽实体的高昂成本。


2. 实体模型(身份/关系平面 A)

GlobalUser (真实用户,唯一身份)
    │  1:N
    ├── UserFacet (用户在某条关系中呈现/被建模的面孔)
    │        │  N:1
    │        └──────────────┐
    │                       ▼
    │                  Relationship  ◀── 记忆的最小隔离单元(确权挂这里)
    │                       ▲
    │        ┌──────────────┘
    │        │  N:1
CreatorPersona (创作者的某个人设)
    ▲  N:1
    │
Creator (真实创作者)

注意:这里的"实体/关系"是系统已知的结构化身份(用户ID、persona ID、确权记录),不是视频警告的"从对话里 LLM 抽三元组"。Schema 稳定,无持续消歧的 LLM 开销。


3. 记忆分层(修正为多租户结构)

记忆按三种作用域组织,全部以平面 A 的 key 寻址:

3.1 三种记忆作用域

作用域 存什么 隔离键 谁能读
创作者人设记忆 CreatorPersonaProfile persona 的固定设定:背景故事、口吻、人设禁忌、统一话术 creator_persona_id 该 persona 的所有 Relationship 共享(广播)
关系记忆 RelationshipMemory 这条对话线的私有记忆:用户偏好、情绪时间线、承诺事项、"上次"上下文 relationship_id = (user_facet_id, creator_persona_id) 仅这条关系,确权后不可串台
全局用户画像 GlobalUserProfile 跨关系稳定属性:基础人口属性、消费档位(T-01~T-10)、平台级偏好 global_user_id 受控:默认不下放到具体关系,需知情同意/业务授权才聚合

RelationshipMemory 是热点和核心;CreatorPersonaProfile 是"一对多广播"省存储;GlobalUserProfile 是合规敏感层,默认隔离。

3.2 各层在一次对话里的组合(注入 prompt 时)

注入给 AI 的上下文 = CreatorPersonaProfile(人设/口吻)          ← 决定"我是谁、怎么说话"
                  + RelationshipMemory Top-K(这条线的召回)     ← 决定"我们之间发生过什么"
                  + (可选)GlobalUserProfile 授权字段           ← 决定"这个用户大致画像"

3.3 不可串台 = 默认关系隔离(对齐确权机制)


4. 借鉴 agentmemory 的工程实现

agentmemory(53 MCP工具/12 hooks/自带SQLite无外部DB)可直接抄的点:

4.1 捕获:hook 异步非阻塞(抄)

post-tool-use.mjs 实证:fire-and-forget + AbortSignal.timeout(3000) + catch {},不阻塞主流程。 → 代聊:用"消息收发/会话结束"事件替代,异步投递记忆服务,绝不阻塞 WebSocket 聊天主链路

4.2 管线:确定性工具先做,LLM 只用最后一步(抄,呼应视频三级流水线)

事件 → SHA256去重(5min窗口) → 隐私过滤(剥离手机号/支付/真实身份) → 存原始
会话结束 → 规则预抽(偏好词/时间词/情绪词) → 一次LLM归纳成结构化事实 → 写RelationshipMemory

绝不每条消息调 LLM——百万级规模下会爆成本。

4.3 检索:BM25+向量 RRF 融合 + 时间衰减(抄前两路,图路用平面A而非内容图)

4.4 四层衰减 + 矛盾消解(抄,解决"上周麻辣/这周不吃辣")

Working/Episodic/Semantic 对应 L1/L2/L3;Ebbinghaus 衰减 + 矛盾检测消解。同一偏好维度冲突时以最新为准,旧值标 superseded 保留时间线

4.5 隐私优先(合规必抄)

存储前剥离敏感信息,按 relationship_id 隔离。


5. 召回策略(AI 破冰 AI-01~06)

Step1 路由(平面A):消息 → 解析 relationship_id → 锁定 RelationshipMemory 分区 + CreatorPersonaProfile
Step2 召回(平面B,仅在该分区内):
      召回分 = BM25 × w1 + 向量相似度 × w2 + 时间新鲜度(衰减) × w3 + 重要度(付费/强情绪) × w4
Step3 裁剪:RelationshipMemory 取 Top-K(3~5)
Step4 组装:CreatorPersonaProfile + Top-K + (授权)GlobalUserProfile → 注入(token预算~2000)

6. 规模化要点(百万×万级专属)


7. 可参考的真实框架(PRD 引用用这些)

框架 对代聊的参考点
agentmemory(rohitg00) hook异步捕获/RRF混合检索/四层衰减/隐私过滤——主要参考来源
Zep 最贴合:temporal KG,长期画像+时序事实+时间线,覆盖信号3/5
Mem0(53K★) 轻量记忆层 API 对照
Letta/MemGPT(22K★) 分层记忆 + 记忆分页
Neo4j Agent Memory(POLE+O) 仅平面A的离线分析备选,不上聊天热路径
OpenLore 论证"图来自结构化元数据,不必从对话抽"——本版核心思路来源

8. 落地路线(分期)


9. 待澄清 / 风险


v0.2 修正记录:v0.1 误判关系复杂度为低(按单用户×单persona)。本版按百万×万级多对多+多persona重做,核心是"两平面分离"——身份/关系图来自结构化元数据(低成本、做隔离与归并),对话内容召回仍走向量+时间(按关系分区)。

输入:IMG_5764.MP4 转写 + agentmemory v0.9.21 源码 + 确权机制(消息分流v3.x)。