1. 项目概述:为什么我会攒一套知识工作插件
做了快十年的知识型工作,我最大的一个体会是:真正消耗人的不是某个任务本身有多难,而是那些肉眼看不见的琐碎中间环节。查资料要在浏览器、笔记、文档之间来回切换,整理摘要把格式反复调来调去,写方案时模板改了又改,最后归档时又发现命名乱七八糟。这些事单拿出来每一件都不难,但叠加在一起,每天都在啃掉大块时间。
所谓 knowledge-work-plugins,说白了就是我给自己攒的一套知识工作插件集。它不是一个现成买回来的软件,而是围绕"捕获、整理、输出、沉淀"这条链路,把散落在各个工具里的重复动作拆解掉,做成一个个可以独立工作、又能互相配合的小插件。这套东西解决的核心问题就是两件事:一是让知识进来的时候是整洁的,二是让知识出去的时候是高效的。
如果你也属于每天跟信息、文字、方案打交道的那类人——比如产品经理写文档、运营做竞品分析、研究岗做文献整理、开发者写技术方案——这套思路应该能直接抄作业。不需要你有很强的编程能力,也不要求你必须用某一种特定软件,关键是先建立一个正确的框架,再在这个框架里填上适合自己的插件。
我在搭建过程中踩过不少坑,也推倒重来过两版。这篇文章就把我的完整思路、代码结构、核心实现细节、排查过程全部整理出来,尽量把每一步为什么这样做都说清楚。你可以把它当成一份参考地图,而不是标准答案。
2. 整体设计与插件分层架构
2.1 先想清楚:你的知识工作瓶颈到底在哪一层
在动手写第一个插件之前,我先花了几天做了一件事:记录自己一天中的知识工作流,精确到每半小时切换一次应用记录一下。连续记录五天后,我把所有时间损耗点做了个归类,发现基本可以落进四个桶里:
- 采集:看到一篇好文章、一段关键对话、一个临时灵感,捕获它需要超过一分钟;
- 整理:捕获后需要手工补标题、打标签、归类目、调格式,一条笔记三分多钟;
- 写作:开文档卡在空命名里,内容写一半要找参考资料又得去翻旧笔记;
- 归档:项目结束后的资料整理永远滞后,最终堆成一个没有再打开过的分区。
这四个桶对应到插件体系上,恰好就是四个层次。我的知识工作插件集是严格按这个分层来组织的,并不是想到什么加什么。
第一层是采集层,解决"快"的问题。要求任何内容从看到到进入我的本地资料库,最多不能超过两次点击。第二层是整理层,解决"稳"的问题。新进来的内容要自动完成格式归一化、基础元数据补全,让它从"流水账"变成"可检索资产"。第三层是输出层,解决"顺"的问题。写作时需要的检索、模板、引用、排版工具都嵌在编辑环境里,减少上下文切换。第四层是联动层,解决"活"的问题。把定时任务、外部服务、通知串联起来,让资料库在没人盯着的时候也能自己维护自己。
这个分层的价值后来在维护过程中越来越明显。以前我下载一个插件只图方便,结果插件之间职责重叠,互相比谁的默认设置更激进,反而制造出一堆冲突。分层之后,我给自己立了一条规矩:新插件进库前必须先回答自己属于哪一层,如果哪层都不沾,那大概率是从根上就不该要。
2.2 插件集的目录结构与模块解耦
有了分层框架,下一步就是让它在物理结构上落地。我个人比较喜欢把整个项目当成一个独立的插件仓库来维护,每一个插件都是一个子目录,互不依赖,共用的能力抽出来放公共目录。这样做最大的好处是,任何一个插件出问题都不会拖垮整条链路。
我的项目实际目录结构经过三版调整,最终稳定成下面这样:
knowledge-work-plugins/ ├── core/ # 公共核心,含配置读取、日志、存储抽象 │ ├── config.py │ ├── logger.py │ └── storage.py ├── plugins/ │ ├── collector/ # 采集层:剪藏、截图转文、剪贴板监听 │ ├── organizer/ # 整理层:自动标签、补全标题、链接分析 │ ├── exporter/ # 输出层:模板库、发布脚本、引用插入 │ ├── automation/ # 联动层:定时整理、健康扫描、报表生成 │ └── dashboard/ # 可选:一个本地视图,展示整个库的统计信息 ├── tests/ # 针对每个插件的自动化测试 ├── data/ # 本地数据库与缓存,不入库 ├── scripts/ # 部署、安装、更新脚本 └── README.md # 插件清单与使用说明core 目录是后来才加的。第一版我把每个插件里都写了一份读取配置的代码,结果一旦要改全局参数就得同时改五个文件,错一个就出诡异问题。抽出 core 之后,所有插件都通过统一的接口读写配置和日志,新插件的开发成本也明显降下来了。
第二版的时候我还犯过一个经典错误:非要把所有插件拼成一个单体程序。结果功能上确实几个模块可以共享进程,但调试一次要把整条链路跑起来,一个小插件出 bug 会阻塞其余所有功能。打破重来改成现在的多进程独立插件模型之后,每个插件能单独启停,出问题单独重启即可,其他工具完全不受影响。
2.3 每个插件保持"单职责 + 标准接口"的准入门槛
如果你去逛插件市场,会发现"大而全"的插件最诱人——一个插件什么都能干,装上它仿佛一套东西全齐了。但这种插件也是长期维护的噩梦。我自己吃过这个亏:装过某个整合度很高的插件,它同时管采集、加标签、还带一个内置编辑器。前面两周确实很爽,两周后它更新了一次,采集功能的新行为跟我的目录结构冲突,内置编辑器的快捷键又覆盖了系统默认复制粘贴,那一次我花了整整一个晚上才把现场还原干净。
所以后来我对每个插件制定了一个"准入门槛",不满足就不往库里放:
- 只解决一个层里的一个问题,比如"监听剪贴板"和"从网页正文提取结构化内容"是两件事,做成两个插件;
- 通过标准接口与外部通信,消息格式统一为约定的 JSON 结构,不搞私有协议;
- 可配置项默认值必须保守,宁可主动关闭高级功能,也不偷偷改变用户已有行为;
- 必须自带测试,至少覆盖正常路径和一条异常路径。
这个门槛一开始执行起来有点繁琐,尤其是"每个插件都要有测试"这条,前期开发速度确实变慢了。但坚持到十几个插件之后,优势非常明显——每次升级核心库或者调整存储结构,跑一遍全量测试就能快速定位是哪个插件受了影响。对一个人维护的项目来说,这省下的排查时间远比写测试花费的时间多。
3. 核心功能实现:采集、整理、输出、联动四件套
3.1 采集层:剪藏与剪贴板监听的真实实现
采集层的目标一句话:让任何值得保留的内容,在五秒内进入本地库。我最终保留了两个插件,一个负责网页正文的抽取剪藏,另一个负责剪贴板监听。
网页剪藏插件的核心不是大家以为的"把网页整个截图存下来",而是对网页正文做结构化抽取。实现原理是基于对目标页面 DOM 的解析:先抓取页面信息,再对正文节点做密度分析。我试过不少现成的正文抽取库,普遍问题是面对如今大量动态渲染的页面时经常抽了个空壳。后来我在自己的实现里加了一个兜底逻辑:如果正文抽取模块判定结果的质量分数过低,就自动回退到读取剪切板中用户已选的文本,用选中内容配合当前页面标题组成一条新笔记。
剪贴板监听插件则是文本采集的另一条腿。后台监听剪贴板变化,如果检测到连续复制了两段以上内容,并且间隔时间在设定阈值内,就自动弹出一个快速记录窗口,让你给这一段内容补一个标题和来源,确认后写入待整理区。这个功能我一开始觉得有点多余,但实际用了一周后发现,写材料时顺手复制参考段落,顺手就存进"素材箱",比之后专门打开软件整理要省非常多的时间。
采集层还有一个我自己坚持的细节:所有进到资料库的内容,一律保留来源链接并写入抓取时间。这个习惯在后面的整理和引用环节帮了大忙,因为你永远不知道什么时候需要回去核对原文。踩过一次坑之后加上了这个字段——有一次引用了一段二手转述,结果原文早变了,因为没有链接,核对成本非常高。
3.2 整理层:自动标签、模板归一与链接重排
采集进来的内容如果原样堆着,那只是个半成品。整理层的职责是把这些半成品变成可以长期复用的资料资产。
自动标签是第一道工序。我试过基于纯规则的关键词匹配,也试过调模型做语义分类。对中文资料来说,纯规则匹配的精度其实能到八成以上,前提是你得先花时间维护一本自己的领域词典。那本词典本质上就是一个 JSON 文件,包含每个领域的核心词、近义词、排除词。具体逻辑是:匹配到核心词给单独权重,近义词给一半权重,排除词直接按比例扣分,最后得分最高且超过阈值的那几个领域接口,就是该篇内容的候选标签。
第二道工序是格式归一化。我自己定义了一套知识笔记的元数据模型,统一为这样一组字段:标题、来源类型、来源链接、创建时间、捕获时间、正文内容、标签列表、相关链接。采集层写入的时候允许只有其中三四个字段,整理层会负责补齐剩余部分。标题自动润色规则是把对话式标题改成名词短语式,比如"我今天看了个文章讲如何做竞品分析"自动改成"竞品分析方法要点摘录"。
第三道工序是链接重排。这一步的核心是扫描正文中提到的重要实体,去资料库索引里匹配已有笔记,如果命中就自动在底部生成"相关笔记"推荐链接。我最初的实现纯靠字符串包含,后来发现实体对齐的问题更复杂便做了改进:先把正文拆成短句,对每个短句生成语义特征,再去索引里做近邻检索。这套做下来后,资料库的复用率明显提高了——以前"我记得记过相关的东西但找不到"的情况大幅减少。
3.3 输出层:写作模板、引用插入与一键发布
整理好的资料最终要服务输出,不管你是写周报、写方案还是发博客。输出层要解决的核心问题是:打开文档后,不再需要离开编辑器去别处找内容。
我做的第一件事是整理了一份写作模板库,按照"方案报告、周报、技术复盘、读书笔记、竞品分析"五类高频文体,每类做一份带结构的模板。插件里注册了一个快捷指令,输入命令后它会弹出模板选择列表,选中后自动创建文档并填充好章节骨架和提示引导。这件事看起来简单,但实际检查了非常多的细节,比如模板里的占位符怎么解析、变量如何替换。光是为"在光标处插入模板"和"新建文档用模板"这两种模式的支持就写了两个不同的分支逻辑。
引用插入是另一个高频刚需。写作过程中要引用资料库里的一句话或一条数据,我在文档编辑环境里注册了搜索快捷键,唤起一个本地搜索浮层,输入关键词后直接检索资料库,选中结果后自动在光标处插入引用,并同步补齐来源链接和片段原文。实现上最麻烦的部分是"浮层"这个东西——它不是普通的输入框,要支持搜索结果列表、键盘上下选择、回车确认。我在这部分花了最多时间调试,因为输入框的焦点控制很容易被外层文档组件抢走,后来换了一种全局挂载浮层的方式才稳定下来。
一键发布其实属于轻量实现了。给定本地文档,一键生成固定格式的 HTML 文件,并将本地图片上传到图床。这个功能前后写了三天就完成了,因为它的核心工作量并不在于发布本身,而在于给图片做规范化处理(重命名、压缩、校验格式)。发布标题解析与站点要求不符的情况也踩过,我加了一组正则替换规则,把发布物里的特殊字符统一替换成安全字符,这个细节在实际使用中价值很高。
3.4 联动层:定时整理、资料库健康度与日报
如果说前三层解决的是"当下"的工作,联动层解决的是"以后"的问题。知识库这种系统,如果没有定时维护,三个月后就会变成垃圾场——重复条目越来越多,过时信息无人清理,空链接占比升高。
我做了两个定时任务。第一个是"每日整理任务",每天固定时间运行,扫描"待整理区",把昨天采集进来的新内容按整理层规则批量处理。这个任务的核心价值在于它是批量执行:当内容积累到五十条时,自动补全标签和格式归一化的速度远超手工一条条处理,而且不会漏。
第二个是"资料库健康度诊断"。它会统计这些数据:重复条目占比、孤立链接占比、过期来源数、未分类笔记数、每月增长量与检索命中率。诊断结果用一份简易报表输出,存放在 dashboard 插件渲染的本地页面里。针对每种问题,报表会给一个处理建议,比如重复度超过阈值就提示执行去重脚本。在写这个诊断插件之前我从没意识到自己的资料库重复率居然接近百分之十五,跑完脚本去重之后,搜索速度都变快了。
联动层的核心设计原则是"默认不打扰"。定时任务只在固定时间运行,诊断报告只存本地,不做推送提醒。因为知识工作者最烦系统在旁边不停提醒,该安静做事的时候绝不制造噪音。这条原则让我跑了一个季度后,并没有产生"管理资料库变成一种负担"的感觉。
4. 从零搭建的实操过程记录
4.1 前期的环境准备与基础设施搭建
不管你的主力工具是什么,搭建这套插件集之前建议先把基础设施想清楚。我这里的"基础设施"包括四个部分:运行时环境、本地数据库、配置管理系统、日志系统。
运行时环境我选了通用的脚本语言环境,主要是因为它生态里现成的解析库和自动化库都齐备,不太需要自己造轮子。版本管理方面我用了虚拟环境,把依赖都锁定在一个清单文件里,避免某次更新把环境搞坏。这一点很重要,因为插件集之间共享的公共库一旦发生升级,影响往往是全局性的,有锁文件就多了道保险丝。
本地数据库我选择了文件型嵌入式数据库,不需要单独起服务就能读写。资料库的索引存在其中,正文本身仍然以文件夹加 Markdown 文件的形式落盘。这样的好处是即使哪天数据库文件损坏了,文件都还在,损失可以控制在"重建索引"的级别。file 结构我用了一个数据表记录元数据,正文文件用一个目录树按日期和主题双层归档。
配置管理系统用了一个很朴素的做法:一个全局配置目录下放若干个文件,每个插件按需读取自己对应的那段配置。读取时有一个核心的"配置加载器"负责把文件读成字典,并且做缺失参数的默认值填充。这些听上去不像什么复杂的功能,但没有这套东西,插件之间的配合会乱成一锅粥。
日志系统起初被我不太在意,后来嫌费事就拖到一次线上故障后才补上。那次是某插件的定时任务半夜跑挂了,但所有日志都写进了同一个文件,等我发现时已经滚动覆盖掉了关键信息。之后我立刻改了日志方案:按插件分文件,按天轮转,保留三十天。你能调出任意一天任意一个插件的运行记录,这个能力在排查问题时简直救命。
4.2 亲手写第一个插件:网页正文结构化抽取
第一个插件是一个"网页剪藏"工具,看起来简单但处理好边界情况却不容易。
实现的核心函数放在一个脚本里,主要流程是三步。第一步是抓取 URL 并分析文档结构,第二步是做正文识别和内容提取,第三步是把正文清洗成统一的 Markdown 格式并写入资料库。
import requests from bs4 import BeautifulSoup def extract_main_content(url): """从网页中抽取正文结构。""" resp = requests.get(url, timeout=15) resp.raise_for_status() soup = BeautifulSoup(resp.text, "html.parser") # 去掉干扰节点:导航、广告、页脚等 for tag in soup.find_all(["script", "style", "nav", "footer", "aside"]): tag.decompose() # 依据文本密度挑选最可能的正文容器 candidates = soup.find_all(["article", "main", "div", "section"]) best_node = None best_score = 0 for node in candidates: score = sum(len(p.get_text(strip=True)) for p in node.find_all("p")) # 文本密度过高一般意味着是列表聚合页而非正文页 if score > best_score: best_score = score best_node = node if best_node is None: return {"title": "", "content": ""} title = "" title_tag = soup.find("h1") if title_tag: title = title_tag.get_text(strip=True) paragraphs = [p.get_text(strip=True) for p in best_node.find_all("p")] content = "\n\n".join(paragraphs) return {"title": title, "content": content}你别看这个函数这么简洁,最初版本比这长三倍,因为有大量规则是试图处理不同的页面布局特异性的。后来我想通了一点:与其去适配各种边缘场景,不如留好兜底策略。所以在正式代码里,正文抽取失败时会提示"该页面不适合自动抽取,请手动选择文字后再使用"。让一条路走不通时能明确地给用户反馈,这种设计比试图处理所有情况都理直气壮得多。
在内容清洗环节,我处理了这些典型问题:软连字符和零宽字符的残留、多余空行的压缩、链接的无协议相对路径补全。这些细节属于看得到问题但很容易不去解决的问题,而恰恰正是这些细节决定了抽取后的文本是"基本可用"还是"可以直接入库存档"。
4.3 第二个插件:元数据自动补全与标签建议
第一个插件解决了"让内容快速进来",第二个插件解决"让进来的内容自动变得规整"。这个插件的核心功能是元数据自动补全。
它的输入是待整理区里的原始条目,输出是补齐了标签、润色了标题、加入了相关链接的正式条目。最具设计感的部分是"字段置信度"机制:原始条目里每有一个字段缺失或者格式不符合要求,插件就给这条记录打一个"未完成"标记,并记录缺少的具体字段。这样一来,整理任务就不是闷头跑一遍,而是只处理真正需要处理的部分。
标签推荐在这版实现里用了"领域词典加权"的方法。有一个长期维护的词典文件,内容大概是这样的结构:
{ "产品分析": { "core_words": ["用户画像", "功能矩阵", "优先级", "roadmap", "需求池"], "synonyms": ["PRD", "需求文档", "产品规划"], "exclude_words": [] }, "技术方案": { "core_words": ["架构", "接口", "数据库", "缓存", "性能"], "synonyms": ["技术选型", "系统设计"], "exclude_words": ["产品方案"] }, "运营复盘": { "core_words": ["转化率", "留存", "活动", "拉新", "复盘"], "synonyms": ["运营分析", "数据复盘"], "exclude_words": [] } }计算时给每个领域打一个初始分,核心词每命中一次加权三分,同义词加权一分,排除词每命中一个扣五分,最后得分低于两分的领域自动排除掉。这套算法的优点是简单、可解释、完全可控,你随时能打开词典看为什么这条笔记被打了这个标签,而不是一个什么都给不出解释的黑盒。
刚开始维护词典是别扭的,但用了两周后词典就稳定下来了。我有个小技巧:持续观察"零标签笔记",给它们里的高频词补进对应领域的 core_words 中,这样再次运行整理任务后,那些笔记就能自动分类了。用这种方式迭代大约一个月后,零标签率能控制在百分之三以下。
4.4 联调测试:从单个插件到整套工作流
单个插件各自能跑通之后,要把整套工作流连起来做联调。我建议你把"模拟完整的一天"作为测试场景来跑:模拟上午剪藏了三篇文章,下午复制了一段会议记录中的关键结论,晚上记录了两个灵感片段,第二天早上整理任务应该把它们全部清洗归档。
我的联调和测试分了三层:
第一层是单元测试,每个插件的核心函数必须覆盖正常、边界、异常三类用例。比如剪藏插件只给一个空 URL 时会抛异常;标签插件遇到完全没有核心词的文本时会返回空标签数组;存储插件遇到磁盘空间不足时不崩溃而是给出可读的错误提示。这些用例单独跑,全部通过后再进入下一层。
第二层是集成测试,模拟整个"采集—整理—输出"的完整数据链。这里的做法是临时创建一套测试数据目录,跑一遍全流程,断言每一步产物的元数据正确。集成测试的价值在于,它能暴露出单个插件的输入输出格式不匹配问题——比如剪藏插件返回的标题字段名是"head",而整理插件读取时用"title",在集成测试里第一个跑出来失败的就是它。
第三层是端到端手动验收,模拟真实使用习惯进行操作,观察插件在工作流里的实际表现。走到这一层时,测试的重点不再是功能是否正常,而是节奏是否顺畅。我发现最有价值的改动都来自这里,例如"剪藏成功后自动打开待整理区"这个交互动作,会让"采集后是否需要手动跑到整理界面"这个问题从根本上消失。
5. 实际运行中的常见问题与排查经验
5.1 问题一:采集的内容出现了"半成品"状态
这个问题的表现形式是:剪藏插件明明报告成功了,但资料库里那条记录的正文是空的,或者只有页面导航文案。这类问题排查起来特别麻烦,因为原因可能出在页面反爬、链接跳转、正文抽取误判等多个环节。
我后来加了一个保护措施:每次采集的文章都会同步保存一份原始 HTML 快照,放在临时目录。当正文抽取产生空结果的异常信号时,系统不会写入正式库,而是把快照挪到"待人工处理区",附上抓取时的状态码和页面大小。为什么要保留原始快照?因为很多问题只有你拿着原文去对比才能定位是"抽取算法出错"还是"页面本来就空"。保留快照让问题排查的上下文完整了,修复的难度立刻降下来。
还有一个经常发生的隐蔽问题:某些网站的正文是异步加载的,直接抓取只能拿到外层壳。我第一版没做浏览器渲染支持,后来在规则里加入了一条:当正文抽取的文本长度低于某个阈值时,留一个标记,让用户知道这篇内容可能需要二次检查。虽然不能完全自动解决动态渲染问题,但至少不会把半成品当成成品入库。
5.2 问题二:自动标签经常给出过于宽泛的领域
自动标签上线后,最常收到的抱怨是"标签太宽泛了,全都贴到同一个大类上"。比如一篇讲产品定价的文章,被自动打上了"产品分析";一篇讲竞品调研方法的文章,也被自动打上了"产品分析"。它们是同一类没错,但对用户来说细分度不够。
我排查后定位到原因在词典的结构上:词典只有领域层,没有子领域层,于是所有命中该领域的内容都会归并到一起。解决方案是给领域词典增加一套可选的子领域配置,当一段文本同时命中某个大领域下的多个子领域关键词时,子领域字段就会被保留下来。比如"定价"和"用户画像"虽然都属于产品分析,但它们的分支字段不同,后续在检索时就能做到更精确的定位。
这一步改动需要重跑一遍历史资料库的整理任务,所以我又写了一个"批量重分类"脚本,它只重新执行分类逻辑,不做其他修改,保证旧笔记不会因为新逻辑被意外改动。批量跑完后,资料库的标签结构立刻清晰多了,周报整理时可以按更细的维度去切数据了。
5.3 问题三:资料库重复内容越来越多
知识工作插件带来的副作用之一就是"收集太多但清理太少",采集非常方便的结果往往是同一篇内容被存了多次,一次是网页剪藏,一次是剪贴板复制粘贴,还有一次是手动记了一段相同内容。
重复检测是资料库维护中最棘手的一个问题,因为它不只是判断两个字符串完全相等那么简单。两个内容来源不同但核心结论相同,或者一个是另一个的压缩版,这种情况靠简单哈希无法识别。我实现的是两级去重策略:
第一级用"正文指纹"做完全去重——对正文做规范化处理后计算哈希,丢掉标点和空白后取内容的前两百个字符作为指纹。这一级能处理百分之九十的重复场景。
第二级用"相似度扫描"做语义去重——每篇正文切分成句子集合,然后用相似度算法比较两个句子的重合比例,超过设定阈值就判定为近似重复,在报表里提示。这一级会留出人工确认的余地,因为"相似"不等于"重复",有时候两篇内容稍微相似但各自跌宕起伏,强行去重会丢失细节。所有重复判断的初步结果写进一个"疑似重复清单",由用户确认后才会真正执行合并操作。
5.4 问题四:插件更新导致配置不兼容
一个人维护插件集,最害怕的事情之一,就是某天升级了公共依赖库,第二天发现某个插件启动时报了一堆配置读取错误。我踩过一个大坑:某个公共依赖库升级后,默认行为发生了变化,导致我配置文件里的旧参数被直接忽略了,而系统没有给出任何警告。
那次事故之后,我给自己定了一个铁律:任何公共依赖库升级之前,必须先在虚拟环境里跑一遍全量测试,并且升级后把配置文件的版本号一起更新,配置读取器会校验版本号,不匹配时直接提示用户升级配置模板,而不是静默忽略。这个过程听起来繁琐,但它保障了插件集的整体稳定性。
另一个值得养成的习惯是:每次新写一个插件或改完核心代码,顺手把它写进项目说明文件里,标明用途、变更点、影响范围。我一个人维护时不注意它,但现在回看,很多坑都是在"我忘了我当时为什么要这样改"以及"我忘了这个插件依赖了那个插件的那个输出"上。项目说明文件不是什么强力文档,但关键时刻能帮上不少忙。
6. 写在最后:这套插件集后续还能怎么扩展
跑了大半年后,我突然意识到这套插件集最大的收益不是省了多少小时,而是我对待信息的态度变了:每次看到有价值的内容,我会知道它会在一个明确的地方被妥善处理,不用焦虑"会不会看完就找不到了"。那种"捕获零阻力、复用有保障"的心理踏实感,是任何效率技巧都无法替代的。
如果要从我个人的经验里提炼几条后续扩展的方向,我会建议你从这三处入手。第一是给插件集加一个统计视图,让数据可视化地告诉你采集频率在哪些天异常高、哪些领域的笔记零引用率最高,根据这些数据去反推自己的工作流设计。第二是尝试给整理层接入更高质量的语义匹配能力,句子级别去重进化为"意义级别去重"还有很大空间,特别是判断两段话"虽然用词不同,但表达同一个观点"这件事,目前还依赖人工判断。第三是让输出层的模板更智能,可以尝试让模板根据素材自动预生成第一版大纲,而不是每次从头排结构。
最后再分享一个实际操作中的体会:插件好不好用,不取决于功能列表有多长,而取决于它在你最累、最着急、最不想动手的时候还愿不愿意被用起来。设计这套插件集的过程中,我砍掉的功能比留下的多得多,每砍掉一个都是提醒自己"这个花哨功能真正高频使用的场景存在吗"。知识工作工具最重要的价值不是无所不能,而是让你在做知识的输入与输出时,感觉阻力最小、损耗最低、心情最顺,仅此而已。