dsh-mneme 兴趣漂移(Interest Drift)方向调研与思路分享 #21
Replies: 5 comments
|
感谢在 #17 之后做了这么系统的跟进调研,质量很高,帮我省了大量时间。 基于这篇内容,v0.7.0 的设计方向可以直接定下来:
关于 FSRS 的 21 参数:确实过度工程。mneme 没有「复习」事件,只有隐式访问。v0.7.0 会用简化版幂律衰减 + type 差异化半衰期,参数固定不可训练,先跑起来再看数据。 时间线:目前 v0.6.x 在做笔记化记忆库(Wiki-Link + Tag + 目录视图),预计 8 月底收线。v0.7.0 的 RFC 会在那之后启动,届时会把 #21 这篇作为技术背景文档直接引用。 如果你愿意,这篇内容可以归档进 docs/ 目录(署名 + 链接回 #21),作为 v0.7.0 的参考输入。或者等 RFC 草稿出来后 @ 你 review。两种方式都可以,看你方便。 再次感谢,这篇对项目帮助很大。 |
|
@modusensus 归档进 docs/ 这个方式我觉得很好,就把这篇调研笔记作为 v0.7.0 的参考输入放着吧,署名和链接回 #21 都没问题。 RFC 草稿出来之后也欢迎 @ 我 review,我想看到它在实现层面怎么落地,有需要补充真实使用场景的地方我也可以提供。 此外我这次收集信息时,额外调研了一下现有的 Agent Memory 系统,整理了一些资料(包括图谱增强、数据积累前提这些后续调研的内容)此处一起附上,希望能对项目后续的开发给到一些帮助。 |
|
@heptaspirit 归档完成 ✅ 已将你的调研笔记归档到 v0.7.0 RFC 草稿出来后我会第一时间 @ 你 review,期待继续合作!🚀 |
|
@modusensus 我注意到 v0.7.0 的 heat 模型已经用上了,幂律衰减 + TYPE_DECAY、 顺着这个数据前提,我注意到一个目前缺失的环节,所以想提一个增强方向:给 heat 补一个"间隔效应"(spacing effect)。核心动机来自一个实际使用中的边际场景(FSRS 中也应用了这套逻辑),可能不成熟,发出来讨论。 一、两个观察观察 1:当前 touch 是无差别的"时钟归零"。 看了
得到的刷新是完全一样的。而我们参考的 FSRS 这类间隔复习算法的核心恰恰相反:成功召回事件的"含金量"取决于它有多接近遗忘——间隔越久、越冷的记忆被真正消费,其稳定性增益应该越大(间隔效应);反过来,偶然命中不该有增益。 观察 2:recall_runs 记了账,但还没有消费端。 全库搜下来, 二、边际场景(想到的触发点)
一句话:单次偶然命中无关紧要,连续命中才有价值信号。 三、提案:heat = 原衰减曲线 + 独立尖峰(boost)不改变现有 四个分量分别回答"这次命中值多少": ① 信号分档 w(信号)——把"被检索"和"被消费"分开:
现状下 ② streak 连续命中累积——回应边际场景 2。命中时若距上次命中 > cooldown(跨会话才算独立), ③ 冷却时长 g(Δt)——间隔效应的直接落地。 ④ 半衰期 e^(−βt)——boost 独立于主衰减曲线,半衰期较短(默认 24h),保证尖峰是"短时"的,不会长期扭曲热度排序。 四、参数与区间锁mneme 是 agent 场景,命中密度远高于间隔复习,默认值按"频繁使用"定:
区间锁沿用 const RANGES = Object.freeze({
heatHitCooldownHours: { min: 2, max: 72, dflt: 4 },
heatBoostHalfLifeHours: { min: 6, max: 168, dflt: 24 },
heatMaxStreak: { min: 1, max: 5, dflt: 3 },
heatColdBoostDays: { min: 7, max: 90, dflt: 30 },
});五、落地路径(按侵入度排序)
测试点大概是:heat 纯函数(boost 叠加、clamp 区间)、touch 分档(三种信号权重)、streak 跨会话判定(cooldown 边界)、负面信号清 boost、sleep 降级与新 heat 联动( 以上是一个方向性提案,不是需求清单。尤其"用 update 当强信号"这个选择——它只是现有接口里最接近"消费"的代理,真正的认可信号(如果有更合适的交互)欢迎指正。 |
|
@heptaspirit 这条提案含金量很高,我对着 v0.7.0 源码逐条核过,你观察的两点都属实: 1. touch 无差别: 2. recall_runs 只有记账没有消费端:目前只有写入 + 90 天滚动清理,没有任何路径读它影响 heat。 数据基础( ① 信号分档我认同,但"update 当强信号"有个坑:得区分用户主动 update 和 autoDream/sleep 的系统性 consolidate update(merge/conflict 裁决落地也是一次 update,不该算"用户消费",否则巩固流程会给自己打强信号)。好在 ② "低分候选不 touch"是关键前置,但现状 ③ streak 跨会话判定依赖会话边界——目前 touch 层拿不到 session 上下文,敲定前保持"cooldown 内只算 1 次"的保守策略即可。 ④ 区间锁用 clamp 而非非法回退默认——同意,更可预测, 关于落地:建议先做阶段一(纯逻辑、零 schema):touch 分档 + 低分不 touch + streak 进 metadata, 排期我确认后回复你——目前 v0.7.x 收尾、v0.8 图谱增强排 9 月末,具体插进哪个版本我确认后 @ 你。 |
Uh oh!
There was an error while loading. Please reload this page.
#17 中有关兴趣漂移算法一些思考个人研究和思考
一、算法方向概览
二、各方向要点
1. 间隔重复 / 遗忘曲线模型(FSRS 系列)
FSRS(Free Spaced Repetition Scheduler)是墨墨背单词 DHP 模型的开放实现,多年迭代、多语言实现(含 TypeScript 的 ts-fsrs),有大规模用户数据验证。
核心三变量:
遗忘曲线(FSRS-4 起,幂律形态):
稳定性更新(FSRS-6,依赖 4 级评分 G = again/hard/good/easy):
特性:稳定化衰减(S 越高增幅越低)、间隔效应(R 越低成功复习后 S 增幅越大)、21 参数可训练(fsrs-optimizer)。
与 mneme 场景的差异:FSRS 面向"复习调度"(何时复习),mneme 没有复习概念,只有隐式访问事件(检索命中 / 注入)。若借鉴需把"命中"映射为隐式评分,或仅借用衰减函数形态。
2. 近两年相关研究(参考,均未大规模验证)
w(Δτ) = exp(−(Δτ/η)^κ)+ 统一新鲜度阈值 θfresh 归档低热度;记忆四类失败模式Score = w₁·Recency + w₂·Importance + w₃·Relevance3. 时间衰减排名(信息检索 / 推荐系统,成熟)
S ← λ·S + Δ,增量更新实现简单。三、与 mneme 现有架构结合的可能思路
3.1 type 体系的衰减角色(一种可能的映射)
实现可为一个常量映射表(如
TYPE_DECAY = { preference: ∞, decision: ∞, project: 90, summary: 30, pattern: 30, history: 7 },单位为半衰期天数),无需为每种 type 写独立逻辑。3.2 两个维度正交
3.3 原生机制的可能用途(基于 v0.6.0 源码观察)
recall_runs表last_accessed_at+ touch 逻辑3.4 现状观察(非指摘,供权衡)
last_accessed_at)目前主要服务 sleep 的分层降级,与检索/注入排序未打通——接入排序层即是最小起步。recall_runs审计表已记录每次检索场景,是免费可得的隐式反馈数据源——"高频召回却从未被使用"可作为负信号候选(需谨慎,见第五节第 1 条)。四、落地方向(宏观,供参考)
五、值得注意的点(非结论,仅提示)
六、参考文献(出处完整,供查阅)
FSRS / 间隔重复:
近两年研究:
综述 / 综述类:
All reactions