一条消息进入数据库后,OceanBase PowerMem 是怎么决定哪些该记、哪
先说一个场景。假设发了这么一条消息:
下周五下午三点和产品团队在 3 号会议室评审 Q2 需求文档。
当这条消息进入记忆系统后,第一个问题不是问「怎么记住」,而是要先判断「值不值得记住」。如果所有信息都以相同的权重被存储和检索,随着数据量增长,系统会面临两个问题:检索信噪比持续下降,存储成本不可控。
重要性评估就是干这件事的,它是信息过滤器。 它会为每条信息打一个分数,这个分数决定后续的衰减速度、复习频率和淘汰优先级。
那么重要性如何评估?
六维度评估模型
在 OceanBase PowerMem 中评估一条信息的重要性比想象中复杂。它使用了一个六维评估模型,即从六个维度进行综合评估、加权汇总:

拿前面举例的会议消息来说。它与「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
即最终得出的重要性评估分数为 0.72。
六维评估模型是重要性评估的重要理论基础。
双路径评估:LLM 与规则引擎
OceanBase PowerMem 设计了两条重要性评估执行路径,确保系统在任何情况下都能给出评分。
第一条路径就是基于六维评估模型得出的评分,第二路径则是在第一条路径不可用时进行优雅降级的规则引擎计算方案。
- 路径一:LLM 深度评估(优先)
当 LLM 可用时会直接走这一条评估路径。系统要求 LLM 根据六维度评估模型从六个维度分别分析,返回结构化 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
}
}OceanBase PowerMem 从这个 LLM 回复的结构化 JSON 中提取 importance_score 字段作为重要性评分。
但实际上因为 LLM 的回答会有一定的不可预知性,所以为了确保即使 LLM 返回格式不规范系统也不会崩溃,可以拿到对应的评分数据,OceanBase PowerMem 使用了一种三级回退的方式来进行解析:首先尝试解析 JSON 拿到最准确的数据,若解析失败则用正则表达式匹配评分数字,若再失败,即返回保底的默认值 0.5。
值得注意的是,LLM 返回的结构化 JSON 中的六维数据实际上并未直接参与最后的权重的计算,在这里让 LLM 返回六维数据只是为了通过 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)**设计是生产级系统的重要特征。即不会因为一个外部服务的故障,就导致整个记忆系统停摆。


三层记忆模型
重要性分数确定了之后,下一步就要给信息分类,来决定这条信息属于哪一层的记忆。
OceanBase PowerMem 把这个过程翻译为三层模型:

而分类的逻辑又以重要性分数为依据:
≥ 0.8
进入 long_term,
≥ 0.6
进入 short_term,其余归入 working。
不同层级的衰减速率不同,层级越高衰减越慢,信息活得越久:
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(短期记忆)。
遗忘参数初始化
分类分完了,但是分类只回答了「这条信息该待在哪一层」,更具体的问题是:应该忘多快?为了巩固记忆什么时候要再复习一遍?
OceanBase PowerMem 在分类完成后会为每条记忆生成一整套可随生命周期演进的数值档案。即系统会为这条记忆建立一份元数据卡片用来记录这条信息记忆的强度、衰减参数、复习计划和管理状态等。
元数据卡片在结构上分成两块:

依旧以会议信息为例(importance = 0.72,short_term),逐一说明核心参数的设计意图和计算方式。
初始保留率
初始保留率决定了一条信息在形成瞬间的牢固程度,越重要的信息在写入时就应该被赋予越高的初始保留率,低重要性内容在认知层面本就应更脆弱,更容易在竞争中让出存储与检索带宽。
在 OceanBase PowerMem 中的初始保留率就是重要性分数乘以一个默认为 1.0 的全局配置参数:
initial_retention = self.initial_retention * importance_score
# 会议示例:1.0 × 0.72 = 0.72
得到的初始保留率实际上会写入两个字段:
- initial_retention 字段,用于记录创建时的快照(当初记得有多牢)
- current_retention 字段,用于跟踪当前的有效保留水平
创建时两者数值相同,之后 current_retention 会随衰减和复习而变化。
关于遗忘速度
working / short_term / long_term 对应到认知学科中的工作记忆、海马体、新皮层,即越接近长期存储层,单位时间内的遗忘应该越慢。所以不同的记忆层级需要有各自不同的衰减系数。
在 OceanBase PowerMem 中不同记忆层级的衰减系数为:
{
“working”: 0.5, # 强度参数 S 最小,忘得最快
“short_term”: 1.5,
“long_term”: 2.0, # 强度参数 S 最大,忘得最慢
}如何做复习调度
在认知学原理中有提到,间隔重复的核心原则是复习先密后疏,要在快要忘记但还能拯救的时间窗内进行复习,不能太早(等于白看一遍),也不能太晚(已经彻底忘了)。
所以 OceanBase PowerMem 在记忆创建时就排好复习时间点,而不是等到需要时才临时决定。
PowerMem 通过两步生成这张复习时刻表:
第一步:给定基准间隔。
系统预设五个基准间隔(小时):[1, 6, 24, 72, 168],分别对应约 1 小时、6 小时、1 天、3 天、7 天。五个间隔是全局配置,所有记忆共享同一组基准值。
第二步:按重要性压缩间隔。
基准间隔对所有记忆一视同仁,但不同重要性不同分类的记忆不该用同一个节奏复习,一条密码信息应该比一句闲聊被更频繁地唤醒。所以 OceanBase PowerMem 用了一个公式,根据重要性分数对每个基准间隔做压缩:
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 是压缩后实际间隔
可以用之前提到的会议信息(importance = 0.72)来拆一遍,具体过程可参考下图:

可以看到:重要性越高,系统越早把它拉回复习窗口,记忆被重新巩固的机会也就越多。
当算完五个时间点后,OceanBase PowerMem 会把它们存入完整的复习时刻表,同时会初始化几个字段,配合复习时刻表工作:

当到达 next_review 并完成一次复习时,review_count 递增、last_reviewed 更新、current_retention 按 reinforcement_factor 提升,next_review 推进到下一个时间点。至此形成提取再巩固的工程闭环。
生命周期状态机
除了保留率、衰减率、复习时刻这些连续的数值,记忆在系统中还有一些生命周期状态需要管理:
- 这条记忆是否该晋升到更高的层级?
- 是否该被淘汰?
- 是否该从活跃检索池中移除?
在 OceanBase PowerMem 中也都有对应的标志位,创建时初始化为全新、活跃、尚未触发任何处置:
{
“should_promote”: false, // 是否应该晋升到更高的层级
“should_forget”: false, // 是否应该被淘汰
“should_archive”: false, // 是否应该从活跃检索池转入归档
“is_active”: true // 是否仍处于活跃状态
}
除此之外,OceanBase PowerMem 还会初始化一个 access_count 计数器,记录这条记忆被访问了多少次,这个计数器和标志位们配合工作(比如 should_promote 的判断条件之一就是被访问超过 3 次)。
落库:完整的元数据档案
所有参数都计算完毕后,系统将它们打包成一个结构化的字典返回。在新增记忆时,合并进记忆的 metadata 元数据中,与正文内容一并写入存储后端。
至此参数建档完成。计时器从这一刻开始滴答作响。


时间开始走,记忆系统中的遗忘机制也开始运作,保留率开始随着时间的流逝慢慢往下掉。先回顾一下艾宾浩斯遗忘曲线的数学形式:R(t) = e^(-λt),它是指数衰减的。
OceanBase PowerMem 的衰减公式
OceanBase PowerMem 把理论公式翻译为代码:
rate = self.decay_rate if decay_rate is None else decay_rate
decay_factor = math.exp(-hours_elapsed / (24 * rate))
要看懂这条会议信息衰减的有多快,关键是要看懂分母 24 × rate 这个数。24 × rate 是这条记忆的特征衰减时间,单位是小时。
把这个数记作 S(Strength),即 S = 24 × rate。S 越大,分母越大,指数衰减就越慢,记忆活得就越久。代入公式会变为更清爽的形式:
decay_factor = e^(-t / S)te))
这个公式有一个性质:当时间 t 走过一个 S,保留率必然衰减到 e^(-1) ≈ 37%。 也就是说,无论 S 是几个小时,只要时间走完一个 S 剩下的记忆都是原来的 37%。这是指数衰减的固有特征。所以只要知道 S 是多少小时,就大致知道这条记忆遗忘的节奏。
还是拿这条会议信息举例,它落在 short_term,rate = 0.15,那么:S =
24 × 0.15 = 3.6(小时)。
也就是说,这条会议信息每过 3.6 小时,保留率就会衰减到上一刻的 37% 左右。
最后还有一处工程细节,OceanBase PowerMem 中存在一条回退机制:调用方首先会按记忆类型算出类型专属的衰减率并传入,但如果调用方没有传,就使用全局默认的衰减率进行计算。这种机制保证了即使旧版本的元数据中缺少类型信息,衰减计算也不会出错。
衰减时间表
好,现在把上面的一切串起来,就会得到这条会议信息完整的衰减过程:

可以看到一条 short_term 记忆在约 4.3 小时后衰减因子就会跌破 0.3 的遗忘阈值,但这并不意味着它会被立即删除,遗忘决策的执行时机,取决于记忆何时被访问。

衰减一直在后台进行,但遗忘的决策只在实际访问记忆时才被执行。
这里有个认知学背景:当一个已巩固的记忆被主动提取时它会暂时回到可塑状态,然后需要重新巩固。这个提取到再巩固的循环会加强对应的神经连接。
在工程层面,这意味着记忆的命运不应该由时间单向决定,而应该在每次被访问时重新评估。
访问是记忆系统最重要的反馈信号。 一条信息被频繁访问说明它对用户有价值,应该被保留甚至晋升。一条信息长期无人问津,即使最初很重要也应该被遗忘。这种懒惰求值的设计降低了系统的计算负担,不需要后台定时任务批量扫描所有记忆。
而当用户通过 Memory.get() 或 Memory.search() 访问记忆时,会依次执行遗忘、晋升、归档和周期重处理这四道检查,具体流程如下:


干扰理论在搜索中的体现
当用户搜索「Q2 评审」时,如果系统只按语义相似度排序,可能出现这种情况:一条 3 个月前的会议纪要语义完美匹配,排在最前面。而昨天刚更新的评审时间变更信息排在后面。
语义匹配度最高 ≠ 用户最需要。
OceanBase PowerMem 通过为搜索结果引入时间维度来解决这个问题。
排序公式
先上公式:
final_score = relevance_score × decay_factor
relevance_score 是关键词匹配度decay_factor 是前面提到的衰减因子
这个公式做了一次交叉排序。高语义匹配但时间久远的记忆,可能被中等匹配度但非常新鲜的记忆超越:

通俗点说,新鲜度在搜索排序中有一票否决权。再怎么匹配,衰减到接近零的老记忆也会被沉到底部。
此外,搜索本身也是记忆访问。在进行搜索时,会对每条搜索结果依次调用 Memory.get,实现批量生命周期管理。

前面讲的都是针对单条记忆的实时管理。但记忆系统还需要周期性的全局治理。随着信息不断积累,重复、冗余、碎片化等问题都会逐渐显现。这类似于大脑在睡眠阶段进行的记忆整理。海马体将记忆重放并转移至新皮层,同时去除重复信息、合并相似记忆、强化重要连接。
OceanBase PowerMem 提供三种互补的优化策略。
精准去重
基于内容哈希的精确匹配。系统维护一个 hash → [memories] 的映射,保留每组中最早创建的记录,删除其余。一次最多处理 10,000 条记录。
完全相同的两条信息只留一条。这是最基础的清理。
语义去重
基于 embedding 余弦相似度,识别语义高度近似但措辞不同的记忆。使用 O(N×M) 逐对比较,默认阈值 0.95。相似度超过阈值的较新记忆被删除,保留最早的那条。
比如「Q2 评审改到下周三了」和「Q2 review 推迟到下周三」语义相同但文字不同,语义去重能识别出来。
记忆压缩
对多条语义相似但不严格重复的记忆,使用 LLM 将其总结为一条精炼的合成记忆。流程分两步:
- 贪心聚类:将相似度超过阈值(默认 0.85)的记忆归为一组
- LLM 摘要:使用提示模板让 LLM 生成精炼摘要,用一条合成记忆替换整个聚类
这三个机制与遗忘衰减协同,构成从**微观(逐条衰减)到宏观(批量压缩)**的完整记忆质量管理体系。

信息量不小。回顾这条会议信息在 PowerMem 中走过的路:
“下周五下午三点评审 Q2 需求文档” 进入系统
↓
重要性评估 → “这条信息有多重要?” → 0.72
↓
分类 → “分到哪一层?” → 短期记忆
↓
参数初始化 → “配一个衰减计时器” → 衰减率和复习间隔已排好
↓
时间流逝 → 衰减进行中,保留率持续下降
↓
被访问 → “还活着吗?需要升级吗?” → 检查通过,晋升为长期记忆
↓
被搜索 → “排在第几位?” → 时间新鲜度 × 语义匹配度
↓
全局优化 → “有重复吗?能压缩吗?” → 去重与合并
核心思路贯穿始终:用有限资源保留最有价值的信息,同时保持检索的高信噪比。
六个节点各司其职:
- 重要性评估解决记住什么
- 分类解决记住多久
- 衰减解决何时淘汰
- 访问触发解决动态调整
- 搜索加权解决怎么找到
- 全局优化解决怎么精简
OceanBase PowerMem 这套设计最有意思的地方在于,它没有把遗忘当作一个“**要不要删”**的二元问题来处理,从写入的那一刻起衰减就在发生。但衰减不等于删除,它只是一个持续变化的权重,真正决定一条记忆命运的,是它有没有被再次访问,这跟人脑的工作方式很一致。
遗忘不是记忆系统的事后补救,而是贯穿整个生命周期的核心设计维度。

立即试用 OceanBase 企业版,体验国产数据库能力180 天免费试用,零门槛开通
更多推荐




所有评论(0)