- tags
- [Sentino, AI, Agent, 记忆, 架构, 工程]
- created
- 2026-04-17
- updated
- 2026-04-28
- sources
- [raw/snippets/sentino-agent/memex-architecture.md, raw/notes/google-memory-bank-research-2026-04-28.md, raw/notes/kim-graves-plg-sales-coordination-2026-04-29.md]
定义¶
Sentino 自研的 AI 长期记忆服务(Spring Boot + PostgreSQL + Redis)。多租户(userId × projectId),与对话型 LLM Agent 解耦——LLM 不直接管理 memory,而是把对话扔给 Memex,由后台流水线负责提取、存储、衰减、合并。命名来自 1945 年 Vannevar Bush 的 Memex 设想。
与 auto-memory(Claude Code 本地文件 memory)形成两套截然不同的记忆设计哲学的对照样本。
核心架构:三段流水线¶
Blob (原始对话) ──→ Summary (LLM 清洗) ──→ Profile + Event/Gist
↑入库即返回 ↑flush 触发 ↑写库
关键设计:异步批处理(memobase 模式)¶
- 写入廉价:
POST /blobs/insert/{userId}仅入库不调用 LLM - 处理触发:手动
/flush或自动(pending ≥ 50 / 10 分钟扫描) - 一次 flush 一次 LLM 调用:所有 pending blobs 打包,三类提取(summary / profile / reinforce)一次完成
- 实测 19 blobs 从 285s(每 blob 三次)降到 15s(一次批处理),19× 提升
数据模型(4 实体)¶
| 实体 | 角色 | 关键字段 |
|---|---|---|
GeneralBlob |
原始输入 | status (PENDING/PROCESSED/FAILED) 存 JSONB,非独立列 |
UserProfile |
静态属性键值对 | location/job/hobby... 覆盖式更新 |
UserEvent |
事件包装器 | event_tip + profile_delta |
UserEventGist |
可查询的最小记忆单元 | importanceLevel + forgetAt + status |
4 级重要度 + TTL 衰减(核心机制)¶
| 等级 | TTL | 内容 |
|---|---|---|
| CORE | ∞ | 身份/家人/长期习惯(≥3 个月)/慢性病 |
| IMPORTANT | 30 天 | 长期偏好/进行中项目 |
| NORMAL(默认) | 14 天 | 日常事件 |
| TRIVIAL | 3 天 | 今天吃啥/当下情绪 |
遗忘 = forgetAt 到期被定时扫描标记 FORGOTTEN(不删除,可恢复)。
4 类记忆类型与等级正交:event / info / schedule / ai_insight
Reinforce 机制(最有特色的设计)¶
LLM 输出里有 ### Reinforce 段落,列出要"强化"的现有 gist id。强化 = 重置 forgetAt 时钟。
prompt 强烈引导:"Reinforce 已有记忆 > 创建新记忆"。这是抗膨胀和去重的核心杠杆——同一信息再次出现时不创建新 gist,而是延长老 gist 寿命。
注意:Reinforce 是 prompt-driven 而非代码硬约束,意味着 prompt 质量直接影响膨胀速度,且存在 LLM 幻觉编造 gist_id 的风险。
三阈值抗膨胀¶
| 常量 | 值 | 作用 |
|---|---|---|
MAX_PENDING_BLOBS_BEFORE_FLUSH |
50 | 自动触发 flush |
DAILY_GIST_WARN_THRESHOLD |
30 | 当日 gist > 30 → prompt 注入"严格点"警告 |
MAX_GISTS_IN_LLM_CONTEXT |
200 | 发给 LLM 的 gist 上下文截断 |
夜间合并¶
3:00 AM 定时任务:24 小时内产生 >50 active gist 的用户跑 mergeAllGistsForUser()。
重要权衡:合并是离线兜底,不是每次 flush——高频用户会有"重复记忆窗口期"直到次日 3 AM。设计上靠 reinforce 在线缓解、merge 离线兜底。
检索(生产实际行为)¶
GET /users/context/{userId}?query=... → 纯文本:
[User Profile]:
{location=NY, hobby=coding}
[Relevant Memories]:
- [gist_xxx] User moved to NY // info | core
- [gist_yyy] User likes Java // info | important
embedding 列已建未用。<500 active gists 时全量返回 profile + gist;超过才走 vector(兜底而非主路径)。
Prompt 统一中文(cache 优化)¶
不再按用户语言分 zh/en/ja/ko 四套,统一用 ChineseCombinedPrompt.java,输出语言由 prompt 内规则控制。
理由:4 套 prompt 完全击穿 LLM provider 的 prompt cache,命中率为 0;维护成本 4×。统一后单个 prompt cache 跨所有用户共享。这是与 harness-engineering "Cache 经济学是架构约束"原则的应用案例。
与 Claude Code Auto Memory 的根本分歧¶
| 维度 | auto-memory | Sentino Memex |
|---|---|---|
| 部署形态 | 本地文件系统 | Spring Boot 服务 |
| 存储 | per-file markdown + MEMORY.md | PostgreSQL JSONB + Redis + 月度分区 |
| 写入主体 | LLM 在对话中主动 Write | 后台流水线被动提取 |
| 写入边界 | 严格("只存跨会话仍成立的") | 宽松(先存,靠衰减) |
| 类型维度 | 4 类按内容性质 | 4 级按重要度 + 4 类按内容 |
| 时效管理 | system-reminder 提示 + 人工 Auto Dream | TTL forgetAt + 自动遗忘 + reinforce |
| 防膨胀 | 控流入 | 控保鲜(衰减 + 合并 + reinforce) |
| 多租户 | cwd 路径隔离 | userId × projectId |
| 角色定位 | LLM 的工具 | LLM 是其工具 |
一句话哲学差异¶
- Claude Code = LLM-in-the-loop:让 LLM 决定记什么。少而精
- Sentino Memex = LLM-as-extractor:流水线提取一切,让重要的活下来。多而衰减
两套都解决"如何让 memory 不腐烂",前者控写入边界,后者控保鲜机制。两种策略不是优劣之分,而是适配不同场景的工程选择。
对外定位锚点(与 Claude Code 同路线背书)¶
向客户/合作方讲 Memex 时的最高优先级技术锚点:Sentino 选文本结构化记忆 + 大模型自判,与 Anthropic Claude Code 同方向,与 mem0 等向量检索方案是不同代际的判断。
行业 2022–2023 流行向量检索方案的固有问题在 2025–2026 年充分暴露: - 拉错:"我对花生过敏"和"我喜欢花生酱"语义相似度高但意义相反——可能涉及健康/合规风险 - 不可审计:向量空间是黑盒,AI 答错时工程师无法解释为什么选了那条 - 不可编辑:用户要求"忘掉某事",向量库无精确位置可删 - 不可预期:近似搜索特性导致同样查询可能给出不一致结果
随着大模型上下文窗口扩大、推理成本下降,行业判断转向"让模型读全集自判"。Anthropic 在 auto-memory 上做出同样选择是最有说服力的技术背书——Anthropic 这么选、Sentino 这么选,是同一个判断。
详见客户向说明文档:/Users/momo/local/claude-code/sentino-memex-positioning.md(包含与 mem0 客户视角对照表 + 完整技术规格附录);同步推到 iot-docs/sentino/memex-positioning.md 与英文版 memex-positioning-en.md。
首次实战:yukai-agora-poc PRD AC-08 写"记忆 (mem0)"——这里 mem0 是行业能力代名词,Sentino 用 Memex 实际交付。这是 Memex 的首次对外白标客户战,sentino-memex-positioning 中英文版即为该客户准备的术语切换教育材料。
2026-04 销售对照样本扩展:从 mem0 单对照到三对照¶
2026-04-28 摄取 google-memory-bank 调研后明确:销售姿态从"对照 mem0 一家"扩到"对照 mem0 + Memory Bank 两家"。两个对照样本的差异化论证不同:
| 对手 | 路线 | Memex 差异化论点 |
|---|---|---|
| mem0(向量检索路线) | 反方向 | 路线代际差异:向量检索的 4 个固有问题(拉错 / 不可审计 / 不可编辑 / 不可预期);Anthropic auto-memory 同方向背书 |
| google-memory-bank(同路线托管版) | 同方向 | 不能用路线代际,必须用具体差异点:自主可控(不绑 Gemini)/ Reinforce 主动续期(vs Memory Bank 被动 update)/ 4 级 TTL × 4 类内容二维结构(vs Memory Bank topic 一维)/ 数据主权(自建 vs GCP 托管)/ 可深度定制(Spring Boot vs API 边界) |
Memory Bank 是更难回答的对照样本——客户问"为什么不用 mem0"可以拿"路线代际"答;问"为什么不用 Memory Bank"必须用"具体能力对比 + 业务约束"回答(数据主权 / 模型解绑 / 算法定制深度)。sentino-memex-positioning 销售材料应当补充 Memory Bank 列,把差异化论点从单维(路线)扩到多维(路线 + 控制权 + 模型策略 + 数据主权 + 定制深度)。
Memory Bank 把 mem0 自承的 4 大未解问题给了部分内置答案(详见 google-memory-bank 对应段):staleness / privacy 直接答,consent / cross-session identity 部分答。这意味着"mem0 作为行业代名词的稳定性"在 2026-2027 会被挤压——但短期内(半年到一年)mem0 在开源社区的代名词地位还在,PRD 写 mem0 仍主要是行业代名词。
销售姿态自检:4 Why 框架下 Memex 论证强弱¶
why-change-why-you-why-now B2B 销售经典框架(Kim Graves 2026-04 访谈引用并验证)应用到 Memex 销售:
| Why | Memex 销售当前论证 | 强弱 |
|---|---|---|
| Why change | mem0 路线 4 个固有问题 + Memory Bank 强制绑 Gemini —— 客户改变的 outcome gap 清晰 | 较强 |
| Why you | Anthropic auto-memory 同方向背书 + 自主可控 + 文本结构化 + Reinforce —— 论证维度多 | 强 |
| Why now | 当前论证较弱 —— 为什么客户现在要切换记忆方案?除"PRD 写 mem0 时主动术语切换"外缺 compelling event | 弱 |
| Why trust | YUKAI Agora PoC 是首次对外白标客户,还没公开客户案例 | 弱 |
含义:sentino-memex-positioning 销售材料补强方向应当是 Why now(mem0 staleness 已被广泛承认的时点 + 行业 governance 要求上升)+ Why trust(第一批客户案例待出)。Kim Graves 给的另一启示是 "客户案例 > AI 口号"——OpenAI / Perplexity 用 Notion 这种案例叙事比"我们 AI 多强"有效得多,yukai-agora-poc 交付后应当尽快产生可对外引用的客户案例。
适用场景判断¶
| 场景 | 适合 |
|---|---|
| 单用户、低频对话、长期协作(编程助手) | Claude Code 模式 |
| 多用户 SaaS、高频交互、消费级应用 | Memex 模式 |
| 主体是 LLM Agent,memory 是辅助 | Claude Code 模式 |
| 主体是 memory 服务,多个 Agent 消费 | Memex 模式 |
Sentino 选 Memex 模式合理——sentino 的 AI 语音陪伴产品天然是高频、多用户、记忆是核心资产而非 Agent 的辅助。
观察到的非显然设计选择¶
- 写入主体不是 LLM:与 Claude Code 完全相反,对话型 LLM 不感知 memory 何时被写入
- 状态机存 JSONB:blob status 没建独立列,性能上靠分区
- Embedding 已建未用:1024-dim vector 列在 Event/Gist 都有,但生产路径绕过它
- Reinforce 是 prompt-driven 的:不是硬约束,prompt 质量直接影响膨胀速度
- TTL 不是删除:FORGOTTEN 状态保留数据,不参与默认检索
- Profile vs Event 二元结构:Profile 是属性快照(覆盖式),Event 是时间序列(追加式),同一信息可能同时进两边
待观察 / 改进点¶
- Reinforce 的幻觉风险:LLM 编造不存在的 gist_id 的命中率多少?
- 夜间合并的"重复窗口期"是否被 reinforce 充分缓解?需看实际 gist 增长曲线
- Vector embedding 列已建未用,是技术债还是未来路径?
- Profile 覆盖式更新如何处理冲突("去年住北京,今年住上海")?
- Memory Bank 启发的 v2 设计选项(2026-04-28 摄取后追加,不是必须跟,是设计选项;完整工程拆解 + 排期建议 + 反建议见 2026-04-28-memex-v2-design-options):
- 两种写入姿态并列(P1):增加 memory-as-a-tool 入口让 agent 显式写记忆(如用户说"记住这件事"),与现有被动批提取并存——参考 google-memory-bank
GenerateMemories+CreateMemory- Scope 演进为 arbitrary dict(P2,等触发):当前userId × projectId二维固定,Memory Bankarbitrary dict在多客户白标场景更灵活——可考虑增加 sessionId / agent_id 等额外维度 - Memory revisions API + IAM(P1,业务驱动力最强):当前可 DB 直查,但客户合规场景需要 API 层暴露 revision 历史 + 细粒度访问控制——参考 Memory Bank IAM Conditions 模式 - Topic 概念化对照(P3,与写入姿态配套做就顺手):当前 4 类(event / info / schedule / ai_insight)vs Memory Bank 4 个 managed topics——两组切分轴不同(Memex 按内容性质,Memory Bank 按用户视角),对照看是否漏了 source 维度
完整研究链路:→ 2026-04-28-memex-v2-design-options(每个借鉴点的工程拆解 / 工程量评估 / 业务驱动力 / 优先级 + 不应该做的事 + 反建议)
相关概念¶
- auto-memory — Claude Code 本地文件 memory,与 Memex 形成两套设计哲学的对照样本
- auto-dream — Claude Code 的整合机制,对应 Memex 的"夜间合并 + Reinforce"
- harness-engineering — Memex prompt 统一中文是"Cache 经济学"原则的实例
- ai-agent-moats — Memex 是 Sentino 的"数据飞轮"载体之一
- mem0 — Memex 主要对照的第三方方案之一,2022-2023 主流向量检索路线,与 Memex/Auto Memory 反方向
- google-memory-bank — 2026-04 新加入对照样本:托管路线代表,与 Memex 同为"后台流水线 + 异步提取"路线,差异在 topic 预定义 + 强制绑 Gemini + scope/IAM 治理内置;销售姿态从"对照 mem0 一家"扩到"对照 mem0 + Memory Bank 两家"
- sentino-agent — Memex 是 Sentino Agent 平台的长期记忆服务
- sentino — Sentino 选 Memex 模式与"AI 陪伴+记忆是核心资产"的产品定位匹配
- yukai-agora-poc — Memex 首次对外白标客户战(PRD 用 mem0 作能力代名词,Sentino 用 Memex 实际交付)
- process-data-vs-output-data — Memex 当前记产出(事实/偏好),未覆盖过程数据(agent 完成任务的最佳路径);潜在扩展方向
- work-experience-ownership — 客户向 Memex 写入终端用户记忆时的所有权约定问题(员工/用户/平台三方)
- why-change-why-you-why-now — Memex 销售姿态 4 Why 自检:Why you 强 / Why now + Why trust 弱,是 sentino-memex-positioning 销售材料补强方向
- plg-sales-coordination — Kim Graves "客户案例 > AI 口号"销售姿态印证 Memex 销售当前已经在做对(讲客户场景 + 行业对照而非"AI 记忆有多强")