为什么 KnowMine 的知识库 Reward 系统拒绝了 streak 计数 —— 主题聚集 + 复现钩子的设计
Duolingo streak 是留存利器,但它对知识库是毒药。KnowMine 用主题聚集 + Agent 行动钩子重新设计了即时奖励反馈,让 AI 对话中存知识这件事真正复利起来。附完整设计推导和实战验证。
如果你过去两年用过任何"AI 笔记 / 第二大脑 / 个人知识库"产品,你大概率见过这种东西:
🔥 今日第 3 条 · 连续 12 天 · 本周新增 17 条
这是 streak 模式。Duolingo 用它把语言学习留住了上亿用户,GitHub 用它的草地把开发者留在了平台上。它是经过验证的留存利器。
但如果你认真想一想"知识库"和"语言学习 / 写代码"这三件事的本质差别,你会发现 streak 在知识库这个场景里是有毒的。我们在 KnowMine 重写 Reward 系统的时候花了很久才下定决心拒绝它。这篇文章把整个设计推导写下来,包括我们最终选择的方案、为什么这么选、以及上线后一个出乎意料的发现。
如果你也在做 AI 时代的知识工具,这套思路值得借鉴。
问题:我们的 Reward 系统缺最后一公里
KnowMine 是一个 AI 原生的个人知识库。它的核心场景是这样的:你在 Claude / ChatGPT / Cursor 里聊天的时候,通过 MCP 协议直接调一个叫 save_memory 的工具,把对话里值得保留的判断/决策/经验存进知识库。AI 帮你提取标题、打标签、自动归类、向量化、自动关联到旧知识。
我们在底层早就把 Reward 系统的零件造好了:
- 365 天热力图组件 ✅
- 成长报告服务 ✅
- 主题聚类 / 关联发现 ✅
- 一个独立的
get_growth_summaryMCP 工具 ✅
但有一个致命的断点:用户在 AI 对话里调 save_memory 的那一刻,工具响应里完全没有任何 Reward 信号。它只返回三个字段:
{
"action": "created",
"memoryId": "xxx",
"message": "记忆已保存 → 文件夹: 未分类"
}
用户必须主动去调 get_growth_summary、或者切换到网页 dashboard,才能看到自己的成长。这相当于把 Reward 系统的最后一公里全部丢给用户主动触发。结果是大部分用户存了知识就走,永远感觉不到知识库在长大。
端到端 Reward 系统的"端"——就缺这最后一段。
直觉答案:加一个 streak 计数器,对吧?
我的第一反应是抄 Duolingo / GitHub / Strava 那一套。在 message 末尾加一行:
🔥 今日第 3 条 · 连续 12 天 · 本周新增 17 条
工程量极小,用户立刻有数字反馈,行业最佳实践。准备开干。
然后我停下来认真把这个方案过了一遍五个专家视角。结果全部反对。
下面是这五个视角各自看到了什么。
视角 1:Hooked 模型 —— Variable Reward 才是钩子的核心
Nir Eyal 在《Hooked》里反复强调一件事:可预测的奖励会迅速消耗多巴胺,变成噪音。
今日第 3 条 · 连续 12 天 是典型的 fixed reward——每次都是同样的格式、同样的句式、同样的字段名。用户的大脑会在两周内学会自动过滤这一行字。它会从"奖励"退化成"页脚"。
Instagram 不告诉你"这是你今天第 5 个赞"。它给你的是你不知道下一秒会出现什么。这才是 variable reward 的力量。
视角 2:自我决定论 (SDT) —— Competence 不是 Quantity
心理学里讲内驱的 SDT 理论有三根支柱:Autonomy(自主)/ Competence(胜任)/ Relatedness(联结)。
今日第 3 条 这种数字是 quantity feedback,它激发的不是胜任感,而是焦虑——"我今天还差几条?" "我的连续天数会不会断?"
真正激发胜任感的反馈不是"你做了多少",而是"你做的事情产生了影响"。
而我突然意识到:KnowMine 已经在做这件事了——save_memory 的现有响应里有"自动关联到 X、Y 两条旧知识"。这才是真正的胜任感信号。它告诉你:你刚存的这条不是孤立的,它在你的知识网络里找到了位置。
这是被低估的金矿。我之前居然没意识到。
视角 3:Duolingo Streak 的甜蜜陷阱
streak 这个机制有一个被很少讨论的副作用:它会让用户为了不断 streak 而做形式化的、低质量的打卡。
Duolingo 用户群里流传一个梗:"streak 救星" —— 那些为了不断 streak 而在零点前 5 分钟点开 app 随便做一道题的人。
对 Duolingo 来说这是 OK 的。因为他们的产品本质是"每天接触一点外语",低质量打卡也有学习效果。
但 KnowMine 是个知识库。如果用户为了不断 streak 而每天硬塞一条无意义的笔记进来呢?它会让知识库腐烂得更快。垃圾进,垃圾出,向量空间被噪声污染,主题聚类失效,Soul 画像被稀释。
这是结构性冲突。KnowMine 的产品本质和 streak 机制不兼容。
视角 4:MCP 协议人体工学 —— 读者是双重的
这一条是最被忽视、也最有意思的视角。
save_memory 工具的 message 字段不只是给"人"看的。它会被 AI Agent 拿走,作为对话上下文继续展开。
如果你 append 一段 🔥 今日第 3 条 · 连续 12 天,Claude 在下一轮对话可能会复述这个数字给用户:"你今天已经存了 3 条了,状态不错!"
这听起来人畜无害,但你想象一下用户连续看 30 天同样的 AI 复述——它会变成机器味、变成尴尬、变成 cringe。
而如果你 append 的是一段带行动钩子的文本呢?比如"这让你对 'MCP-first' 主题已经有 5 条笔记了 — 要不要我帮你生成一份小综述?"
Agent 看到这句话会自然地接话:"啊确实,我帮你总结一下吧"——然后它真的会去调 get_related_knowledge、聚合那 5 条笔记、生成综述。Reward 直接转化为下一个工具调用。
这是双向钩子。在 MCP 时代,每一段 AI 工具的响应文本都是潜在的 Agent 行为引导。Reward 不只是用户感知层的事,它是 Agent 行为层的事。
视角 5:标杆产品对比
| 产品 | 模式 | 是否适合 KnowMine |
|---|---|---|
| GitHub 草地 | 被动可见,从不打断写作 | ✅ 可借鉴 |
| Strava Kudos | Reward 来自他人社交确认 | ✅ 启发了"复现"思路 |
| Readwise Daily Review | 把存的东西重新呈现给你看 | ✅ 直接启发了我们的方案 |
| Beeminder | 每天逼你完成数字目标 | ❌ 反例,只对自虐型用户有效 |
| Duolingo Streak | 强 streak + 推送 | ❌ 与知识库本质冲突 |
KnowMine 的目标用户不是 Beeminder 那群人。他们是 GitHub 草地 + Readwise 那群人。
我们最终选的方案:主题聚集 + 复现钩子
经过五个视角的拷问,原方案被全部否决。我们重新设计了一个:Topic Cluster + Recall Hook。
具体效果:
记忆已保存 → 文件夹: 个人学习和思考笔记
🔗 自动关联到 2 条相关知识:
· Karpathy LLM Wiki 生态竞品全景图
· KnowMine Reward 系统五项核心设计决策
💡 这让你对 "Karpathy 生态" 主题已经有 5 条相关笔记了 —— 要不要我帮你生成一份小综述?
核心设计原则:
| 原则 | 实现 |
|---|---|
| 不做数量统计 | 不是 streak / counter,是主题聚集感知 |
| 不做固定模板 | count >= 3 / >= 5 / >= 10 三档不同语气 |
| 不做单向通知 | 每段 reward 都包含一个明确的下一动作钩子 |
| 利用 Agent 上下文 | 钩子是问句,Agent 会自然接话 |
| 不打扰原则 | count < 3 / 无 tag / reinforced 路径均不触发 |
streak 类信号完全不进 MCP 响应,只放在网页 dashboard 上做 GitHub 草地式被动可见。
上线后的意外发现
代码上线之后我跑了一次实测,存了一条新知识。结果出现了超出我预期的现象:
Claude 在拿到我的 reward 文本后,自发地进一步加工、接话、提议下一动作。我代码里写的固定文案是:
💡 "MCP-first" 主题在你的知识库里开始成形了(3 条)— 要不要看看它们之间的关联?
但 Claude 实际给用户的回复是:
附带一个观察:系统提示 "MCP-first" 主题在你库里已经有 3 条成形了。要不要我跑一次
get_related_knowledge把这条 insight 的关联网拉出来看看?可能有几条之前的判断现在该升级或合并了。
最后那一句——"可能有几条之前的判断现在该升级或合并了"——完全是 Claude 自己加的。它是 KnowMine"知识复利"叙事的延伸,比我代码里的文案更有产品味。
这验证了视角 4 的预测:"reward 文本 = Agent 上下文" 不是理论,是真实可观测的产品杠杆。MCP 时代每一段工具响应文本都是潜在的 Agent 行为引导,应该把"给 Agent 看"放在和"给人看"同等重要的位置。
给同行的几条建议
如果你也在做 AI 时代的知识工具或 Agent 工具,这套思路里有几条可以直接拿走:
- 慎用 streak。先问"我的产品本质是 quantity 还是 quality"。如果是后者,streak 是毒药。
- 找出你产品里被低估的"隐性 reward"。KnowMine 的"自动关联发现"原本只是个系统行为,重新包装一下就成了 Reward 信号。
- 每段工具响应都要为 Agent 设计,不只是为人设计。MCP 工具的 message 字段是 Agent 的下一步行为种子。
- Reward 必须能转化为下一个动作。最好的 reward 不是让用户停下来欣赏数字,而是让用户/Agent 自然地启动下一个有价值的操作。
- 不打扰原则。新用户、边缘场景、非关键路径都不要发 reward——少即是多。
写在最后
KnowMine 在 knowmine.ai 上线,11 个 MCP 工具,免费额度,可以直接接到 Claude / ChatGPT / Cursor / Claude Code 上。如果你想感受一下 reward hook 的实际效果,存几条知识就能看到——尤其是当你存第 3 条同主题笔记的时候,Reward 会自动出现并尝试把你引向"生成综述"这个动作。
如果你在做类似的产品决策,欢迎在评论区聊。Reward 设计是个深坑,行业里很少有人写这类决策推导,希望这篇文章对你有帮助。
本文记录了 KnowMine v2.54.0 的 Reward 系统设计。完整 changelog 见 CHANGELOG.md,相关代码见 src/lib/services/reward-hook.ts。