版本 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)
Claude Code 真实机制是「静态 MEMORY.md + 即时上下文压缩」,没有定时做梦 daemon。「定时离线提炼记忆」方向可行,但应实现为「异步任务队列 + 定时批处理」,PRD 别引用不存在的「autoDream」。
v0.1 把场景判定为「单用户 × 单 persona,关系简单」,这个假设在百万×万级规模下不成立。真实的实体关系是:
(用户facet × 创作者persona),不是 (用户) 也不是 (用户,创作者)这把场景推到了视频判断框架的右上角(结构化高 + 关系复杂)。但这不等于"上 Neo4j 全套知识图谱从对话里抽实体"——见 §1 的关键转折。
记忆目标是「服务连续性」,产品已披露 AI 介入、创作者在环。记忆不用于制造「用户以为在和真人谈恋爱」的欺骗。
| # | 信号 | v0.1判定 | v0.2判定(百万×万级) |
|---|---|---|---|
| 1 | 多跳查询 | ❌ | ⚠️ 部分命中:跨关系/跨persona的身份归并是一种"沿关系走" |
| 2 | 实体关系即核心业务 | ❌ | ✅ 命中:用户↔创作者↔persona↔对话关系的拓扑就是业务本身 |
| 3 | 消歧需求强 | ✅ | ✅ 强命中:"上次那次"+"同一用户的不同关系"双重消歧 |
| 4 | 可解释推理链 | ❌ | ❌ 仍不需要 |
| 5 | 信息更新频繁有冲突,需时间线 | ✅ | ✅ 命中 |
命中数从 2 升到 4(含部分)。确实进入"该认真评估图"的区间。
视频里最该用足、但 v0.1 没用足的一句话(来自 OpenLore 项目):
「图谱记忆不一定要从对话来。结构化的元数据本身就是现成的图谱。」
代聊系统的关系拓扑——谁是谁、用户和哪个 persona 在对话、确权归属——本来就是你数据库里的结构化外键关系,是一张现成的图。它不需要花钱用 LLM 从对话文本里抽实体/做消歧(视频反复警告:实体消歧每判断一次一次 LLM 调用,对话量一大费用可能超过整条业务链)。
所以正确架构是两个平面分离:
| 平面 | 解决什么 | 怎么建 | 成本 |
|---|---|---|---|
| A. 身份/关系平面(图) | "这条消息属于哪个用户的哪个facet × 哪个creator persona" → 路由 + 隔离 + 跨关系身份归并 | 用已有的结构化元数据/外键构建,不从对话抽 | 低(无 LLM 抽取) |
| B. 对话内容记忆平面(向量+时间) | 单条关系内"上次聊了啥、偏好、情绪、承诺" → 召回 | 向量检索 + 时间索引 + 轻量消歧,按平面A的key分区 | 中(仅会话结束一次 LLM 归纳) |
一句话:图只用来"定位/隔离/归并身份"(addressing & scoping),不用来"理解对话内容"(content)。 内容召回仍是向量+时间。这样既拿到图的隔离/归并能力,又躲开 KG 从对话抽实体的高昂成本。
GlobalUser (真实用户,唯一身份)
│ 1:N
├── UserFacet (用户在某条关系中呈现/被建模的面孔)
│ │ N:1
│ └──────────────┐
│ ▼
│ Relationship ◀── 记忆的最小隔离单元(确权挂这里)
│ ▲
│ ┌──────────────┘
│ │ N:1
CreatorPersona (创作者的某个人设)
▲ N:1
│
Creator (真实创作者)
(UserFacet × CreatorPersona) 的一条对话线,是确权、记忆、分成的统一锚点。注意:这里的"实体/关系"是系统已知的结构化身份(用户ID、persona ID、确权记录),不是视频警告的"从对话里 LLM 抽三元组"。Schema 稳定,无持续消歧的 LLM 开销。
记忆按三种作用域组织,全部以平面 A 的 key 寻址:
| 作用域 | 存什么 | 隔离键 | 谁能读 |
|---|---|---|---|
| 创作者人设记忆 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 是合规敏感层,默认隔离。
注入给 AI 的上下文 = CreatorPersonaProfile(人设/口吻) ← 决定"我是谁、怎么说话"
+ RelationshipMemory Top-K(这条线的召回) ← 决定"我们之间发生过什么"
+ (可选)GlobalUserProfile 授权字段 ← 决定"这个用户大致画像"
agentmemory(53 MCP工具/12 hooks/自带SQLite无外部DB)可直接抄的点:
post-tool-use.mjs 实证:fire-and-forget + AbortSignal.timeout(3000) + catch {},不阻塞主流程。
→ 代聊:用"消息收发/会话结束"事件替代,异步投递记忆服务,绝不阻塞 WebSocket 聊天主链路。
事件 → SHA256去重(5min窗口) → 隐私过滤(剥离手机号/支付/真实身份) → 存原始
会话结束 → 规则预抽(偏好词/时间词/情绪词) → 一次LLM归纳成结构化事实 → 写RelationshipMemory
绝不每条消息调 LLM——百万级规模下会爆成本。
@node-rs/jieba/tiny-segmenter),否则 CJK 退化为整串分词。Working/Episodic/Semantic 对应 L1/L2/L3;Ebbinghaus 衰减 + 矛盾检测消解。同一偏好维度冲突时以最新为准,旧值标 superseded 保留时间线。
存储前剥离敏感信息,按 relationship_id 隔离。
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)
| 框架 | 对代聊的参考点 |
|---|---|
| agentmemory(rohitg00) | hook异步捕获/RRF混合检索/四层衰减/隐私过滤——主要参考来源 |
| Zep | 最贴合:temporal KG,长期画像+时序事实+时间线,覆盖信号3/5 |
| Mem0(53K★) | 轻量记忆层 API 对照 |
| Letta/MemGPT(22K★) | 分层记忆 + 记忆分页 |
| Neo4j Agent Memory(POLE+O) | 仅平面A的离线分析备选,不上聊天热路径 |
| OpenLore | 论证"图来自结构化元数据,不必从对话抽"——本版核心思路来源 |
(global_user_id, creator_persona_id) 即可(取决于"用户侧人设"是否真的多变)。v0.2 修正记录:v0.1 误判关系复杂度为低(按单用户×单persona)。本版按百万×万级多对多+多persona重做,核心是"两平面分离"——身份/关系图来自结构化元数据(低成本、做隔离与归并),对话内容召回仍走向量+时间(按关系分区)。
输入:IMG_5764.MP4 转写 + agentmemory v0.9.21 源码 + 确权机制(消息分流v3.x)。