AI memory 已损坏。我们构建了一个会忘记的。
Source: Dev.to
实际效果示例
第 1 周: 你告诉代理 “我们前端使用 React”。
第 2 周: 你改了主意。 “改用 Svelte,React 包太大”。
第 4 周: 你问 “我们的前端技术栈是什么?”
普通的检索系统会把两个答案都返回。React 和 Svelte 并列,权重相等。系统中没有任何信息表明其中一个已被取代,所以代理可能会引用 React、Svelte,或两者的混乱组合。
在构建代理工具时我们屡次遇到这个问题,显而易见,问题不在检索质量,而在于这些系统没有时间或过时概念。
数据
我们在两套系统上模拟了一个为期 4 周的项目。共计 24 条事件——决策、纠正、错误、重复观察。项目中途出现两次重大方向转变。
| 指标 | Naive | Sparsion |
|---|---|---|
| 顶部结果是否正确 | 否 | 是 |
| 修剪的过时记忆数 | 0 | 2 |
| 第 4 周可检索条目数 | 24 | 22 |
Naive 检索会把过时条目放在最前;Sparsion 则把纠正放在首位——显著性 1.65 对比 0.55(过时的原始条目)。
Sparsion 的实际工作方式
它把记忆视为生命周期,而不是日志。
Events → Salience Scoring → Hot → Warm → Cold → Forgotten- 旧记忆随时间衰减(指数衰减,可配置半衰期)
- 重复事件会增强(对数频率)
- 可以将事项标记为 critical——其存活时间是普通记忆的 4 倍
- 默认情况下,纠正的得分是观察的 3 倍
- 低于显著性阈值的记忆会被完全剔除检索
一次关键纠正进入系统时的显著性为 13.18。一次随意观察的显著性为 0.77。若六周未再强化,观察会消失,而纠正仍然保留。
试一试
from sparsion import Runtime
rt = Runtime("agent_memory.db")
# Week 1
rt.record("user", "decision", "Frontend framework: React", importance="high")
# Week 2
rt.record(
"user",
"correction",
"Switching to Svelte — React bundle too large",
importance="critical"
)
# Query
memories = rt.query(text="frontend", limit=3)
for m in memories:
print(f"[{m['tier']}] {m['content']} (salience: {m['salience']:.2f})")
# [Hot] Switching to Svelte — React bundle too large (salience: 13.18)
# [Hot] Frontend framework: React (salience: 4.39)
# Age everything
result = rt.sweep()
print(f"Forgot {result['forgotten']} stale memories")底层实现
Rust 核心,Python 绑定通过 PyO3/maturin,SQLite 负责存储。无模型依赖——显著性评分目前采用启发式算法。
Rust core
├── Event store (SQLite)
├── Salience scorer
├── Tier manager (hot/warm/cold)
├── Decay engine
└── Ranked retrieval
↓
PyO3 → Python SDK (pip install sparsion)测试:12 个 Rust 单元测试,5 个集成测试(通过 MockClock 实现确定性时间),4 个 Python 端到端测试。
v0.1 包含内容
- 可配置半衰期的时间衰减
- 通过重复进行强化
- 重要性提示(low/normal/high/critical)
- 事件类型权重——纠正 > 决策 > 错误 > 动作 > 观察
- 通过存储实现的层级迁移与遗忘循环
- Python SDK
未来计划
- 接入真实代理工作流
- 更大的基准测试,延长时间视野
- 矛盾感知的更新机制
- LangChain 记忆后端
如果你正在构建代理并且一直受到过时上下文的困扰,欢迎分享你的使用案例。
Sparsion Runtime –