一条信息在 PowerMem 中的完整旅程,从写入到淘汰的工程拆解

第一篇:PowerMem 记忆系统的遗忘设计,从神经元到代码工程

上一篇 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.72
  • adjustment_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_countlast_reviewed 记录已经复习了多少次
  • reinforcement_factor 决定复习一次能恢复多少

当到达 next_review 并完成一次复习时,review_count 递增、last_reviewed 更新、current_retentionreinforcement_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_termshort_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 将其总结为一条精炼的合成记忆。流程分两步:

  1. 贪心聚类:将相似度超过阈值(默认 0.85)的记忆归为一组
  2. LLM 摘要:使用提示模板让 LLM 生成精炼摘要,用一条合成记忆替换整个聚类

这三个机制与遗忘衰减协同,构成从**微观(逐条衰减)到宏观(批量压缩)**的完整记忆质量管理体系。


总结

信息量不小。回顾这条会议信息在 PowerMem 中走过的路:

复制代码
"下周五下午三点评审 Q2 需求文档" 进入系统
  ↓
重要性评估 → "这条信息有多重要?" → 0.72
  ↓
分类 → "分到哪一层?" → 短期记忆
  ↓
参数初始化 → "配一个衰减计时器" → 衰减率和复习间隔已排好
  ↓
时间流逝 → 衰减进行中,保留率持续下降
  ↓
被访问 → "还活着吗?需要升级吗?" → 检查通过,晋升为长期记忆
  ↓
被搜索 → "排在第几位?" → 时间新鲜度 × 语义匹配度
  ↓
全局优化 → "有重复吗?能压缩吗?" → 去重与合并

核心思路贯穿始终:用有限资源保留最有价值的信息,同时保持检索的高信噪比。

六个节点各司其职:

  • 重要性评估解决记住什么
  • 分类解决记住多久
  • 衰减解决何时淘汰
  • 访问触发解决动态调整
  • 搜索加权解决怎么找到
  • 全局优化解决怎么精简

我觉得 PowerMem 这套设计最有意思的地方在于,它没有把遗忘当作一个「要不要删」的二元问题来处理。从写入的那一刻起,衰减就在发生。但衰减不等于删除,它只是一个持续变化的权重,真正决定一条记忆命运的,是它有没有被再次访问,这跟人脑的工作方式很一致。

遗忘不是记忆系统的事后补救,而是贯穿整个生命周期的核心设计维度。


参考资料:

  1. PowerMem GitHub Repository --- https://github.com/oceanbase/powermem
  2. Ebbinghaus, H. (1885). Über das Gedächtnis (Memory: A Contribution to Experimental Psychology)
  3. Bjork, R. A. (1994). Memory and metamemory considerations in the training of human beings
  4. Wozniak, P. (1987). SuperMemo SM-2 Algorithm
  5. PowerMem Docs --- Ebbinghaus Forgetting Curve Guide

本文基于 PowerMem v1.1.1 源码分析撰写,所有代码引用均来自实际项目。

相关推荐
lipengxs4 小时前
写 README/技术方案时被 Ai 生成的 PlantUml/Mermaid 折腾烦了,做了个 预览小工具
ai·预览·plantuml·设计图
nuIl4 小时前
实现一个 Coding Agent(3):工具调用
前端·agent·cursor
审判长烧鸡4 小时前
【AI问答/Docker】Docker全命令对照表:命令+中文+示例+示例说明
docker·ai
nuIl4 小时前
实现一个 Coding Agent(4):ReAct 循环
前端·agent·cursor
nuIl4 小时前
实现一个 Coding Agent(1):一次 LLM 调用
前端·agent·cursor
nuIl4 小时前
实现一个 Coding Agent(2):让 LLM 流式响应
前端·agent·cursor
AI极客菌5 小时前
AI绘画工具中,为什么专业玩家爱用Stable Diffusion,普通玩家却喜欢Midjourney?
大数据·人工智能·ai·ai作画·stable diffusion·aigc·midjourney
腾视科技AI5 小时前
腾视科技大模型一体机解决方案:低成本私有化落地,重塑行业智能应用新格局
大数据·人工智能·科技·ai·边缘计算·算力·ai算力
装不满的克莱因瓶5 小时前
学习 LCEL 表达式:降低 LLM 应用开发难度
人工智能·ai·langchain·agent·智能体·lcel·langgraph