我做了一个阅读器,然后把它删了

我做了一个阅读器,然后把它删了


伴书鼠最开始其实是个很小的念头。

我读 PDF 的时候会划线,会在旁边写几句话。有些只是随手记一下,有些已经是一个想法的开头。但一本书读完以后,这些东西基本也就沉下去了。PDF 还在,批注也还在,半年以后,我却很少会为了找当时某一句话,再把整本书翻出来。

单独抄出来也不太行。有些批注只有放回当时的原文里才有意义,过几个月再看,我自己都可能不知道为什么会写这句话。

所以我想做的事情很简单:正常读书的时候,能不能把这些东西接住,以后想起来,还找得到当时读到了什么、想到了什么?

顺着这个问题,我走了第一条看起来很合理的路:自己做一个阅读器。

功能越来越多,书却没读多少

逻辑其实很顺。如果要知道我看了哪一页、划了哪一句、写了什么批注,最直接的办法,就是把阅读放进自己的系统里。

于是伴书鼠开始变成一个在线 PDF Reader。从 Google Drive 选书,用 PDF.js 打开,可以翻页、划线、批注,记录一次 Reading Session,再根据新增的标记做 AI 整理。后来又加了“本书笔记”,想把同一本书里留下的东西放到一起。

技术上进展还挺顺。批注能保存,阅读记录有了,AI 能跑,本书笔记也出来了。每多一个功能,都能说清楚为什么需要它。

但我越来越不想用它读书。

打开 PDF 要等,界面要适应。原来在 Foxit 里很自然的操作,到了自己的 Reader 里,又得重新做一遍。书明明就在眼前,我却总是在处理围绕它的那些东西。

最讽刺的是,我本来因为“读书时的想法会丢”才做伴书鼠,结果一个周末下来,几乎没怎么读书,全在开发伴书鼠。

功能越做越多,书却一直合着

每个功能都有理由,书却一直没翻开。

到这里,问题其实已经很明显了。只是前面做了那么多,人会很自然地继续想:是不是再优化一下打开速度,再调整一下界面,等这个功能做好,就能用了?

我一直在问,怎样把它做成一个更好的阅读器。后来才开始问:我为什么需要自己做一个阅读器?

我继续用 Foxit,不就好了

我已经习惯用 Foxit 打开 PDF。正常翻页,看到有意思的地方就划一下,在旁边写一句话,这个动作本身没有问题。

如果为了让 AI 拿到这些记录,我得先换一个阅读器,适应另一个界面,重新学一套标注方式,那读书反而多了一道手续。

最开始明明想做一个不打扰阅读的东西,最后却要求我先进入它,阅读记录才能被接住。

想到这里,后面的选择突然简单了。Foxit 已经比我自己做的 Reader 好用得多,Google Drive 本来就在同步文件。伴书鼠能不能接在它们后面,只负责把新增的批注带回来?

现在的流程就变成了:我继续在 Foxit 里读,PDF 放在 Google Drive 同步目录里。写完批注,保存,文件变化由 Google Drive Desktop 同步上去。服务器上的伴书鼠定时检查,发现 PDF 更新,就下载下来,读取新增加的批注。

我们用批注的标识来区分哪些以前处理过,哪些是这次新留下的。新批注连同对应页的原文整理成 Memo,再进入 Personal RAG,以后需要时可以检索。

第一次真正跑通,我反而觉得,这才像伴书鼠。读书的时候不用打开它,也不用专门告诉它“这一段我读完了”。

后来又把桌面的 Books 文件夹接进 Google Drive。桌面上的 Books 是正在读的工作区,Drive 里的 book 是长期书库,伴书鼠两边都检查。一本书不必先导入某个新系统,我照常打开、照常读就行。

前面做的 Reader、Google Picker、PDF.js、Reading Session、本书笔记和网页批注界面,也就陆续退役了。几天前花时间做出来的东西,最后基本都删了。

说完全不可惜,也不是。但把它做出来、真的拿来读过,才发现自己需要的东西要小得多。

原文也不必提前全部搬过来

阅读器退下去以后,又碰到了一个类似的问题:批注需要上下文,那要带多少原文?

前面刚跑通时,我还把前后三页一起带上,想尽量保留完整。顺着这个思路往下,很容易又想把整章、整本书都放进 Memo 和向量数据库,免得以后不够用。

但原 PDF 本来就在。每次留下批注,有必要先把以后可能用到的内容全搬一遍吗?

后来改成先保存能回到原处的信息:书名、页码、批注标识、Google Drive file ID,以及文件路径。Memo 里保留批注和所在页需要的原文;以后讨论起来,如果这一页不够,再回原 PDF 取前后内容。

批注被收好,同时保留回到原页的线索

把批注带回来,也留下回到原文的线索。

这样做,原书还在原来的地方,Memo 留下当时的阅读记录,Personal RAG 负责以后找到它们。真要展开讨论,再按需要把原文取出来。

到这里才发现,前面做 Reader,和后来想多存几页上下文,其实有点像。总觉得把东西都拿到自己手里,后面才好办;但拿过来以后,打开、保存、同步、更新,又都变成了自己要负责的事情。

过去的批注,和今天的想法

还有一个边界,是做到后面才想清楚的。

假设今天我在书里写:“我很认同作者这个判断。”半年以后,重新讨论这个问题,我发现当时忽略了一个变量,现在已经不认同了。

那条旧批注要不要跟着改?

我觉得不用。它留下的是某一天读到这里时,我写过这句话。后来想法变了,这条记录仍然有意义,甚至正因为变了,回头看才更有意思。

所以伴书鼠和 Idea Keeper,也开始有了各自的位置。

伴书鼠把读书时留下的东西可靠地带回来。到了 Idea Keeper 里,再把它和过去的 Memo、博客、对话,或者另一本书里的内容放在一起,继续讨论。

我可以补充过去的判断,也可以推翻它。但新的理解应该留下新的记录,不必把过去的自己改得和今天一样。

这里说的 Source 和 Idea,最后落到的就是这么一件很具体的事:当时写下了什么,和现在怎么看它,可以同时保留。

书桌上终于可以少一个东西

现在把整条路摆出来,反而比最开始清楚。

Foxit 负责阅读,Google Drive 负责同步,伴书鼠采集阅读记录,Memos 保存,Personal RAG 检索。需要继续想一个问题,就到 Idea Keeper 里把材料接起来。有些想法最后写成博客,也有很多一直留在记录里。

伴书鼠不用把这些事情全包下来。以后即使支持 EPUB、Kindle,或者别的阅读来源,也先把相应的记录接进来,不必为此再做一个书架、一套知识图谱,或者一个“和书聊天”的入口。

回头看,这几天最容易走进去的地方,就是一个功能做好以后,很快又能想到下一个。每一步都合理,连起来却慢慢离读书越来越远。

最后删掉 Reader,我才重新回到了最开始的那个小念头:我只想正常读书,顺手留下的几句话,以后还有机会再找到。

“伴书鼠”这个名字,到这里反而更合适了。

它像躲在书桌旁边的一只小东西。你看你的书,划线,写几句话,然后保存,合上窗口。

它不打扰你。等你走了,再把刚才那几页上留下的东西,悄悄收好。