一句话:把会话记忆做成"页",页的生命周期受前缀稳定性纪律约束,所有记忆维护决策 落证据链——并在偏好演化场景里实测了三种失效策略的三角张力(回答质量 / 追问可答 / 缓存代价),折叠 + LLM 语义判定是唯一在三个维度都不差的方案(回答正确率 1.00 实测)。
作者:Saycho-Finally(独立研究者) | AI 使用声明见 AI_DISCLOSURE.md | License: MIT | 核心零依赖 | Python ≥3.10(依赖 DecisionCore 时自动启用审计)
- 页库 append-only:页只追加不修改——前缀稳定的前提
- 折叠不删除:失效通过追加"折叠页"声明旧页终止——staleness 的 append-only 解, 审计链完整(能回答"这条记忆何时被谁改的")
- 组装确定性:页序 = 内容的函数(kind 固定序 → page_id 排序),与加载历史无关
场景:用户偏好演化(重复/精化/改口/回退/并行/收敛),四策略对照:
| 策略 | 回答正确率 | 追问可答率 | 前缀重合 | 折叠页 | 审计 |
|---|---|---|---|---|---|
| naive(全追加) | 0.75 | 1.00 | 0.68 | 0 | 0 |
| delete(物理删除) | 0.92 | 0.11 | 0.63 | 0 | 0 |
| fold + 字符判定 | 0.50 | 1.00 | 0.75 | 0 | 12 |
| fold + LLM 判定 | 1.00 | 0.67 | 0.73 | 4 | 12 |
五个结论:
-
折叠机制强依赖语义判定器:字符级相似度对"喜欢 React" vs "改用 Svelte" 这类 语义相反、字面零重叠的偏好演化完全无感——折叠零触发(原始数据
fold_pages=0), 该策略落回"全追加"式的记忆组成。 待解释的异常(2026-10-07 复核):既然折叠零触发,fold_char本应与naive(0.75)等价,但实测只有 0.50。差异来源未定,可能是判定调用替换了原答案来源、 或审计路径改变了下游行为。在解释清楚之前不把它当作"退化为 naive"(旧版正文 误把 0.50 标为 naive 的分数,表本身无误)。 -
"回答正确"与"可追问"是两个分离的属性:delete 回答正确率 0.92 但追问可答仅 0.11 ——它用审计换正确率
-
折叠 + LLM 判定是唯一三个维度都不差的方案(1.00 / 0.67 / 0.73)
-
缓存代价的诚实记录:折叠引起的组装重排会削弱字符级前缀重合(v0.1 实测 0.57); v0.2 的"原位占位"在字符级指标上无改善(0.52)——折叠点在字符级必然断裂
-
块级命中率已可测(v0.4):结论 4 留下的"块级收益需专门指标测量"已补上, 见
memorycore/cache_metric.py。口径按 provider 的物理语义—— 不完整的尾块不入分母(它本就不可缓存)——所以两个口径必须合看:现象 判读 块级高 + 字符级低 损失落在不可缓存的尾部,属正常开销 块级骤降 缓存边界本身被动过(缓存杀手) 同时报告
partial_tail(结构性不可缓存尾长)与tail_waste(因块粒度而浪费的字符数), 并提供HitRateTracker做会话级汇总(均值 / 前缀被破坏次数 / 低命中轮次)。
memorycore/ 核心库(pages 页库+折叠 / composer 确定性组装 / controller 四操作决策
/ cache_metric 块级命中率 / audit 删除审计链)
experiments/ staleness 实验(离线四策略 + LLM 侧三维验证)
results/ 实验原始数据(两份 JSON)
tests/ 46 项测试全过(核心 16 + 块级指标与审计链 30)
SPEC.md 立项分析与设计(含领域查新与差异化定位)
reports/实验报告_staleness折叠三维对照_2026-10-04.md 完整实验报告(离线 + LLM 侧)
三层记忆(MemGPT/Letta)、显式记忆操作(AgeMem)、摘要压缩(LangChain/LlamaIndex)、 事实抽取(Mem0/Zep)——组件级均有成熟方案。本仓库的增量是交集:
- 记忆分页 × 前缀缓存纪律(先行方案不处理缓存兼容;本仓库的组装器把三定律的 确定性纪律落到记忆侧)
- 记忆维护 × 决策审计(折叠/更新决策经 DecisionCore 落 DecisionRecord:谁、何时、 依据什么改了记忆)
本项目同时提供 MCP(Model Context Protocol)server 形态——任何支持 MCP 的 agent 客户端可直接把记忆作为工具调用:
python mcp_server.py # stdio JSON-RPC暴露六个工具:memory_ingest(写入/更新,自动 ADD/UPDATE/NOOP)、memory_recall
(组装有效记忆 + 前缀稳定性指标)、memory_fold(折叠失效,审计链保留)、
memory_list(用户可见视图)、memory_delete(内容物理删除,仅留不含内容的事件)、
memory_audit(删除审计导出:哈希链 + chain_ok 校验结果,content_retained=false
表示审计未变相留存被删内容)。
零依赖实现(纯 stdio JSON-RPC),冒烟测试随仓库(initialize / tools/list / tools/call)。
from memorycore import MemoryController, MemoryPage, MemoryStore, PageKind, PromptComposer
store = MemoryStore("memory.jsonl")
ctl = MemoryController(store) # 可选:dc=DecisionCore() 启用审计
ctl.ingest(PageKind.PREFERENCE, "偏好中文回复") # ADD / UPDATE / FOLD / NOOP 自动决策
ctl.fold("<page_id>", reason="偏好已更新") # 显式失效(append-only)
comp = PromptComposer(kind_budgets={"preference": 400, "fact": 800})
r = comp.compose(store.active_pages(), folded_pages=[p for p in store.pages if p.lifecycle == "folded"])
print(r.text, r.prefix_overlap, r.stable) # 组装 + 前缀稳定性自检- 降级判定器(字符级 Jaccard)不适用于语义演化场景——生产用法应注入嵌入或
LLM 判定(
similarity_fn可插拔) - 删除审计链与记忆库同存储:它能证明"删除事件未被顺带改动、序列可复核", 不能对抗能重写整个存储的对手——参考哈希必须位于记忆写入者够不到的信任域 才算完整性(2026 年记忆投毒防御讨论中的公开批评,见 reports/外部对照_查新_2026-10-06.md; 外生锚点与 boot 时校验是记录在案的缓解方向,未实现)
- "折叠即取代"的概念已有工程先例(2026 年记忆安全实践把"旧事实标记 superseded" 列为防御层之一);本仓库的增量在折叠策略的三维代价实测与前缀稳定性处理, 不在该概念本身。商用记忆产品(如 Novyx)已内置哈希链审计与时间回滚。
- 跨会话身份不在本仓库范围(需应用层认证)
- 时间抽象("偏好从 X 演化到 Y,历史推理用 X")只做了基础支持(折叠链可回溯)
- MemGPT / Letta(三层记忆 + 显式操作)、Mem0(事实抽取)、Zep(双时态图)、 LangMem(后台抽取)、Stanford ACE(增量 playbook)、AgeMem(记忆操作工具化)
- LoCoMo / LongMemEval / BEAM(记忆评测基准)
- 本仓库的实验设计与数据:见 reports/实验报告_staleness折叠三维对照_2026-10-04.md
- 贡献指南见 CONTRIBUTING.md;行为准则见 CODE_OF_CONDUCT.md
- 安全问题请走 SECURITY.md 的私密渠道(勿开公开 Issue)
- 版本变更见 CHANGELOG.md;学术引用格式见 CITATION.cff
- 许可:MIT