為什麼「太多筆記」跟「沒有筆記」是同一件事

先講一個我很早就認定、到現在也沒改過的規矩:我的筆記庫裡,一個主題只能有一則筆記。

不是因為潔癖。是因為同一件事如果有五個地方在講,我查東西的時候就得開五個檔案,還要自己判斷哪一版才算數。那個整理的工作沒有消失,只是原封不動地留給了未來的我。 而未來的我通常正在看診、正在趕投影片,沒空做這件事。資訊太多造成的混亂,跟資訊不足是同一種痛苦。

這條規矩在只有一個素材來源的時候很好守。難的是後來,來源越長越多,而且沒有一種會停下來等我:

這些工具解決的都是同一件事:把外面的東西變成看得懂的素材。它們讓素材的產量變高了,但那條「一個主題一則筆記」的規矩沒有因此變好守,反而變難守。

所以整套架構是兩層,界線畫得很硬:

  1. 素材庫:外面進來的東西全部丟進去,原樣留著、隨時可以回頭溯源。它可以雜、可以重複、可以互相矛盾,因為它的職責只是「保存證據」。
  2. 主題筆記:屬於我自己的部分,一個主題永遠只有一則,放在獨立的資料夾、照同一份模板寫。它是我唯一信任、也唯一會拿去用的那一份。

素材不是筆記

這條界線一旦模糊掉,筆記庫就會退化成一個比較漂亮的下載資料夾。

而把素材的內容併回主題筆記的那個動作,就是這兩層的交界處。這篇要講的 note-supplement,做的就是那一件事。

那也是整條線裡我卡最久的一段。從零寫一份新筆記,AI 做不好你一眼就看得出來:架構亂、沒出處、內容空。但「把新素材補進一份已經存在的筆記」不一樣。我有幾千則筆記,每一則都是過去某個時間點的我認真查證過的結果。

為什麼「幫我更新筆記」這句話這麼危險

直覺做法是把新素材丟給 AI 說「幫我更新這篇筆記」。我吃過幾次虧才想清楚問題出在哪:

AI 更新筆記真正的風險,不是它漏掉新內容,而是它會很安靜地改掉你舊筆記裡原本就對的東西。

而且你不會發現,因為輸出看起來仍然是一篇好筆記。

這兩種錯誤的代價完全不對稱:

  • 漏掉新內容:可回復。下次讀到同一份素材、或同一個主題再出現,你還有機會補。
  • 改壞舊內容:不可回復。因為那條內容你已經查證過了,你不會再去查第二次。它從此就以錯誤的樣子留在你的筆記庫裡,還帶著你自己給它的信任。

一旦看清這個不對稱,整個工具的設計就只剩一句話。

設計原則:新增很便宜,改動很昂貴

每一輪,note-supplement 會把素材跟既有筆記對三件事:

  • 哪些是筆記沒有、可以補進去
  • 哪些是兩邊講得不一樣
  • 哪些是筆記本來就有、素材沒提到的(這些一律不動)

然後把每一項變更先分類,再決定誰有權限執行。

自動放行的:帶引用的新增

多一條有出處的內容,不會傷害筆記。所以「新增事實 bullet 且帶引用」這類變更直接寫入,記進 changelog。

(有一項後來被我從自動放行拿掉了:把散落的 bullet 收成表格。它看起來只是排版,實際上是把每個事實重新塞進欄位裡,這是改寫不是新增,而且欄位錯位這種壞法無聲無息,產出還比原本更整齊。現在它要問過才做。)

不做「破壞性」裁決的:事實矛盾

這一段是我改最多的地方,也是這個工具第一版最大的設計錯誤。

第一版的規則寫得很硬氣:只要有事實矛盾就送審,不管哪一邊的證據看起來多強,一律不自動裁決。 聽起來很負責。實際跑了一段時間,我發現兩件事:

一、待審清單不是安全機制,是拖延機制。 清單一長,人就會一路按過去,所謂「留給你判斷」,實際效果等於「自動套用,只是多按了幾下」。而且報告每一條後面都有一行「我的建議是⋯」,那行字會定錨,你多半就照著它按了。那不是我在判斷,是它在判斷,只是排版比較客氣。

二、不決定本身就是一種決定。 衝突躺在清單裡的那段期間,筆記裡那條可能已經過時的舊說法,仍然是唯一被寫在那裡、被我信任的版本。「不裁決」的實際效果是「舊的自動贏」,而這個政策我從來沒有主動選過它。

所以 v1.1 換了個立場:不是不裁決,是不破壞。 矛盾先分兩個軸分類:

  • 類型:是同一本書、同一份 guideline 的新版取代舊版(那不是真的爭議)?是兩個各自可信的來源真的講不一樣?還是筆記那條根本沒出處、而素材那條有?
  • 風險:這個值弄錯了會怎樣。劑量、閾值、禁忌症、紅旗徵象算高風險;盛行率、命名沿革、背景知識算低風險。這個軸是一個可以調的旋鈕,不同領域刻度不一樣,醫學筆記只是刻度最嚴的那一端。

然後照分類路由:新版取代舊版直接更新,但舊的值用刪除線原地留著、附上原本的出處和日期,一個字都沒有消失;低風險的分歧,直接在筆記裡就地寫成一個區塊:

> [!conflict]- ⚖️ 未解決:沾黏性肩關節囊炎的自然病程(標記於 2026-07-23)
> - **A(既有)**:自限性,12–18 個月會緩解 `(出處, 年)`
> - **B(新素材)**:有相當比例的病人三年後仍有殘存症狀 `(出處, 年)`
> - 下次讀到這篇筆記時處理:刪掉這個區塊,留下你採用的那個版本(或加註條件後兩者併存)

兩邊的原話都在、出處都在、標記日期也在,沒有任何一邊被刪掉。它不會打斷我,但也不會消失。審查的時機從「寫入的當下」移到「下次讀到的時候」,那才是我注意力最好、上下文最完整的時刻;跑完一輪之後看一份清單,恰好是最差的時刻。

只有高風險的矛盾會當場停下來問我,而且一次最多五題。超過的部分一樣寫成上面那種區塊,並且在 changelog 裡誠實報數字。五題我會認真看;三十題我不會。

還有一個補丁是我漏很久才想到的:一篇筆記裡如果有一題高風險矛盾待決,那些依賴這個爭議事實的新增(同一段落、或前提就是那個值的內容)會一起被扣住,等我決定完才寫進去。不然我打開筆記要裁決的時候,那篇筆記已經先被改過一輪了。

那第一版的顧慮呢,誤判的代價是「我以後不會再去查證那一條」?那個顧慮沒有被推翻,是被繞過了:所有的裁決都不刪東西。舊的值還在那裡、還帶著它的出處和日期。如果哪天發現這次判斷錯了,我還查得回去。

永遠等人審的:重構與新開筆記

移動段落、合併章節、判斷「這應該是一則新筆記」,這些都需要對整個筆記庫的理解,不是單篇比對能決定的。

scatter 模式:一份素材,一整批筆記

單篇補充只解決了一半的問題。實務上更常見的是一份素材牽動十幾篇筆記:一場總複習演講、一份 guideline 更新。這也正是「三個來源匯進同一個筆記庫」的架構下最常發生的情況。

--scatter 模式會抽出素材裡的全部概念、找出每一篇相關筆記,然後逐篇套用上面的分級:

變更類型分級處理
帶引用的新增T1自動寫入
把既有 bullet 收成表格T2留給人審(v1.1 從 T1 降下來)
事實衝突依分類路由新版取代舊版→原地更新且保留舊值/低風險→就地寫成衝突區塊/高風險→當場問你,一次最多五題
段落重構T2留給人審
需要新開筆記T3留給人審

分級的目的不是自動化,是分配注意力。 機械性的八成自動完成,你只看需要判斷的那兩成。每次跑完給一份 changelog:哪幾篇被動過、各加了什麼、衝突怎麼解的、你否決了什麼。

不要相信模型說「我有做」

素材一長,語言模型的注意力就會被稀釋,整整一段被跳過,而輸出看起來完全正常。這件事我在聊愈久愈笨那篇講過機制;差別是那時談的是對話品質,這裡踩到的是內容真的少了一塊。而你事後去問它「都補完了嗎」,它會說補完了。

所以這裡的原則跟前面那條同樣重要:不信模型的自述,只信它留下來、可以對帳的東西。

強制逐條結案的覆蓋清單

素材裡的每一個標題都要列出來、逐一結案:產出了 N 項、已經涵蓋、還是什麼都沒有。凡是「什麼都沒有」的標題,一律回頭重讀一次才准收工。一個標題整段沒有產出任何東西,通常不是那段真的沒料,是注意力掉了。

而這張清單是輸出的一部分,不是它自己的草稿紙。差別在這裡:草稿紙上的自我檢查無法驗證,交出來的清單可以對帳。

結構盲的反向掃描

第一版的補救是:拿第一遍產出的草稿項目當搜尋詞,回頭重讀一次素材。這個做法方向根本是反的。從「已經找到的東西」推導出來的關鍵字,只能找回你找到一半的內容;一整塊完全沒被注意到的主題,你連拿什麼字去搜都不知道。漏掉的東西對它自己是隱形的。

所以第二輪完全不看章節結構,直接列出「素材裡有、筆記裡沒有」的每一條。兩個 lens 任一個抓到就算數。

順帶補了另一個洞:新增的內容不只跟它要放進去的那一段比對,而是跟整篇筆記比對。寫進〈治療〉的一條,完全可能跟〈背景〉裡的一個數字打架,只比對同一段的話永遠看不到。

真的用程式碼守住的部分

判斷類的事情交給模型,但能用程式檢查的就不要用模型檢查

  • scripts/gate_check.py:寫入前跑的機械檢查,包括壞連結、壞嵌入、殘留的引用佔位符、被散文打斷的表格、重複嵌入。純語法層,不需要判斷力,所以不該浪費模型的注意力。
  • benchmarks/:14 組刻意植入缺陷的素材/筆記配對,每一組都附標準答案(該補幾條、哪幾條是衝突、風險等級是什麼)。改了流程之後可以真的跑一次看有沒有退步,而不是憑感覺說「好像變好了」。

兩層之間不重疊

模型層負責語意,程式層負責格式與可驗證性。這樣整套流程才算得上有 harness,而不只是一份寫得很長的指示。

其他幾個真的失敗過才加上去的細節

素材本身可不可信,要先問

比對之前先分類素材:自己整理的講義、教科書章節、有同儕審查的材料算一類;AI 生成的摘要、來路不明的別人的整理算另一類。後者一出現,整輪的自動寫入全部降級成人工確認。這是屬於文件的性質,不是逐條判斷的性質,一份無法追溯的素材,不會因為它某幾條聽起來很合理就變得可追溯。

而最底線的一條沒有例外:每一條寫進筆記的內容都要帶出處,沒有出處的標成 AI 推論,不准混進去。

素材和目標是兩個不同的宇宙

還沒整理的原始素材資料夾(inbox、演講逐字稿),永遠不能成為補充目標。少了這條規則,AI 會很開心地去「補充」你那些未處理的雜物,在你真正的筆記庫旁邊長出第二座更爛的。那正是開頭說的「太多筆記等於沒有筆記」,只是這次是自己動手造出來的。

空段落掃描

依模板寫的永久筆記,總有幾個段落一空就是好幾年。所以在比對之前,工具會先列出目標筆記裡的空段落,並提議該從哪裡補(evidence 段落→文獻搜尋;機轉段落→教科書對應章節),一次問完。

怎麼用

這是一個給 Claude Code 的 skill 檔(本質是一份 markdown playbook,流程可以移植到任何讀得懂它的 agent 框架):

  1. skills/note-supplement/SKILL.md 複製到你的專案,存成 .claude/commands/note-supplement.md
  2. 換掉開頭三個佔位符:{NOTES_DIR}(你的永久筆記資料夾)、{SOURCES_DIRS}(素材資料夾)、{SEARCH}(你的搜尋工具)
  3. 在筆記庫裡執行 /note-supplement <素材檔案>

有語意搜尋索引會讓「找到正確的目標筆記」準很多,我用的是自己開源的 vault-search(也可以搭 graph RAG 那套),但一開始用 Grep 也能跑。

Repo(MIT,README 有中英文版):https://github.com/drpwchen/note-supplement

其他這條線上的工具我整理在我的 AI 工具箱那篇。

一點反思

整條線的目標從頭到尾都只有一個:外面的資訊可以很多,但落到我這裡必須收斂成一份。 前面那幾個工具負責把來源變成素材,這一個負責收斂,而收斂這一步,是最難、也最容易被做壞的地方。

也是在做這一步的時候,我對「AI 幫我做事」的想法有點改變。

我原本以為好的 AI 工具是多做一點:多懂一點、多決定一點、少問我一點。做完這個才發現,在「已經累積很久的東西」上面,好工具的價值反而是知道自己不該做什麼,把不對稱的風險辨識出來,把便宜的動作放行,把昂貴的動作停下來交還給人。

但這次改版又往下修了一層。我原本以為「停下來交還給人」就是負責任的終點,後來才發現那只是把責任搬到一個我不會認真讀的地方。把所有難題丟進一份待審清單,形式上很負責,實質上是把判斷外包給疲勞。 真正該問的不是「這件事該不該由人決定」,而是「這件事值不值得現在打斷這個人」。一次五題我會認真看;其餘的,用不會弄壞任何東西的方式留在原地,等我下次讀到再說。

這套邏輯其實跟醫學筆記沒有必然關係,任何「已經累積了一批可信內容、又要持續灌新資料進去」的系統都適用,差別只在那個風險旋鈕轉到哪一格。這部分我另外寫在 repo 的 docs/the-pattern.md

如果你自己也在處理「新舊資料打架」的問題,很歡迎跟我聊聊;如果覺得我哪裡想錯了,更歡迎指正。

boba-icon
請我喝珍奶!