衰减系统(记忆曲线)
难题背景
知识库随时间累积,旧知识占据召回排序高位,挤掉新知识。需要衰减淘汰——但不能:
- 破坏性删除(丢可追溯性)
- 自我强化(被读多→显得可信→更优先,CONSTITUTION P9 禁止)
难题:如何让旧知识退场,同时保留可逆性 + 不让使用量造可信度?
技术设计
记忆曲线评分:
score = importance × e^(-λ × days_old) + 0.5 × ln(1 + access_count) + pin_bonus
Active ×1.2,dropped/archived → 0.0(退出召回)。
四项:
- importance(0-1,人工设定)
- e^(-λ × days_old) — 时间衰减,λ 越大衰减越快
- ln(1 + access_count) — 访问增强,被用多分高,但 ln 抑制暴涨
- pin_bonus — 固定页加成(默认 0.5)
原理
类型 λ 差异
不同知识保鲜期不同:
| 类型 | λ | 理由 |
|---|---|---|
| concept | 0.0 | “什么是 REST API”不过时 |
| strategy | 0.014 | “用微服务拆单体”随技术环境过时最快 |
| anti-pattern | 0.010 | “不要用 var 声明”教训保鲜期长 |
| unknown | 0.030 | fallback,快速衰减 |
access 不推状态
access_count 只进 ln 项影响排序,不改 confidence 或 status。被读多说明相关不说明正确;让重复抬高可信度会自我强化——越常注入 → 越常被用 → 越显得可信 → 越优先注入。见 CONSTITUTION P9。
confidence 只在”同一份知识被独立重新推导出来”时提升(指纹命中既有页面):
new_confidence = min(1.0, current + 0.1 × (1 - current))
那是关于内容的真实证据;”被读过”不是。
归档可逆
archive 只改 frontmatter 的 status,不删文件(Git 保留)。unarchive 拉回 Provisional(非 Active——离开归档不是一次人工审阅)。这是 A3 前提:衰减可无人自动归档,只因可逆且不破坏。
四因子取舍
记忆压缩的工业实践常综合四因子:访问频率 / 时间衰减 / 情感强度 / 信息独特性。OKS 用前三项的工程等价 + pin,舍后两项:
| 工业因子 | OKS 对应 | 取舍 |
|---|---|---|
| 访问频率 | ln(1 + access_count) | ✅ 保留——被用多说明相关 |
| 时间衰减 | e^(-λ × days_old) | ✅ 保留——类型 λ 差异 |
| 情感强度 | — | ❌ 不做——OKS 是技术知识库非对话记忆,无情感标记 |
| 信息独特性 | — | ❌ 不做——需 IDF(倒排索引),OKS 无 embedding / 倒排 |
| (固定) | pin_bonus | ✅ OKS 加——人手 pin 不衰减 |
情感强度适合对话型记忆(用户情绪强烈的对话更该留),技术知识库无此信号。信息独特性要 IDF 统计(罕见词更重要),OKS 无倒排索引,靠 frontmatter importance(人设)+ tags 间接表达。诚实说明为什么少两因子——不是疏忽,是领域 + 架构约束。
对比 nowledge 衰减与置信度
Nowledge Mem(外部产品参考,公开文档链接当前待确认)的衰减综合时效性 + 频率 + 重要性底线 + 置信度 + 时间匹配。对照 OKS:
| nowledge 衰减信号 | OKS 对应 | 取舍 |
|---|---|---|
| 时效性(半衰期 30 天) | e^(-λ × days_old) | ✅ 有——但 λ 类型差异(concept=0 不衰 vs strategy=0.014),非统一半衰期 |
| 频率(对数缩放,收益递减) | ln(1 + access_count) | ✅ 有——第 10 次比第 100 次作用大 |
| 重要性底线(高重要性不衰减) | importance + pin_bonus | ✅ 有——pin 固定页加成 |
| 置信度(只增不减,~5% 权重) | confidence(指纹命中 +0.1) | ⚠️ 更严格——只随内容证据,不随使用 |
| 时间匹配(事件时间) | — | ❌ 不做——无事件时间字段 |
关键差异:搜索强化 vs 防自我强化:
- nowledge v0.6.6:每次搜索展示都更新记忆的
last_accessed+access_count,“出现在结果里也算一次轻度访问”,避免有用记忆悄悄衰减。 - OKS:反向选择——召回(
oks recall)不算使用,不推access_count;只有oks wiki use <slug>才 +1。记忆热度反映“真被用上”而非“被搜过几次”。
这是 CONSTITUTION P9(防自我强化)的直接体现:被读多 → 显得可信 → 更优先 → 被读更多,是正反馈回路。OKS 让 access_count 只进排序(ln 项)不进可信度(confidence),且只在 Agent 主动 wiki use 时增长——切断了“召回即强化”的回路。代价:记忆热度更新慢(要 Agent 主动报 use),换稳定性。
置信度的保守:
nowledge 置信度随展示次数 / 点击 / 图连接增长(~5% 权重,让沉淀知识占先手)。OKS confidence 只在“同一份知识被独立重新推导”时提升(指纹命中既有页面,+0.1 × (1 - current))——是关于内容的真实证据,不是使用信号。这让 OKS 的可信度更难积累,但更可靠:不会被“频繁召回但从未被独立验证”的页撑高。
nowledge 的好概念(未来方向):
- 自动维护(每日新鲜度刷新 + 每周聚类整理)——OKS 是手动(
oks decay/oks distill),不做后台自动任务。A3 要求“可逆 + 不破坏”,自动维护要谨慎设计(避免静默合并 / 删除)。 - 时间理解(事件时间 vs 记录时间 + 时间意图检测)——raw 的
created是记录时间;事件时间要 frontmatter 加event_time,需 Agent 提取。
指标
Tier 分级(按 score):
| Tier | Score | 行为 |
|---|---|---|
| hot | ≥ 0.7 | 优先召回 |
| warm | ≥ 0.4 | 正常召回 |
| cold | ≥ 0.15 | 低优先级 |
| evictable | < 0.15 | 归档候选 |
archive_threshold(默认 0.3,store.py 代码内置)——低于此分进入归档候选,下次 oks distill 标 dropped。
实验
无量化衰减效果评测(需长期跟踪知识库召回质量)。λ 取 0.014/0.010/0.0 是经验值——concept 不衰(永恒)vs strategy 快衰(易过时)是知识论直觉,非数据拟合。
decay 参数(archive_threshold=0.3、pin_bonus=0.5)当前是 store.py 的代码默认值,无实例级配置文件覆盖。
结论
衰减是可逆淘汰,不是破坏。归档退出召回但留 Git,unarchive 拉回——最坏代价是召回覆盖变窄,不造损失。一旦衰减变成破坏性操作,A3 的推理即失效。
访问量只进排序不进可信度——记忆热度反映”真被用”,防自我强化回路。