1,247 进,5 出。
十月二十三日,Sarvar Nadaf 在 dev.to 上贴了这件事:让笔记本上的开放权重模型把自己攒的“稍后读”列表过了一遍,1,242 条判死,5 条留下,配两行晨间摘要。评论区二十七条,头一条是“我也要”。
我看着那个 5,第一反应不是羡慕。是他文里另一个数:误删率 44%。
这两个数得放在一起才是完整的一件事。爽感即时到账,早上打开,一千二百多条变成五行;错误延迟暴露,三个月后你想写点东西,记得存过一篇讲这个的,搜不到,你甚至不会想到是三个月前那个早上删的。分诊这类工具的全部麻烦都在这个时间差里:它的错误不在使用时暴露,在你最需要它的时候暴露。
这张图的核心张力就在这。判定做得好不好,早就不是瓶颈;瓶颈在“判错了以后还能不能捞回来”,而这一块基本空着。
先把话说在前面:这不是论文综述,这个领域还没有能引的 arXiv 编号,最前沿的工程思考出现在一篇博客的评论区里。锚点是具体的人和日子——Nadaf 那篇记录、讨论区里推着地图走的五条发言,不是编出来的 (Author, Year)。
一、先把这张图切开
“个人分诊代理”这词现在用得很松。我给它一刀:拿你自己的历史行为当标签,对你堆着没处理的内容做分级判定,并且让这个判定每天重复发生而不让你烦。
按这个定义,切出来是四层:
个人分诊代理
├── 判定层
│ ├── LLM 直判(prompt 打分 / 排序)
│ ├── 向量近邻(embedding 相似度 + kNN)
│ └── 表格基础模型(in-context 分类,TabPFN 这一支)
├── 循环层
│ ├── 一次性批处理(跑完就完)
│ └── predict → act → explain → report 的闭环
├── 呈现层
│ ├── 生成式摘要(LLM,有虚构风险)
│ └── 确定性回退(规则,保证有产出)
└── 部署层
├── 云端 API(便宜、好评估、数据出门)
└── 本地开放权重(Ollama / CPU 前向,隐私在、统计功效丢)
把 Unpile 放进去:判定层落在最右那格,TabPFN-v2;循环层落在“闭环”里但只闭了一半;呈现层两条都用了,Gemma 3 走 Ollama 加确定性回退;部署层在最右。
然后看这个圈子里讨论最多的是什么——判定层最左边那格,LLM 直判。铺天盖地的“我用 GPT 帮我整理收藏夹”。
我的判断很直:这张地图上最热的那一格,恰好是最不重要的那一格。判定层已经收敛了,一个周末能搭出来——Unpile 本身就是 10 月 19 到 25 日之间新建的,复用了作者前几周攒的本地 AI 实践,README 里按规则披露了。循环层还没开工。
二、判定层三支,以及一条没人做的基线
2.1 LLM 直判
零样本、能读标题和摘要、能理解“这篇看起来像你会读的”——三条太顺手了,顺手到你不会去问第二个问题。
第二个问题卡在校准。你要的不是“这篇挺适合你”,是“我 72% 概率会读这篇”。前者是排序信号,后者是概率;只有概率能定阈值,只有阈值能调召回,只有召回能拿去跟误删率做交换。LLM 直判给你一串没有刻度的分数——怎么定保留线都行,但不知道在拿什么换什么。
成本也是。1,247 条一条一次调用;本地跑一条几秒,整批是天级别,云端跑隐私那条线当场断。分诊是日更任务,这个成本要乘天数。
最少人提的是第四点:不可复现。同一条内容今天问和明天问答案会漂。分诊要的是三个月前判过、现在还是同一个判——漂了就没法归因,也没法改。
2.2 向量近邻
思路简单:读过的存成向量,新条目找最近邻,看邻居读没读。便宜、可复现、能增量更新,三支里工程上最省心。
盲区在“语义相似不等于会读”。存了一堆 Rust 异步运行时的东西,不代表下一篇 Rust 异步文章你会读——可能已经读够了。这个“够了”不是内容的属性,是你的饱和度的属性,它在向量空间里没坐标。反过来,从没接触过但会喜欢的那块,近邻为空,永远判不出来。
这一支的天花板不在工程,在特征表达:阅读意愿里有一大半信号根本不在文本里。
2.3 表格基础模型:替掉的是 XGBoost
这是三支里最少人走的一步,也是这篇记录里技术上最值得看的一处。
TabPFN-v2 是 Prior Labs 的开放权重表格基础模型。路子是先把“在一批合成任务上预训练一个 Transformer、让它学会做贝叶斯推断”这件事做完,推理时把训练集当上下文塞进去,一次前向出预测。对 Unpile 的意义很实在:不用训练、不用调参、CPU 上跑、整批一次出。
关键是任务形状对得上。Nadaf 那七列——来源、主题、预计阅读时长、条目陈旧程度、标签被重新打开的频次、是否为可操作的教程类内容、在列表里被埋没的深度——没有一列需要理解语义。全是结构化、可枚举、带缺失值的。这正好是 GBDT 的地盘。
所以这一步的坐标我要钉死:它不是“用 AI 做分诊”,是“用一个 in-context 分类器替掉 XGBoost 的调参工作”。媒体会写成前者,工程上是后者。区别在于拿它跟谁比——跟 LightGBM 比,不是跟 GPT 比。
代价。一是上下文锁死样本数:这类 in-context 分类器的“训练集”就是你的历史,几百到几千条顶到边,特征还得人手定,模型不会替你发现“周末存的条目阅读率低”这种交互,那是 GBDT 领域的活。二是偏好位移:概率校准得不错,但校准的是“在这批上下文下”的概率。换了工作、兴趣整体挪一格,旧标签把新偏好拖住,它不会自己告诉你这件事发生了。
一句话定位:这一支在这个任务上便宜得离谱,但它是对的,天花板在特征集锁死,不在模型锁死。
2.4 缺的那条基线
讨论区里 SuhasSuren 提了一条:拿“标签重新打开次数”做单特征基线,看 TabPFN 到底带来多少增量。
整篇记录里我没找到对应的数。这是最大的方法论漏洞——不是不该用 TabPFN,是没告诉我们 TabPFN 值多少。
为什么这条基线在这个任务上特别要紧:分诊的信号高度集中。“你重新打开过这个标签几次”本身就近似“你对它还有兴趣”,单特征的信息量可能吃掉大部分 lift。基线要是 1.5,那 1.66 就没什么好说的;要是 1.1,1.66 是真本事。少了这个数,技术选型退化成美学,不是工程结论。
我自己也得挨这一刀:我批评他缺 baseline,我这一篇也没有 baseline。区别在于这是地图不是实验报告——地图的活是标出“这里该有个数”,不是替他把数补上。
2.5 三档动作,两套指标,中间那档是黑的
这处最不起眼,是我在这篇记录里发现的最漂亮的一个 bug。
Unpile 的动作空间三档:保留、略读、丢弃。演示那 14 条出来的是保留 5、待定 1、静默 8。
但留出集上报告的四个指标——精确率 0.60、提升 1.66 倍、自动静默比例 58%、误删率 44%——全是二分类口径。中间那档在评估里没位置:要么算进保留,要么算进丢弃。
于是出现一个结构性空洞:系统有能力说“我不确定”,指标没能力衡量“不确定说得对不对”。演示里那条 214 期科技通讯是活例子——保留置信度 37%,恰好落在保留线以下,被静默了。37% 的意思是模型自己也不确定,三档系统本该把它推进待定档,但推不进去,因为三档动作配二分类评估,中间那档没有梯度可调。
这块地图上没人画。我把它标出来,因为怀疑它比“换更强的分类器”值钱得多。
三、循环层:agent 这个词在这儿贬值得厉害
Unpile 自称 agent。四步:先预测概率,再决定动作,然后用自然语言说明理由,最后报告留出集上的真实指标。
前两步是“代理”,后两步是“评估”。真正的代理循环缺第五步:动作的后果回到下一轮的输入里。
Unpile 里没有。今天静默的条目,明天不会因为你没打开而改判;手上没有“撤销”这个动作,只有一个全局旋钮 UNPILE_KEEP_T——把保留线往下挪能缓解误删,代价是摘要噪音变多。
我对“agent”这个词的通货膨胀没什么耐心。判断标准三条:动作有没有副作用、副作用能不能被观察到、观察到之后策略变不变。三条缺一条就是批处理脚本。Unpile 缺第三条。
但这不是贬低。恰恰相反——在分诊这个任务上,循环层不是花活,是核心。因为分诊的错误成本是延迟暴露的,反馈回路长到几个月,长到任何离线评估都测不出来。240 条留出集算不出“三个月后你会不会找那篇文章”。
补这个洞只有两条路:提高准确率,或者把动作做成可逆。可逆比准确便宜一个数量级,而且准确率有上限——36% 的基准阅读率意味着这个任务本身就带着大量噪声——可逆没有。
讨论区里 Lokesh Saravanan 提到他在类似项目里用了预览加撤销。这是整条讨论里最工程的一条。预览加撤销的本质是把判定从“决定”降级成“建议”,最终处置权留给人。代价是你早上还是要扫一遍那 58%,但那是“扫一眼确认”,不是“逐条读”,心理成本差一个量级。
Sina Rezaei 提的隔离区方案——带保留期、常青技术文档和时效性内容分设阈值——我持保留意见。作者的回应是对的:隔离区可能只是把待办挪了个地方。我想说得更冷一点:隔离区是软删除,治的是心理负担,不是信息丢失。信息丢失只有撤销栈能救,而撤销栈要求你把被静默条目的正文或者至少快照留着。
这就把循环层和部署层扣在一起了,是这张图上少数几处真耦合:本地部署下,多存 1,242 条正文的成本几乎为零;云端部署下,那是笔存储账单。所以“本地优先”在这里不是意识形态选择,是让撤销栈变得可行的前提。
3.1 一处我没想通的断裂
Unpile 的特征里有“条目在列表中被埋没的深度”这一列。
这列的存在说明作者知道问题出在哪:东西都在,只是被埋的顺序不对。可他下面的动作空间只有保留、略读、丢弃,没有“浮起”。判定层已经看见的东西,循环层没接住。
一个能算出“这条被埋了 300 层”的系统,最该做的动作是把它捞上来,不是判它死。这是这张地图上最明显的一处断层,后面落子还要回到这儿。
四、呈现层:降级设计
Unpile 的晨间摘要由 Gemma 3 经 Ollama 本地生成,要求不得虚构条目;Ollama 不可用或设备离线时,走确定性规则回退,保证摘要一定产出。
这个回退是整篇记录里最值得抄的一处工程,尽管它连小标题都排不上。
绝大多数本地 AI 工具的失败点不在模型,在“模型没起来的那一次”——演示当天 Ollama 挂了,页面白屏,工具从此被卸载。日更工具的用法是每天固定时间看一眼,一个“偶尔不产出”的日更工具,用户第三天就不看了。不确定性本身比没有更烦。
规则回退能产出什么?只能产出“今天 5 条保留里,2 条是本周新增、3 条是积压”这种统计句。信息量低,但它确定。确定性的低信息量胜过不确定的高信息量——这是所有日常工具的共同规律,跟 AI 毫无关系,但做 AI 工具的人特别容易忘。
再说“不得虚构条目”。生成式摘要最典型的失败是把三条内容缝成一条,读起来通顺、条目不存在。新闻摘要里这是瑕疵,分诊摘要里是灾难:照着它去找,找不到,然后不再相信这个摘要,然后回去翻原始列表,工具的全部价值归零。
所以“不许虚构”不是 prompt 里的礼貌请求,是产品的存亡条件。只能靠机制保证,不能靠模型自觉——这也是回退路径必须存在的理由。
还有一处值得记:演示页面上的数字是从真实输出冻结进静态站点的,同时提供浏览器内模型镜像,用户切换条目时实时重算。冻结保证你看到的不是某台机器上的随机结果;实时路径保证它不是 PPT。这是目前本地 AI 演示里最靠谱的一种组合,建议所有做类似东西的人照抄。整个栈也轻:FastAPI、单文件无构建前端、GitHub Pages 静态演示,全在 CPU 上跑,不依赖云端、账号、付费,外加一段 60 秒的端到端视频。
五、部署层:隐私不是立场,是数据属性
Nadaf 的主张很直接:阅读列表会暴露职业、健康、政治倾向,他不愿把这些数据传给第三方;本地模型可以断网运行、零成本、还能按个人历史定制。
同意,但想把这条讲得比“隐私很重要”更硬。
阅读列表是行为数据里信息密度最高的一类,因为它同时含内容和意图。搜索记录含意图不含内容,浏览历史含内容不含意图;稍后读列表两者都有——保存它的那一刻就是一次意图声明。虽然声明会随时间失真,这正好是他要补“为什么保存”字段的原因,但失真之前,它是你所有数字痕迹里最像你的一份。
这类数据对第三方来说价值高到不适合托管。不是道德问题,是数据属性问题。
本地化有一个作者没怎么提的代价:评估负担也本地化了。
云端服务至少还有别人的 A/B 数据能告诉你“阈值大概落在哪”;本地跑,你的留出集就是 240 条,0.60 的置信区间宽得能塞下一头牛。240 条里按 36% 基准率算,正样本八十来条,精确率上下浮动五六个点是正常波动。所以“1.66 倍提升”这个数,我不怀疑它算错,怀疑它的稳定性:换一个月的数据重跑,可能是 1.3,也可能是 1.9。
这是真实的权衡,不是“本地更好”。本地化把隐私拿回来了,把统计功效丢了。谁跟你说本地优先全是好处,他大概没跑过留出集。
六、压成一张图
判定层三支,横向摊开:
| 分支 | 核心思路 | 代表 | 优势 | 代价 |
|---|---|---|---|---|
| LLM 直判 | prompt 让模型读标题摘要打分 | 各类 summarize-and-rank 脚本 | 零样本,能读语义 | 不可校准、逐条调用、判定漂移 |
| 向量近邻 | 与你读过的条目做相似度 | embedding + kNN | 便宜、可复现、可增量 | 语义相似≠会读,冷启动瞎,对新兴趣永久盲 |
| 表格基础模型 | 历史当上下文,一次前向出概率 | TabPFN-v2(Unpile) | 免训练、CPU、整批、校准尚可 | 上下文锁样本数、特征要人手定、偏好位移时旧标签拖后腿 |
指标口径,横向摊开——这张比上一张更要紧,是我对这篇记录的怀疑清单:
| 指标 | 报出的数 | 我说一句 |
|---|---|---|
| 精确率 | 0.60 | 分母是保留项,和 36% 基准对得上,1.66 倍是这么除出来的 |
| 自动静默比例 | 58% | 分母是全部条目,清楚 |
| 误删率 | 44% | 分母是“被静默的条目”还是“你本来会读的条目”?这两个口径算出来是两件事 |
| 留出集规模 | 240 条 | 正样本八十来条,0.60 的置信区间不窄 |
| 演示规模 | 14 条 → 5/1/8,折算约 5.5 小时 | 演示归演示,别拿它当效果 |
四层地图的成熟度,再摊一张:
| 层 | 有人写吗 | 状态 |
|---|---|---|
| 判定层 | 多 | 已收敛到“表格化特征 + 小样本分类器” |
| 循环层 | 少 | 只有撤销、预览这几条散落实践,没有成形方案 |
| 呈现层 | 极少 | 降级设计几乎无人成文,全靠个人踩坑 |
| 部署层 | 中 | 本地推理的工程细节不少,统计功效没人谈 |
纵向读有一条规律:往下走,判定→循环→呈现→部署,论文密度单调下降,而决定这个工具能不能天天被用的权重单调上升。这就是“最热的那格最不重要”的量化版本。
七、评论区那五条
二十七条评论里有五条真正在推进地图:
Techie 说实验真正挑战的是“收藏即学习”的错觉,并且赞赏作者把 44% 这个不利数据公开了。Nnamani 说“允许自己放手”是最有力的观点,同时担心调阈值本身会变成一种新的囤积——作者回应得很坦率,确实可能变成“用配置决策堆出的另一个待办堆”。Rezaei 给隔离区方案。SuhasSuren 要单特征基线。Lokesh 提预览加撤销。
五条拼起来,正好覆盖循环层和呈现层现有的全部工程内容。这个领域目前最前沿的思考出现在一篇博客的评论区,不在任何论文里。不是贬义,是现阶段的真实状态:这类工具还没形成学术共同体,实践者之间的知识传递靠评论区,靠“我也踩过这个坑”。
我最认同的不是“放手”,是 Techie 那句被数字证明了的话。但证明它的不是 1,242,是 36%。
1,247 条里,按作者自己报的基准,堆里的真实阅读率是 36%——四百多条他其实会读。最后保留 5 条。
这两个数放一起有个推论:这个堆的问题不是“太多了”,是“排序坏了”。东西都在,只是被埋的顺序不对,所以每次打开都在最上面看到最不该看的。Unpile 的解法是把 94% 扔掉——这是把排序问题当成容量问题解。
我不否认扔掉有效。但有效和正确是两件事。排序问题用容量手段解决,代价就是三个月后找不到那 44%。
(这里得自我修正一句:前面写“判定层已收敛”说得太满了。判定层收敛的只是“怎么算一个概率”,没收敛的是“概率怎么变成动作”——后者才是排序问题真正待解的地方。这两件事被我压成一句话,是我的问题。)
八、落子
摊开这张地图,我的落子:个人分诊代理现在站在“判定层已收敛、循环层未开工”的阶段。
判定层不再是壁垒。一个云架构师——Nadaf 常驻浦那,手上 AWS、Azure、GCP 一堆认证,dev.to 上长期写东西——用一个挑战周的空闲就能搭出可演示的版本,还顺手把 TabPFN 和 Gemma 两条线都申报了评奖类别。下一波做这个的人不需要在判定层上重新发明什么。
壁垒挪到两块空地上。
第一块:意图捕获。作者自己在讨论里给了下一步计划——复查约 20 条误删,先按保存日期排查有没有时近性偏差,并考虑在保存时记录“为什么保存”这个字段,免得事后回溯意图失真。这是意图捕获的第一铲,方向对得不能再对:保存那一刻的意图最鲜,事后回溯全是重构。
这一块为什么没人做:它要动浏览器插件、要动保存流程、要在你按下收藏那一瞬间弹一个输入框。工程脏,看不到模型上的漂亮数字。但它恰好补 2.2 节那个洞——模型看不见你的饱和度,可你自己在保存那一刻是知道的。
第二块:可撤销。撤销栈加内容快照。本地部署成本几乎为零,云端是笔账。它不提高准确率,它把错误的暴露时间从“三个月后”拉回到“当天”。
下一站最可能从这两块的交叉口长出来:给分诊换一套指标。分类问题的指标是精确率和召回率;排序问题的指标是“你真正读的那几条排在第几”;可回滚动作序列的指标是“误操作恢复时间”。指标一换,工具箱整个换一遍——TabPFN 可能还在,也可能不在了,因为它的输出是概率,而排序要的是序。
我的判断:下一颗钉子不会钉在“更准的模型”上,会钉在“更便宜的撤销”上。这话可以被证伪——如果未来一年里这个方向没跑出任何像样的实践,那要么是这条路比我想的难,要么是这批工具根本没活到需要撤销的那一天。两种可能都接受,第二种更让我不安。
九、没画全的地方
按规矩交代。
多人共享列表——团队阅读清单、家庭共用——整块跳过,因为标签定义会打架:“读过”对两个人意味着完全不同的东西,硬并进一张表会把坐标搅乱。
非文本内容——视频、播客——没碰。那一支里“预计阅读时长”这个特征会压过其他所有列,整张图的权重结构会变形。
非英语内容源也没碰。那七列里“来源”这一列在不同语种里的含义完全不同,Unpile 是英文语料上长出来的,我不确定迁到中文信息流里还剩几分准。
240 条留出集的统计功效问题,怀疑摆出来了,但没算——算这个需要原始数据,我没有。
最后,这篇里所有数字都是作者自评,没有第三方复现。按“以作者自述为准”写,代码没核——GitHub 仓库和那个 60 秒视频都在,谁有兴趣自己去跑一遍,回来挪我的坐标。
交稿这天,这个项目刚满一周。这类工具的地图一周重画一次,我画的这张明天就开始过时。
