上一篇 PowerMem 记忆系统的遗忘设计,从神经元到代码工程 从认知科学的角度聊了遗忘机制,包括突触可塑性、艾宾浩斯遗忘曲线、间隔重复和理想的困难。都是一些很有意思的认知学理论。
这一篇换个视角。不聊理论了,以一条消息的流转路径为线索,跟踪它在 PowerMem 中从写入到淘汰的完整生命周期。看看一路上,遗忘这个设计是怎么工作的。
一、重要性评估:这条信息值得记住吗?
先说一个场景。
假设发了这么一条消息:
下周五下午三点和产品团队在 3 号会议室评审 Q2 需求文档。
这条消息进入记忆系统后,第一个问题不是「怎么记住」,而是「值不值得记住」。
简单说,如果所有信息都以相同的权重被存储和检索,随着数据量增长,系统会面临两个问题:检索信噪比持续下降,存储成本不可控。
香农信息论解释了这件事。高概率事件的信息量趋近于零,不值得长期存储。低概率但关键事件的信息量极大,必须持久化保留。
重要性评估就是干这件事的信息过滤器。 它为每条信息打一个分数,这个分数决定后续的衰减速度、复习频率和淘汰优先级。
1.1 六维度评估模型
PowerMem 评估一条信息的重要性,比想象中复杂。它使用了一个六维评估模型,从六个维度进行综合评估、加权汇总:
| 维度 | 权重 | 评估什么 |
|---|---|---|
| relevance(关联度) | 0.30 | 信息与用户当前上下文的关联程度 |
| novelty(新颖度) | 0.20 | 信息的新鲜程度,是否为首次出现 |
| emotional_impact(情感强度) | 0.15 | 信息是否包含强烈的情感色彩 |
| actionable(可操作性) | 0.15 | 信息是否需要用户采取行动 |
| factual(事实性) | 0.10 | 信息的客观事实程度 |
| personal(个人相关性) | 0.10 | 信息与用户个人的关联程度 |
拿前面举例的会议消息来说。它与「Q2 的工作」高度相关(relevance ≈ 0.8),包含明确的时间地点(factual ≈ 0.8),用户必须参加不能错过(actionable ≈ 0.9),但情感上中性(emotional_impact ≈ 0.2)。加权计算出的重要性分数大致如下:
0.3×0.8 + 0.2×0.5 + 0.15×0.2 + 0.15×0.9 + 0.1×0.8 + 0.1×0.6 ≈ 0.72
1.2 双路径评估:LLM 与规则引擎
基于这个评估模型 PowerMem 设计了两条评估执行路径。核心目的只有一个:确保系统在任何情况下都能给出评分。
路径一:LLM 深度评估(优先)
当 LLM 可用时,系统要求 LLM 根据六维度评估模型从六个维度分别分析,返回结构化 JSON。比如:
json
{
"importance_score": 0.72,
"reasoning": "会议安排对用户具有明确的时间约束和行动要求",
"criteria_scores": {
"relevance": 0.8,
"novelty": 0.5,
"emotional_impact": 0.2,
"actionable": 0.9,
"factual": 0.8,
"personal": 0.6
}
}
PowerMem 从 LLM 回复的结构化 JSON 中提取 importance_score 字段拿到分数。这里用了一个三级回退的方式来确保即使 LLM 返回格式不规范,系统也不会崩。首先尝试 JSON 解析,解析失败了就用正则表达式匹配数字,再失败则返回保底的默认值 0.5。
值得注意的是,LLM 返回的结构化 JSON 中的六维数据实际上并未直接参与最后权重的计算。它只是通过 Chain-of-Thought / 结构化分解来辅助 LLM 推理,让最终答案更可靠稳定。
路径二:规则引擎(兜底)
当 LLM 不可用时,规则引擎接管重要性分数的计算。精度会有所下降,但能保证系统不挂。它基于一组可量化的信号累加分数:
- 内容长度 > 100 字符:+0.1;> 50 字符:+0.05
- 命中关键词:每个 +0.1
- 包含
?或!:各 +0.05 - 元数据标记了优先级(high/medium):+0.2/+0.1
- 最终分数上限为 1.0
规则引擎精度不如 LLM,但确保了系统在 LLM 不可用时仍能正常运行。这种**优雅降级(graceful degradation)**设计是生产级系统的重要特征。说白了,不会因为一个外部服务的故障,就导致整个记忆系统停摆。

二、分类与参数初始化
2.1 三层记忆模型
重要性分数确定了,下一步是分类。分类决定信息属于哪一层的记忆。
上一篇聊过大脑的记忆分层机制,即信息先进入容量有限的海马体(短期存储),经过记忆巩固后转移至新皮层(长期存储)。只有那些被反复激活的、与已有知识建立了丰富关联的、或伴随强烈情绪体验的信息,才能获得优先转移权。
PowerMem 把这个过程翻译为三层模型:
| 层级 | 生物学类比 | 倍率 | 典型存活时间 |
|---|---|---|---|
| working(工作记忆) | 前额叶皮层 | ×0.5 | 数小时~1 天 |
| short_term(短期记忆) | 海马体 | ×1.5 | 数天~数周 |
| long_term(长期记忆) | 新皮层 | ×2.0 | 数周~数月 |
分类逻辑以重要性分数为依据。≥ 0.8 进入 long_term,≥ 0.6 进入 short_term,其余归入 working。不同层级的衰减速率不同,层级越高衰减越慢,信息活得越久。
python
if score >= self._algo.long_term_threshold: # 0.8
return "long_term"
if score >= self._algo.short_term_threshold: # 0.6
return "short_term"
return "working"
前面算出来的会议信息 importance = 0.72,命中了 ≥ 0.6 但不到 0.8。所以落入 short_term(短期记忆)。
2.2 遗忘参数初始化
分类只回答了「这条信息该待在哪一层」。更具体的问题是:初始强度是多少?忘得有多快?什么时候该再复习一遍?
PowerMem 在分类完成后,会为每条记忆生成一整套可随生命周期演进的数值档案。除了正文内容之外,系统还会为这条记忆建立一份元数据卡片,用来记录强度、衰减参数、复习计划和管理状态等。
结构上分成两块:
| 子字段 | 设计职责 |
|---|---|
metadata.intelligence |
数值指标:重要性、层级、保留率、衰减率、复习时刻表、访问/复习计数等 |
metadata.memory_management |
记忆生命周期开关:是否待晋升、待遗忘、待归档、是否仍活跃 |
下面逐一说明每个参数的设计意图和计算方式。还是以会议信息为例(importance = 0.72,short_term)。
2.2.1 初始保留率
同样一句「下周开会」,随口一提和被标记为必须参加的关键日程,在形成瞬间的牢固程度完全不同。信息进入记忆时被加工得越深(有没有理解、有没有跟已有知识关联、有没有行动意图),形成的记忆就越牢固。
所以在 PowerMem 中很自然地,越重要的信息在写入时就被赋予越高的初始保留率。同样以会议消息为例,初始保留率为:
python
initial_retention = self.initial_retention * importance_score
# 会议示例:1.0 × 0.72 = 0.72
importance_score 是前面算出来的重要性参数,self.initial_retention 是全局配置参数,默认 1.0。
实际上会写入两个字段:
initial_retention字段,用于记录创建时的快照(当初记得有多牢)current_retention字段,用于跟踪当前的有效保留水平
创建时两者数值相同,之后 current_retention 会随衰减和复习而变化。
一条 importance = 0.3 的信息,起跑线只有 0.3。低重要性内容在认知层面本就应更脆弱,更容易在竞争中让出存储与检索带宽。这很合理。
2.2.2 由层级决定遗忘速度
working / short_term / long_term 对应到工作记忆、海马体、新皮层。三者的差异不只是标签,更是不同的遗忘动力学。越接近长期存储层,单位时间内的遗忘应越慢。如果所有层级共用同一衰减系数,三层模型就退化成单层分类,生物学类比的意义就没了。
在全局基础衰减率(默认 0.1,可通过配置调节)之上,按记忆层级乘以类型倍率,就可以得到本条记忆专属的衰减参数。
在 PowerMem 中不同记忆层级的类型倍率为:
python
{
"working": 0.5, # 强度参数 S 最小,忘得最快
"short_term": 1.5,
"long_term": 2.0, # 强度参数 S 最大,忘得最慢
}
会议信息落在 short_term,倍率为 1.5,那么根据公式,当前这条消息的衰减参数为:
0.1(全局基础衰减率) × 1.5(short_term 倍率) = 0.15
可以看到 衰减参数越大,遗忘越慢。所以 short_term 比 working 更耐忘,long_term 最耐忘。
2.2.3 复习调度:间隔重复与「理想的困难」
间隔重复的核心原则是复习先密后疏。在「快要忘记但还能拯救」的时间窗内进行复习。不能太早(等于白看一遍),也不能太晚(已经彻底忘了)。
所以 PowerMem 的设计是:记忆创建时就排好复习时间点,而不是等到需要时才临时决定。
PowerMem 通过两步生成这张复习时刻表(算出了具体的绝对时间点)。
第一步:确定基准间隔。
系统预设五个基准间隔(小时):[1, 6, 24, 72, 168],分别对应约 1 小时、6 小时、1 天、3 天、7 天。五个间隔是全局配置,所有记忆共享同一组基准值。
第二步:按重要性压缩间隔。
基准间隔对所有记忆一视同仁,但不同重要性的记忆不该用同一个节奏复习。一条密码信息应该比一句闲聊被更频繁地唤醒。所以系统用了一个公式,根据重要性分数对每个基准间隔做压缩:
python
adjusted_interval = interval * (1 - importance_score * adjustment_factor)
interval是基准间隔的数据(如 1h、6h、24h)importance_score是前面算出来的重要性参数 0.72adjustment_factor是压缩系数(默认 0.3),控制压缩的力度- 乘积
importance_score × adjustment_factor决定了最多能压缩多少 adjusted_interval是压缩后的实际间隔,下限 0.5 小时
公式太抽象,还是用会议信息(importance = 0.72)来拆一遍。
这时压缩乘子是:
1 - 0.72 × 0.3 = 0.784
也就是说,每个基准间隔都会变成原来的 78.4%。通过计算得出的五个时间点如下:
| 次序 | 基准间隔 | 调整后间隔 | 建议复习时刻(示意) |
|---|---|---|---|
| 第 1 次 | 1h | ≈ 0.78h(约 47 分钟) | T₀ + 47min |
| 第 2 次 | 6h | ≈ 4.7h | T₀ + 4.7h |
| 第 3 次 | 24h | ≈ 18.8h | T₀ + 18.8h |
| 第 4 次 | 72h | ≈ 56.4h(约 2.4 天) | T₀ + 2.4d |
| 第 5 次 | 168h | ≈ 131.7h(约 5.5 天) | T₀ + 5.5d |
换个角度,再看一条没那么重要的信息。假设 importance = 0.3,压缩乘子变成:
1 - 0.3 × 0.3 = 0.91
这条信息的五个复习时间点会更靠后:
| 次序 | 基准间隔 | 调整后间隔 | 建议复习时刻(示意) |
|---|---|---|---|
| 第 1 次 | 1h | ≈ 0.91h(约 55 分钟) | T₀ + 55min |
| 第 2 次 | 6h | ≈ 5.46h | T₀ + 5.46h |
| 第 3 次 | 24h | ≈ 21.84h | T₀ + 21.84h |
| 第 4 次 | 72h | ≈ 65.52h(约 2.7 天) | T₀ + 2.7d |
| 第 5 次 | 168h | ≈ 152.88h(约 6.4 天) | T₀ + 6.4d |
把两组数据放在一起,对比会更直观:
| 次序 | importance = 0.72 | importance = 0.3 | 差距 |
|---|---|---|---|
| 第 1 次 | ≈ 0.78h | ≈ 0.91h | 约 8 分钟 |
| 第 2 次 | ≈ 4.7h | ≈ 5.46h | 约 46 分钟 |
| 第 3 次 | ≈ 18.8h | ≈ 21.84h | 约 3 小时 |
| 第 4 次 | ≈ 56.4h | ≈ 65.52h | 约 9.1 小时 |
| 第 5 次 | ≈ 131.7h | ≈ 152.88h | 约 21.2 小时 |
效果很明显。importance = 0.72 的会议信息,五轮复习都被明显提前;importance = 0.3 的普通信息,间隔只被轻微压缩。越往后,差距越大。重要性越高,系统越早把它拉回复习窗口,记忆被重新巩固的机会也就越多。
算完五个时间点后,系统把它们存入完整的复习时刻表。同时会初始化几个配合时刻表工作的字段:
| 字段 | 含义 |
|---|---|
next_review |
时刻表中的第一个时间点,即下一次建议复习的时间。系统通过这个字段知道最近一次复习该在什么时候 |
last_reviewed |
最近一次复习的时间戳。刚创建时等于创建时刻,之后每完成一次复习就更新 |
review_count |
已经完成了几轮复习。创建时为 0,每完成一轮加 1 |
reinforcement_factor |
复习成功后保留率的提升幅度(默认 0.3)。决定每次温故能补回多少遗忘 |
这几个字段和时刻表一起,构成了一套完整的复习追踪机制:
next_review告诉系统什么时候该复习review_count和last_reviewed记录已经复习了多少次reinforcement_factor决定复习一次能恢复多少
当到达 next_review 并完成一次复习时,review_count 递增、last_reviewed 更新、current_retention 按 reinforcement_factor 提升,next_review 推进到下一个时间点。至此形成提取再巩固的工程闭环。

2.2.4 管理标志:生命周期状态机
除了保留率、衰减率、复习时刻这些连续的数值,记忆在系统中还有一些状态需要管理:这条记忆是否该晋升到更高的层级?是否该被淘汰?是否该从活跃检索池中移除?
在 PowerMem 中也有这些标志位,创建时初始化为全新、活跃、尚未触发任何处置:
json
{
"should_promote": false,
"should_forget": false,
"should_archive": false,
"is_active": true
}
每个标志对应一种生命周期动作:
should_promote:这条记忆是否应该晋升到更高的层级(如 working → short_term)。如果一条 working 记忆被反复访问,说明它对用户很有价值,应该晋升到 short_term 甚至 long_term,获得更慢的衰减速度。should_forget:这条记忆是否应该被淘汰。当衰减因子跌破阈值(0.3)或者一条记忆在 7 天内从未被任何人访问过,系统就会标记它为待遗忘。should_archive:这条记忆是否应该从活跃检索池转入归档。归档不同于遗忘,归档的记忆不会被物理删除,只是不再参与日常检索。is_active:这条记忆是否仍处于活跃状态,参与正常的检索和服务。
除此之外,intelligence 中还会初始化一个 access_count 计数器,记录这条记忆被访问了多少次。这个计数器和标志位们配合工作。比如 should_promote 的判断条件之一就是被访问超过 3 次。
2.2.5 落库:完整的元数据档案
所有参数都计算完毕后,系统将它们打包成一个结构化的字典返回。在新增记忆时,合并进记忆的 metadata 元数据中,与正文内容一并写入存储后端。
至此参数建档完成。计时器从这一刻开始滴答作响。

三、衰减计算
艾宾浩斯遗忘曲线的数学形式为:R(t) = e^(-λt),指数衰减。记忆刚形成时保留量高,遗忘速度最快,随着时间推移,遗忘速度也随之放缓。
3.1 PowerMem 的衰减公式
PowerMem 把理论公式翻译为代码:
python
rate = self.decay_rate if decay_rate is None else decay_rate
decay_factor = math.exp(-hours_elapsed / (24 * rate))
其中 24 × rate 扮演的是记忆强度 的角色,记作 S(Strength)。S 越大,分母越大,指数衰减越慢,记忆越持久。两者的等价关系:
代码:decay_factor = e^(-t / S),其中 S = 24 × rate
理论:R(t) = e^(-λt)
等价:λ = 1 / S = 1 / (24 × rate)
rate 就是前文中按记忆类型算好的衰减参数。
还是这条会议信息,short_term 的 rate = 0.15,代入后 S = 24 × 0.15 = 3.6。也就是说,会议信息的衰减频率大约每 3.6 小时保留率降至原来的 37%。
不过不是所有衰减计算都用记忆自己的 rate。PowerMem 中还存在一条回退链:调用方会先按记忆类型算出类型专属的衰减率并传入。如果调用方没有传,就使用全局默认的衰减率,这种机制保证了即使旧版本的元数据中缺少类型信息,衰减计算也不会出错。
3.2 一个关键的工程取舍
这里有个细节很有意思。
从经典的艾宾浩斯实验数据反推出 λ ≈ 0.821。但 PowerMem 默认配置对应的 λ ≈ 0.417,大约只有文档推导值的一半:
| 参数来源 | λ 值 | 1 小时后保留率 | 设计意图 |
|---|---|---|---|
| 经典艾宾浩斯实验数据 | ~0.821 | ~44% | 无意义音节(ZOF、WUX),纯记忆实验 |
| PowerMem 默认配置 | ~0.417 | ~66% | 语义信息,天然遗忘更慢 |
这个差异不是 bug,这是一个工程决策。
理论上艾宾浩斯使用的是无意义音节,人类对这类孤立符号的遗忘速度最快,但 PowerMem 存储的是具有语义关联的实际信,对语义信息的遗忘当然会比孤立音节更慢,所以 PowerMem 使用了更温和的衰减速率来匹配这一现实。
衰减参数(可在 .env 中配置 INTELLIGENT_MEMORY_DECAY_RATE)可以精细控制遗忘的激进程度:
| decay_rate | S = 24 × rate | λ = 1/S | 1 小时后保留率 | 风格 |
|---|---|---|---|---|
| 0.05 | 1.2 | ~0.833 | ~43% | 激进遗忘 |
| 0.1(默认) | 2.4 | ~0.417 | ~66% | 平衡 |
| 0.2 | 4.8 | ~0.208 | ~81% | 温和遗忘 |
衰减参数越小,遗忘越激进。映射到三层记忆模型里:working 的倍率最低(×0.5),遗忘最快。long_term 的倍率最高(×2.0),遗忘最慢。
3.3 衰减时间表
现在把上面的一切串起来,就会得到这条会议信息完整的衰减过程:
| 时间 | 距创建时长 | 衰减因子 | 状态 |
|---|---|---|---|
| 刚创建 | 0h | 1.000 | 新鲜 |
| 1 小时后 | 1h | ≈ 0.757 | 轻度衰减 |
| 4.3 小时后 | 4.3h | ≈ 0.300 | 跌破遗忘阈值(0.3) |
| 6 小时后 | 6h | ≈ 0.189 | 深度衰减 |
| 24 小时后 | 24h | ≈ 0.0013 | 几乎归零 |
可以看到一条 short_term 记忆在约 4.3 小时后衰减因子就会跌破 0.3 的遗忘阈值,但这并不意味着它会被立即删除,遗忘决策的执行时机,取决于记忆何时被访问。
四、访问触发
4.1 为什么遗忘决策要延迟到访问时
衰减一直在后台进行,但遗忘的决策只在实际访问记忆时才被执行。
这里有个认知学背景。当一个已巩固的记忆被主动提取时,它会暂时回到可塑状态,然后需要重新巩固。这个提取到再巩固的循环会加强对应的神经连接。
在工程层面,这意味着记忆的命运不应该由时间单向决定,而应该在每次被访问时重新评估。
访问是记忆系统最重要的反馈信号。 一条信息被频繁访问,说明它对用户有价值,应该被保留甚至晋升。一条信息长期无人问津,即使最初很重要,也应该被遗忘。这种懒惰求值的设计降低了系统的计算负担,不需要后台定时任务批量扫描所有记忆。
4.2 四道关卡
当用户通过 Memory.get() 或 Memory.search() 访问记忆时,会依次执行四道检查。
第一关:遗忘检查
两个触发遗忘的条件:
python
# 衰减因子跌破阈值
rate = self._resolve_decay_rate(memory)
decay_factor = self.calculate_decay(created_at, decay_rate=rate)
if decay_factor < self.working_threshold: # 0.3
return True
# 静默遗忘,从未被使用且已过 7 天
if access_count == 0 and time_elapsed > timedelta(days=7):
return True
两个条件满足其一即触发遗忘。第一条,衰减到了阈值以下,该淘汰了。第二条也容易理解,从未被使用过本身就是最强的遗忘信号。
满足了遗忘触发条件,调用方负责执行删除。
第二关:晋升检查
三个条件,满足其一即晋升:
python
# 高频访问(被访问 3 次以上)
if access_count >= 3:
return True
# 通过时间检验(存活超过 24 小时)
if time_elapsed > timedelta(hours=24):
return True
# 本质上很重要(重要性分数大于0.6)
if importance >= self.short_term_threshold: # 0.6
return True
晋升的效果:working → short_term 或 short_term → long_term。衰减速率倍率从高降到低,信息获得更长的寿命。
在会议信息这个例子中,importance=0.72 ≥ 0.6,第一次访问时就直接满足晋升条件。如果它此时还是 short_term,将升级为 long_term。一条信息通过晋升机制,实现了从临时便签到长期知识的演变。
这是人脑记忆巩固过程的工程对应。
第三关:归档检查
两个条件:
python
# 自然老化(超过 30 天)
if time_elapsed > timedelta(days=30):
return True
# 本质上不重要(重要性分数小于0.3)
if importance < self.working_threshold: # 0.3
return True
归档不同于遗忘。被归档的记忆不会被物理删除,但从活跃检索池中移除,进入存档状态。用户仍可通过专门的归档检索接口访问。
第四关:周期重处理
每当访问次数是 5 的倍数(第 5 次、第 10 次......),或记忆类型发生变更,系统重新计算全部 Ebbinghaus 元数据。这确保记忆的参数始终与其访问模式保持一致。随着访问累积,衰减率和复习调度逐步趋于稳定,这正是间隔重复效应在工程层面的体现。

五、搜索加权
5.1 干扰理论在搜索中的体现
记忆的困难不在于存不进去,而在于取不出来。随着存储信息增多,记忆之间的交叉干扰呈指数级增长。
当用户搜索「Q2 评审」时,如果系统只按语义相似度排序,可能出现这种情况:一条 3 个月前的会议纪要语义完美匹配,排在最前面。而昨天刚更新的评审时间变更信息排在后面。语义匹配度最高 ≠ 用户最需要。
PowerMem 通过为搜索结果引入时间维度来解决这个问题。
5.2 排序公式
先上公式:
final_score = relevance_score × decay_factor
relevance_score是关键词匹配度decay_factor是前面提到的衰减因子
这个公式做了一次交叉排序。高语义匹配但时间久远的记忆,可能被中等匹配度但非常新鲜的记忆超越:
| 记忆 | 语义匹配度 | 衰减因子 | final_score | 排名 |
|---|---|---|---|---|
| 1 分钟前的闲聊,中等匹配 | 0.45 | 0.99 | 0.45 | 1 |
| 3 小时前的会议记录,高度匹配 | 0.92 | 0.29 | 0.27 | 2 |
| 10 天前的会议记录,完美匹配 | 0.98 | ~0.00 | ~0.00 | 末尾 |
大白话讲,新鲜度在搜索排序中有一票否决权。再怎么匹配,衰减到接近零的老记忆也会被沉到底部。
此外,搜索本身也是记忆访问。在进行搜索时,会对每条搜索结果依次调用 Memory.get,实现批量生命周期管理。
六、全局优化
6.1 为什么需要全局优化
前面讲的都是针对单条记忆的实时管理。但记忆系统还需要周期性的全局治理。随着信息不断积累,重复、冗余、碎片化等问题都会逐渐显现。
这类似于大脑在睡眠阶段进行的记忆整理。海马体将记忆重放并转移至新皮层,同时去除重复信息、合并相似记忆、强化重要连接。
PowerMem 提供三种互补的优化策略。
6.2 三种优化策略
(1)精确去重
基于内容哈希的精确匹配。系统维护一个 hash → [memories] 的映射,保留每组中最早创建的记录,删除其余。一次最多处理 10,000 条记录。
完全相同的两条信息只留一条。这是最基础的清理。
(2)语义去重
基于 embedding 余弦相似度,识别语义高度近似但措辞不同的记忆。使用 O(N×M) 逐对比较,默认阈值 0.95。相似度超过阈值的较新记忆被删除,保留最早的那条。
比如「Q2 评审改到下周三了」和「Q2 review 推迟到下周三」语义相同但文字不同,语义去重能识别出来。
(3)记忆压缩
对多条语义相似但不严格重复的记忆,使用 LLM 将其总结为一条精炼的合成记忆。流程分两步:
- 贪心聚类:将相似度超过阈值(默认 0.85)的记忆归为一组
- LLM 摘要:使用提示模板让 LLM 生成精炼摘要,用一条合成记忆替换整个聚类
这三个机制与遗忘衰减协同,构成从**微观(逐条衰减)到宏观(批量压缩)**的完整记忆质量管理体系。
总结
信息量不小。回顾这条会议信息在 PowerMem 中走过的路:
"下周五下午三点评审 Q2 需求文档" 进入系统
↓
重要性评估 → "这条信息有多重要?" → 0.72
↓
分类 → "分到哪一层?" → 短期记忆
↓
参数初始化 → "配一个衰减计时器" → 衰减率和复习间隔已排好
↓
时间流逝 → 衰减进行中,保留率持续下降
↓
被访问 → "还活着吗?需要升级吗?" → 检查通过,晋升为长期记忆
↓
被搜索 → "排在第几位?" → 时间新鲜度 × 语义匹配度
↓
全局优化 → "有重复吗?能压缩吗?" → 去重与合并
核心思路贯穿始终:用有限资源保留最有价值的信息,同时保持检索的高信噪比。
六个节点各司其职:
- 重要性评估解决记住什么
- 分类解决记住多久
- 衰减解决何时淘汰
- 访问触发解决动态调整
- 搜索加权解决怎么找到
- 全局优化解决怎么精简
我觉得 PowerMem 这套设计最有意思的地方在于,它没有把遗忘当作一个「要不要删」的二元问题来处理。从写入的那一刻起,衰减就在发生。但衰减不等于删除,它只是一个持续变化的权重,真正决定一条记忆命运的,是它有没有被再次访问,这跟人脑的工作方式很一致。
遗忘不是记忆系统的事后补救,而是贯穿整个生命周期的核心设计维度。
参考资料:
- PowerMem GitHub Repository --- https://github.com/oceanbase/powermem
- Ebbinghaus, H. (1885). Über das Gedächtnis (Memory: A Contribution to Experimental Psychology)
- Bjork, R. A. (1994). Memory and metamemory considerations in the training of human beings
- Wozniak, P. (1987). SuperMemo SM-2 Algorithm
- PowerMem Docs --- Ebbinghaus Forgetting Curve Guide
本文基于 PowerMem v1.1.1 源码分析撰写,所有代码引用均来自实际项目。