選工具之前,先估算你的文獻有多少字。下表的門檻來自 Anthropic 與 Karpathy 公開的經驗值,是起點,不是定律。
| 規模 | 建議做法 | 依據 |
|---|---|---|
| 20 萬 tokens 以內(約 500 頁) | 不必建索引,整份放進對話,請 AI 附頁碼回答 | Anthropic〈Contextual Retrieval〉 |
| 約 100 份來源、數百頁 Wiki | Wiki 化:index.md+概念頁,AI 先讀索引再讀頁面,可以不用向量資料庫 | Karpathy〈LLM Wiki〉,2026 年 4 月 |
| 更大,或需要在全文中找特定段落 | Wiki 管概念與關係;底下再接一層 RAG,負責從全文撈出原文段落 | qmd、Contextual Retrieval 等實作 |
| 要對整個語料做主題歸納 | 確有需要時才考慮 GraphRAG、RAPTOR 等結構化方法,建置成本高 | Microsoft GraphRAG、RAPTOR |
KMDB 目前有 226 本書、約 8,100 萬字元的清理稿,遠超過一次對話能讀的量。所以我們兩條路都要:用 Wiki 整理概念與書與書之間的關係,用 RAG 回到全文找原句。本講義的示範只取其中 7 本研究方法書:
| 代號 | 書名 | 原文形式 | 字元 |
|---|---|---|---|
| SRC-YIN-CSR5 | 案例研究:設計與方法(第 5 版) | 簡中譯本(掃描 OCR) | 264,486 |
| SRC-GILLHAM-CSRM | Case Study Research Methods | 英文原文 | 166,148 |
| SRC-TT-ABD | 從資料分析到理論突破:如何用溯因分析做出創新性的質性研究 | 簡中譯本 | 177,564 |
| SRC-KUHN-SSR | 科學革命的結構 | 簡中譯本 | 178,774 |
| SRC-MAHONEY-LSS | 社會科學的邏輯 | 簡中譯本 | 411,979 |
| SRC-WS-NVIVO | 使用 NVivo 進行質性分析:五層級 QDA 方法 | 英文原文 | 593,282 |
| SRC-XIE-THESIS | 研究生論文寫作與時間管理 | 簡中譯本 | 124,145 |
| 合計 7 本 | 1,916,378 | ||
語料刻意混合三種情況:簡體中文譯本、英文原文、掃描 OCR 本。DBA 學生手上的文獻多半也是這樣混雜,而問題往往就出在這裡。
這一節說明概念與做出來的樣子。想直接動手,請到第 8 節,從步驟 0 開始做。
Andrej Karpathy 在 2026 年 4 月公開了一種做法:不要每次提問都從原文重新撈片段,而是讓 LLM 把讀過的東西編譯成一個持續累積的 Markdown Wiki。他的原話是「the wiki is a persistent, compounding artifact」。他說自己的研究 Wiki 約 100 篇文章、40 萬字,原以為需要複雜的 RAG,結果 LLM 自己維護索引檔就夠用。
| 層/操作 | 內容 | 對應到我們的 KMDB |
|---|---|---|
| 原始層 raw | 原始資料,AI 只讀不改,是唯一的事實來源 | cleaned_*.md,逐頁保留 PDF 頁碼錨點 |
| Wiki 層 | AI 寫的摘要頁、實體頁、概念頁、比較頁,全部由 AI 維護 | 書目頁、概念頁、主題地圖、問答歸檔 |
| 規則層 schema | 一份告訴 AI 怎麼維護的檔案,例如 CLAUDE.md、AGENTS.md | AGENTS.md:頁面類型、欄位、連線類型、流程 |
| 匯入 ingest | 讀一份來源,寫摘要頁,更新 10–15 個相關頁面、索引與紀錄 | 一本書動到 1 張書目頁+數張概念頁 |
| 查詢 query | 先讀 index.md,再進入相關頁面,附引用作答;好的答案存回 Wiki | queries/ 資料夾 |
| 健康檢查 lint | 找矛盾、過時說法、孤兒頁、缺少頁面的概念、缺漏的交叉連結 | tools/wiki_lint.py |
這個想法並不新。Zettelkasten 要求一則筆記只放一個概念、每則有固定 ID、連線時寫明為什麼連;Nick Milo 的 Maps of Content 用一頁地圖串起相關筆記;Andy Matuschak 的 evergreen notes 主張筆記要原子化、以概念為單位、密集連結。LLM Wiki 的新意在於,維護工作交給 AI,而這些筆記方法的原則,正好讓 AI 檢索更有效率。
| 原則 | 怎麼做 | 為什麼對 AI 有效 |
|---|---|---|
| 索引優先 | index.md 每頁一行:連結|ID|標題|一句話摘要;超過 200 行就依類型拆檔 | AI 只讀索引加 3–5 頁,不必一次吞下全部內容。Chroma 的 Context Rot 研究顯示,輸入越長,模型表現越不穩定 |
| 一頁一個概念 | 概念頁 120 行以內;太長就拆 | 頁面本身就是天然的檢索單位,不必再切分 |
| 固定 ID 與別名 | frontmatter(檔案最上方兩條 --- 之間的屬性區)寫 id、aliases;新建頁面前先查別名 | 「常規科學/常態科學」「不可公度/不共量性」「庫恩/孔恩」不會被建成兩頁,也不會漏抓 |
| 有型別的連線 | 五種:引用、概念相近、方法延伸、立場衝突、研究者推論 | AI 知道兩頁之間是什麼關係,也分得出哪條連線是原書的、哪條是我們推的 |
| 每句主張附頁碼 | 沿用 KMDB 的三層證據標記:原文依據、根據原文推論、延伸應用;格式 (SRC-ID p.頁碼) | 回答可以直接回到原始層與 PDF 核對 |
| 只追加的紀錄 | log.md 每筆以 ## [日期] 操作 | 對象 開頭 | 新增、修改都留下紀錄;這就是 Yin 說的「個案研究資料庫」 |
wiki/
├── AGENTS.md 給 AI 的維護規則(先讀這份)
├── index.md 索引:21 頁,每頁一行
├── log.md 維護紀錄,只往下追加
├── sources/ 書目頁 7 頁:書目、摘要、可回查頁碼、清理品質備註
├── concepts/ 概念頁 12 頁:跨書整合,每句附頁碼
├── maps/ 主題地圖 1 頁:依論文流程排列
├── queries/ 問答歸檔 1 頁:查詢後存回的答案
├── catalog/ KMDB 全部 226 本書,一行一本(程式自動產生)
└── tools/ build_catalog_index.py、wiki_lint.py
示範 Wiki 的原文留在 KMDB 裡,所以沒有 raw/ 資料夾;你自己做的 Wiki 會把書稿放進 raw/(第 8 節步驟 1)。catalog/ 是選配的全庫總目錄。
下面是一張概念頁的開頭。注意 relations 裡有一條連線標為「研究者推論」:把溯因分析的「意外發現」和孔恩的「反常」連在一起,是我們的判讀,不是任何一本書的主張。建立文獻樹時,最需要分辨的正是這件事。
---
id: CON-005
type: concept
title: 溯因分析
summary: 從理論預期之外的意外發現出發,提出暫時性解釋,再用資料反覆修正以建構新理論
aliases: [溯因推理, 溯因, abductive analysis, abduction, 意外發現, surprise]
sources: [SRC-TT-ABD]
relations:
- {type: 方法延伸, target: qualitative-coding, basis: 引用}
- {type: 概念相近, target: anomaly-crisis-incommensurability, basis: 研究者推論}
- {type: 立場衝突, target: case-study-research, basis: 研究者推論}
status: draft
---
## 原書怎麼說
- `原文依據` 做菜比喻:想照食譜做菜卻發現沒有大蒜,只有一筐一時衝動買的
金橘,於是運用已知的烹飪知識做出新菜(SRC-TT-ABD p.4)。
- `原文依據` 皮爾士把溯因描述為從意外事實跳到暫時性假設的推論;歸納與
演繹負責後續的檢驗(SRC-TT-ABD p.14–16)。
Wiki 會隨時間變亂。Karpathy 指出,人們放棄維護 Wiki,是因為維護負擔增加得比價值快;所以健康檢查要交給程式定期做。我們把檢查程式對 KMDB 的書目與知識萃取檔跑了一次,找到這些問題:
| 發現 | 例子 | 影響 |
|---|---|---|
| 同一本書處理了 3 次 | 《設計關鍵對話》分別存成 3 個資料夾 | 檢索時同一段話出現三次,排擠其他書 |
| 版本 A/B、上下冊 | How Countries Go Broke 版本 A、B;《何謂教育》上、下冊 | 需要人判斷:上下冊是正常的,重複版本應合併。程式只能標「疑似」 |
| 分類欄位殘留程式欄位名稱 | 3 本書的大分類是「name;middle」 | 依分類篩選時這 3 本會消失 |
| 分類沒有共用詞表 | 226 本書用了 560 種大分類詞,其中 549 種只出現一次 | 大分類其實是各書的章節主題,無法拿來跨書瀏覽 |
| 萃取格式不一致 | Yin 一書的條目標題格式不同;一本書有 10 個條目、0 個「證據位置」欄位 | 程式抓不到頁碼,AI 回答時無法附來源 |
這次的概念頁由 AI 起草,再回原書逐頁核對。核對時發現一處錯誤:AI 起草時把 Gillham 寫成「如果所有證據都一致,反而要懷疑」。回到原文第 19 頁,作者的意思其實是:
If every kind of evidence agrees then you have simple, confirmatory triangulation. … Often you don't get that.(Gillham, PDF p.19)
原文說的是「全部一致是單純的確認性三角驗證,但實際上常常不一致」,和 AI 寫的意思差很多。這就是為什麼概念頁預設是 status: draft,人工回原書核對後才改成 reviewed;也是為什麼每句主張都要附頁碼。沒有頁碼,這個錯就查不出來。
RAG(Retrieval-Augmented Generation,檢索增強生成)的骨架只有六步。課程筆記本把每一步都攤開,中間結果都印出來(下載筆記本,再到 Colab 上傳開啟|檢視程式碼 kmdb_rag.py):
PDF 斷行。轉出的文字每行都硬換行,一句話被攔腰截斷。不處理的話,切分程式找不到句子的邊界。
簡體原文、繁體提問。示範語料中 6 本是簡體譯本,抽樣約有三成的漢字繁簡寫法不同。用繁體問「為什麼」,簡體原文寫的是「为什么」,關鍵字檢索就對不上。我們用 OpenCC 的 s2tw 統一轉成臺灣用字;不要用 s2t,它會把「吃」轉成「喫」、「為」轉成「爲」。
譯名與 OCR 雜訊。簡中譯本寫「庫恩」「常規科學」「不可公度」,臺灣慣用「孔恩」「常態科學」「不共量性」,這是字形轉換解決不了的。Yin 一書是掃描本,頁首常出現「2 RAFRARHRIt 59」這類亂碼,也有「圳括」這樣的錯字。
| 比較 | 有處理 | 沒處理 |
|---|---|---|
| 接回 PDF 斷行(固定長度切分) | 75% | 70% |
| 繁簡統一(遞迴切分) | 75% | 45% |
繁簡未統一的對照,是把語料維持簡體、問題維持繁體,其餘條件相同。
下面是孔恩一書導讀的同一段文字,標記 | 的地方是切點。固定長度切分每 500 字切一刀,切在「工|作」中間;遞迴切分先找段落,再找句號,切在句子結束處。
固定長度 500 字
遞迴切分 500 字
這個單元帶你用 Google Colab 從頭到尾跑一次 RAG_一次做起來.ipynb。Colab 是 Google 提供的線上 Python 筆記本,用瀏覽器就能執行,不必在自己的電腦安裝 Python。全程約 30–40 分鐘,其中一半以上的時間是在等模型下載與向量化。
做完之後,你會得到三樣東西:
各步驟附上的輸出,是用預設的 3 本書實際執行的結果。你的畫面應該大致相同,但時間會依機器而異。
books/。00_課程示範/rag/ 的課程版),或下載 .ipynb 檔,再到 Colab 上傳開啟。| 步驟 | 怎麼做 | 你應該會看到 |
|---|---|---|
| 1 開啟筆記本 | 兩種方式擇一:(1) 點在 Colab 開啟,直接打開 Drive 上 00_課程示範/rag/ 裡的 RAG_一次做起來.ipynb;(2) 從本講義下載筆記本,到 colab.research.google.com 選「檔案 → 上傳筆記本」 | 左側是目錄,中間是一格一格的說明文字與程式碼 |
| 2 存一份自己的副本 | 選單「檔案 → 在雲端硬碟中儲存副本」。共用資料夾是唯讀的,之後的修改都在你的副本上做 | 筆記本標題前出現「副本」字樣 |
| 3 切換到 GPU | 選單「執行階段 → 變更執行階段類型」,硬體加速器選 T4 GPU,儲存。免費帳號的 GPU 有使用時數限制;分配不到時,維持 CPU 也能跑,只是比較慢 | 右上角顯示已連線,並出現 RAM 與磁碟用量 |
| 4 把資料夾加到我的雲端硬碟 | 依 4.3「方式 A」的步驟 1–3,用和 Colab 相同的帳號打開 KMDB 練習資料夾,新增捷徑到「我的雲端硬碟」。不做這一步,Colab 找不到課程資料夾。改用「方式 B」上傳 zip 的話可以略過 | 「我的雲端硬碟」裡出現 KMDB_CM979_唯讀複本_20261003,圖示上有小箭頭 |
| 5 執行步驟 0:安裝套件 | 按儲存格左側的播放鍵,或點進儲存格後按 Shift+Enter | 1–3 分鐘後,播放鍵旁出現綠色勾號 |
| 6 執行寫入程式的儲存格 | 這格以 %%writefile kmdb_rag.py 開頭,會把 RAG 程式存成檔案 | Writing kmdb_rag.py |
| 7 執行步驟 1a:連接資料 | 方式 A 維持 USE_DRIVE = True;跳出授權視窗時選同一個帳號,權限全部勾選。方式 B 依 4.3 上傳 zip、填好 ZIP_NAME,並改成 USE_DRIVE = False | 最後一行印出「✔ 找到書稿:KMDB_CM979_唯讀複本_20261003/books(226 本書)」,並告訴你步驟 1 的 DATA_DIR 怎麼寫。出現「✘」時,見表 10 |
Colab 在 Google 的雲端主機上執行,讀不到你電腦裡的檔案。書稿要放在 Colab 看得到的地方,筆記本才讀得到。
| 位置 | 在 Colab 裡的路徑 | 特性 |
|---|---|---|
| 你的「我的雲端硬碟」(步驟 1a 掛載後) | /content/drive/MyDrive | 一直都在。課程資料夾是共用資料夾,要先「新增捷徑」才會出現在這裡 |
| Colab 的暫存空間 | /content | 上傳的 zip 放在這裡。斷線、閒置太久或關閉筆記本後就會消失 |
| 你的電腦 | (Colab 讀不到) | 只有在自己電腦上用 Jupyter 執行筆記本時才用得到 |
以下兩種方式擇一。建議用方式 A:做一次,之後每次打開筆記本都讀得到。
KMDB_CM979_唯讀複本_20261003,圖示左下角有一個小箭頭,就是捷徑。捷徑不佔你的空間,內容是唯讀的。不要用「建立副本」,也不要整個資料夾下載再上傳:一千多個檔案,很慢,也沒有必要。不想讓 Colab 存取你的雲端硬碟時用這個方式。缺點是每次重新連線都要再上傳一次。
ZIP_NAME 兩個單引號中間,並把 USE_DRIVE = True 改成 USE_DRIVE = False。最簡單的做法:照抄步驟 1a「✔ 找到書稿」那一行印出的路徑;和預設值相同時,就不必改。要自己寫時,對照表 9。在 Colab 裡,「我的雲端硬碟」叫做 MyDrive,步驟 1a 已經切換到那裡,所以從「我的雲端硬碟」底下的資料夾開始寫即可。
| 書稿在哪裡 | DATA_DIR 的寫法 |
|---|---|
| 捷徑放在「我的雲端硬碟」第一層(方式 A) | 'KMDB_CM979_唯讀複本_20261003/books' |
| 捷徑放在「我的雲端硬碟」裡的「課程」資料夾 | '課程/KMDB_CM979_唯讀複本_20261003/books' |
| 方式 B 上傳 zip | 'KMDB_CM979_唯讀複本_20261003/books'(步驟 1a 會解壓到這裡) |
| 不確定時,寫完整路徑 | '/content/drive/MyDrive/課程/KMDB_CM979_唯讀複本_20261003/books' |
| 自己的書,放在雲端硬碟的「我的論文文獻」資料夾 | '我的論文文獻' |
| 在自己電腦上用 Jupyter 執行 | 'C:/Users/你的名字/Downloads/books' |
寫法規則只有三條:前後各一個英文單引號;資料夾之間用 /,不要用 Windows 的 \;不要寫成「我的雲端硬碟/…」。
不想手打時:點 Colab 左側的資料夾圖示 → 依序展開 drive → MyDrive → 找到 books → 按右鍵「複製路徑」→ 貼到 DATA_DIR 的兩個單引號中間。
筆記本另外有幾道防呆:DATA_DIR 指到上一層(例如 KMDB 資料夾本身)時,會自動往下找到 books;課程資料夾的路徑寫錯時,會改用步驟 1a 找到的位置,或到雲端硬碟裡往下找三層;寫成「我的雲端硬碟/…」也會自動換成 MyDrive。自己的資料夾找不到時會直接報錯,不會自動猜,以免讀錯書。
| 你看到的訊息 | 原因 | 怎麼處理 |
|---|---|---|
| 步驟 1a:「✘ 在「我的雲端硬碟」往下三層都找不到…」 | 還沒新增捷徑;捷徑建在另一個帳號;或剛建好、雲端硬碟還沒同步 | 依方式 A 的步驟 1–3 檢查。剛建好的話等 1 分鐘再執行步驟 1a;仍然找不到,選「執行階段 → 中斷連線並刪除執行階段」,再從步驟 0 重跑 |
授權時出現 credential propagation was unsuccessful,或授權視窗一閃就關掉 | 權限沒有全部勾選、選錯帳號,或瀏覽器擋了彈出視窗 | 重新執行步驟 1a,選同一個帳號並勾選全部權限;瀏覽器網址列若出現「已封鎖彈出式視窗」,改為允許 |
| 步驟 1a:「✘ 找不到 zip」 | ZIP_NAME 和實際檔名不同,或還沒上傳完 | 等進度圈跑完,在 zip 上按右鍵「複製路徑」再貼一次。訊息下方會列出目前已上傳的 zip |
| 步驟 1a:「✘ zip 已解壓,但裡面沒有…」 | 下載的不是書名資料夾,例如只選了資料夾裡的單一檔案 | 回到 books 資料夾,選「書名資料夾」本身再下載 |
步驟 1:SyntaxError: unexpected character after line continuation character | DATA_DIR 少了引號,或用了 \ | 照表 9 改寫,或用「複製路徑」貼上 |
步驟 1:「找不到資料夾」,接著出現 FileNotFoundError | 路徑拼錯;用自己的書時,筆記本不會自動猜 | 用「複製路徑」取得正確路徑;課程資料夾則先回到步驟 1a,看是否出現「✔」 |
| 步驟 1:「⚠ 下列 BOOKS 在資料夾裡找不到」或「一份文件都沒讀到」 | BOOKS 的書名代號拼錯,或方式 B 沒有下載這幾本書 | 代號要和 books 裡的資料夾名稱完全相同。錯誤訊息會列出資料夾裡的前 10 個項目,可以直接對照 |
| 斷線後重新連線,步驟 1a 或步驟 1 讀不到書 | 方式 B 上傳的 zip 已隨暫存空間刪除;方式 A 則是重新連線後要再掛載一次 | 方式 A:從步驟 0 依序重跑(步驟 1a 會再掛載一次);方式 B:重新上傳 zip,再從步驟 1a 重跑 |
步驟 1:設定與讀檔。先不必改設定,直接執行。BOOKS 列出要用的書,QUESTIONS 是 3 道已確認答案頁的示範題。執行後會印出每本書的頁數與字數:
case-study-research-methods-bill-gillham 57 頁/區塊 166,451 字元 《Case Study Research Methods》
data-analysis-to-theory-breakthrough 161 頁/區塊 180,810 字元 《從資料分析到理論突破……》
graduate-thesis-writing-time-management 133 頁/區塊 127,030 字元 《研究生論文寫作與時間管理》
合計 3 份文件
頁數比原書少一兩頁是正常的:空白頁和純圖頁沒有文字,讀檔時會被略過。
步驟 2:前處理。這一格印出同一段文字處理前後的樣子。請找兩件事:「⏎」代表的硬換行是否被接回去,簡體字是否轉成了臺灣繁體。例如「意外发现」會變成「意外發現」。
步驟 3:切分。第一次執行會下載約 470 MB 的向量模型,請耐心等候。接著印出四種切法的統計:
策略 片段數 平均字元 平均 token 超過 512 被截斷
S1 固定 500 938 499 245 0.0%
S3 遞迴 500 1162 402 198 0.0%
S4 一頁一塊 351 1331 645 80.9%
S6 小塊找整頁答 2932 159 81 0.0%
注意最後一欄:「一頁一塊」有八成的片段超過模型一次能讀的 512 tokens,超出的部分模型根本沒讀到。下一格會用「|」標出 S1 與 S3 在同一段文字上的切點,比較看看哪一種會把句子切斷。
步驟 4:建索引。每種切法建一次 BM25 與向量索引,這是最花時間的一步。在 CPU 上,每種切法約需 1–2.5 分鐘;GPU 快很多。
S1 固定 500:938 個片段,建索引 149 秒
S3 遞迴 500:1162 個片段,建索引 104 秒
S4 一頁一塊:351 個片段,建索引 59 秒
S6 小塊找整頁答:2932 個片段,建索引 95 秒
步驟 5:檢索與評估。第一格用 Q1 比較 4 種切法 × 3 種檢索法的前三名,✔ 表示命中答案頁:
S3 遞迴 500 BM25 ·graduate-thesi:PDF 第 29 頁 ✔data-analysis-:PDF 第 4 頁 ·data-analysis-:PDF 第 137 頁
S3 遞迴 500 向量 ✔data-analysis-:PDF 第 14 頁 ·data-analysis-:PDF 第 133 頁 ✔data-analysis-:PDF 第 3 頁
BM25 的第一名來自論文寫作那本書:它只比對字面,問題裡的「歸納」「演繹」在那本書也出現過。向量檢索的第一名就是答案頁。第二格計算 3 題的 Hit@5:
策略 BM25 向量 混合 前5名總字數
S1 固定 500 67% 67% 67% 2,500
S3 遞迴 500 67% 67% 67% 2,046
S4 一頁一塊 67% 67% 67% 5,313
S6 小塊找整頁答 67% 67% 67% 5,507
每種做法都只找到 2 題。沒找到的是 Q3:用中文問 Gillham 的英文書。
步驟 5b:加上譯文。TRANSLATIONS 已經放了 Q3 的英文譯文。執行後,Q3 從找不到變成找得到:
S3 遞迴 500 只用原問題 0% 加上譯文 100%
這和第 5 節的完整實驗一致:跨語言時,先翻譯問題,比調整切分有效。
步驟 6:生成。這一格印出一段提示詞:開頭是作答規則,接著是 [1]–[5] 的原文摘錄,每段標明書名與 PDF 頁碼,最後是你的問題。整段複製,貼到 Claude 的對話框。檢查回答中的每個論點是否都附了 [編號],再挑一個編號,回到原書那一頁核對。
有 Anthropic API 金鑰的話,在 Colab 左側的鑰匙圖示(密鑰)新增 ANTHROPIC_API_KEY,並開啟這份筆記本的存取權,這一格就會直接印出 Claude 的回答。金鑰不要直接寫在程式碼裡,分享筆記本時才不會外流。
00_課程示範/wiki/catalog/books-catalog.md,每行最後的 books/…/ 就是書名代號。把 2–4 個代號填進 BOOKS。cleaned_*.md,用搜尋找出答案所在的段落,往上找最近的「### PDF 第 N 頁」,那就是頁碼。再對照 PDF 確認一次。QUESTIONS 寫 3–5 題,gold 填書名代號與頁碼。至少放一題跨語言的題目,並在 TRANSLATIONS 補上譯文。| 狀況 | 原因與處理 |
|---|---|
| 步驟 1a 印出「✘」,或步驟 1 找不到資料夾、讀到 0 份文件 | 見 4.3 的表 10:依畫面上的訊息逐項對照處理 |
步驟 3 出現 StatisticsError: mean requires at least one data point | 前面沒有讀到任何文件,切不出片段。回到步驟 1,確認最後一行「合計」大於 0 份文件,再依序執行步驟 2 與步驟 3。用的是 10:20 以前下載的筆記本時,請重新下載或改用「在 Colab 開啟」的課程版,新版會在步驟 1 就提示原因 |
| 分配不到 GPU | 免費額度用完了。維持 CPU 執行,或把 BOOKS 減為 2 本 |
| 閒置一段時間後斷線 | Colab 中斷後,記憶體裡的變數會清空。重新連線後,從步驟 0 依序再跑一次;模型通常已經快取,會比第一次快 |
| 記憶體不足而當掉 | 書太多了。減少 BOOKS,或刪掉 STRATS 中的 S6(它的片段數最多) |
| 每題都沒有 ✔ | 檢查 gold 的書名代號與頁碼:頁碼要用 PDF 頁碼,不是書上印的頁碼 |
| Claude 的回答沒有附 [編號] | 確認貼上的是完整提示詞,包含開頭的作答規則 |
同一組 7 本書,用 7 種切法各建一次索引,再用 3 種檢索法回答同樣 20 題。評估指標是 Hit@5:答案所在的 PDF 頁是否出現在前 5 名片段中。20 題的答案頁都已回原文逐題確認。
| 策略 | 做法 |
|---|---|
| S1 固定長度 500 字 | 每 500 字元切一刀,不管句子 |
| S2 固定長度+重疊 100 | 同上,但相鄰片段重疊 100 字,避免答案剛好被切開 |
| S3 遞迴切分 500 字 | 先試段落,太長再試句號、逗號,最後才硬切(LangChain RecursiveCharacterTextSplitter 的原理,加上中文標點) |
| S4 依結構 | 依 Markdown 標題切。KMDB 的標題就是 PDF 頁碼,所以等於一頁一塊 |
| S5 語意切分 | 逐句計算向量,相鄰兩句相似度掉到谷底時切開 |
| S6 小塊檢索、整頁作答 | 用 200 字小片段檢索,命中後把整頁交給 LLM(parent-child) |
| S7 遞迴+書名頁碼標頭 | S3 的每個片段前加上書名與頁碼,例如「《科學革命的結構》第 67 頁:」,是 Anthropic Contextual Retrieval 的低成本版 |
| 策略 | 片段數 | 平均字元 | 平均 token | 超過 512 被截斷 | 切分+向量化(分) | BM25 | 向量 | 混合 | MRR(混合) | 前 5 名送給 LLM 的字數 |
|---|---|---|---|---|---|---|---|---|---|---|
| S1 固定長度 500 字 | 3,836 | 499 | 222 | 0% | 5.9 | 75% | 75% | 75% | 0.62 | 2,499 |
| S2 固定長度 500 字+重疊 100 | 4,792 | 500 | 222 | 0% | 11.7 | 75% | 70% | 70% | 0.58 | 2,499 |
| S3 遞迴切分 500 字 | 4,673 | 409 | 182 | 0% | 7.5 | 75% | 80% | 75% | 0.64 | 2,179 |
| S4 依結構(一頁一塊) | 1,491 | 1283 | 562 | 61% | 3.9 | 65% | 60% | 65% | 0.61 | 5,642 |
| S5 語意切分 | 3,608 | 530 | 235 | 17% | 12.7 | 75% | 75% | 80% | 0.64 | 3,511 |
| S6 小塊檢索、整頁作答 | 11,959 | 159 | 74 | 0% | 6.1 | 70% | 70% | 80% | 0.51 | 7,012 |
| S7 遞迴+書名頁碼標頭 | 4,673 | 437 | 200 | 0% | 7.7 | 75% | 75% | 75% | 0.64 | 2,185 |
向量化時間在 2 核心 CPU 上測得,且同時有其他工作在跑,只供相對比較。語意切分的時間包含逐句計算向量。
差距最大的不是切分,而是語言。用中文問簡中譯本的 14 題,各策略在混合檢索下的 Hit@5 介於 93% 到 100%。用中文問英文書、用英文問簡中書的 5 題(Q05;Q06;Q16;Q17;Q19),所有策略在混合檢索下最多只找到 1 題。把這 5 題翻成文獻的語言,原問題與譯文兩組結果再以 RRF 合併後,命中率大幅回升:
| 策略 | 只用原問題 | 原問題+譯文 | 20 題整體 |
|---|---|---|---|
| S1 固定長度 500 字 | 20% | 80% | 75% → 90% |
| S2 固定長度 500 字+重疊 100 | 20% | 80% | 70% → 85% |
| S3 遞迴切分 500 字 | 0% | 60% | 75% → 90% |
| S4 依結構(一頁一塊) | 0% | 80% | 65% → 85% |
| S5 語意切分 | — | — | — |
| S6 小塊檢索、整頁作答 | 20% | 100% | 80% → 100% |
| S7 遞迴+書名頁碼標頭 | 0% | 40% | 75% → 85% |
語意切分(S5)未重跑這項對照。對手上有中英文獻的 DBA 學生來說,先做雙語查詢,比調整切分參數有效得多。multilingual-e5-small 是小型多語模型,換用 bge-m3 等較大的模型,跨語言表現可能改善,但仍值得先用自己的題目測過。
前處理比切分更重要。簡體原文沒有先轉成繁體時,BM25 的 Hit@5 從 75% 掉到 45%,是所有比較中最大的落差。接回 PDF 斷行的影響較小(75% 對 70%),可能是因為斷行只拆散了跨行的那一組字元二元組。
一頁一塊最差。KMDB 的一頁平均 562 tokens,有 61% 的頁面超過向量模型的 512 tokens 上限,後半頁根本沒被讀到。Hit@5 只有 60%–65%,送給 LLM 的字數卻是遞迴切分的 2.6 倍。NVIDIA 發現依頁切分最好,和我們的結果相反;差別在於他們用的模型能讀完整頁。結論是:片段長度要配合向量模型的上限。
重疊沒有幫助。S2 比 S1 多了 25% 的片段,向量與混合檢索的 Hit@5 都下降一題;以向量檢索為例,從 75% 降到 70%。這與 Chroma 及 2026 年系統性分析的結論一致。
語意切分的效益不足以支付成本。S5 在混合檢索下比遞迴切分多命中一題(80% 對 75%),MRR 相同(0.64),卻多花了約 6 分鐘逐句計算向量;BM25 的 MRR 則明顯較低。一題的差距在 20 題中不足以下結論,這與 NAACL 2025「成本換不到穩定提升」的結論並不矛盾。
遞迴切分是穩定的基準。S3 向量檢索的 Hit@5 達 80%,是單一檢索法中最高;中文問簡中書的 14 題,三種檢索法全部命中。加上書名頁碼標頭(S7)讓 BM25 的 MRR 從 0.60 升到 0.62,差距在一題以內;但在跨語言的題目上,S7 反而比 S3 差(表 14),可能是中文標頭讓英文片段的向量偏向中文。
小塊找、整頁答的召回率最高,代價是字數。S6 混合檢索的 Hit@5 為 80%,加上雙語查詢後跨語言 5 題全部命中;但前 5 名送給 LLM 的字數約 7,012 字,是遞迴切分的 3 倍多。要求完整脈絡時選它,在意成本與精準時選 S3。
限制:只有 20 題,一題就是 5 個百分點;評估題是為本講義撰寫並逐題回原文確認答案頁,可能偏向撰寫者熟悉的用詞。向量模型只測了一種。這些結果說明的是「這批資料、這個模型」的情況,用意是示範評估方法,不是給出通用排名。
下表是混合檢索下,答案頁在第幾名出現。綠色表示前 5 名,黃色表示第 6–10 名,紅色的「—」表示前 10 名都沒有。
| 問題 | S1 | S2 | S3 | S4 | S5 | S6 | S7 |
|---|---|---|---|---|---|---|---|
| Q01 個案研究最適合回答哪一類研究問題?和實驗法、調查法相比有什麼不同? | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Q02 判斷研究設計品質的四項檢驗是什麼? | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Q03 在什麼情況下適合採用單一個案研究設計? | 1 | 1 | 1 | 1 | 1 | 2 | 1 |
| Q04 為什麼要建立個案研究資料庫?它和最終研究報告有什麼不同? | 1 | 1 | 1 | 1 | 2 | 2 | 1 |
| Q05 個案研究為什麼要使用多重證據來源?不同證據互相矛盾時該怎麼看? | — | — | — | — | — | — | — |
| Q06 個案研究者應該先帶著理論進入現場,還是讓理論從證據中長出來? | — | — | — | — | — | — | — |
| Q07 溯因分析和歸納法、演繹法有什麼不同? | 2 | 2 | 2 | 1 | 1 | 2 | 2 |
| Q08 書中用「沒有大蒜卻找到金橘」的做菜比喻,想說明什麼? | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Q09 什麼是聚焦編碼?指標案例要怎麼使用? | 1 | 1 | 1 | 1 | 1 | 2 | 3 |
| Q10 開放編碼的目的和做法是什麼? | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Q11 孔恩所說的常規科學是什麼?為什麼說它像在解謎? | 2 | 2 | 1 | 3 | 1 | 2 | 1 |
| Q12 反常現象如何演變成科學危機? | 1 | 1 | 3 | 1 | 1 | 1 | 1 |
| Q13 為什麼說不同範式之間無法用共同標準比較? | — | 8 | 2 | — | 5 | 5 | 2 |
| Q14 反事實分析如何用來評估因果主張? | 1 | 2 | 1 | 2 | 2 | 2 | 1 |
| Q15 什麼是路徑依賴?自我強化序列和反應性序列有什麼差別? | 2 | 2 | 1 | 1 | 1 | 2 | 1 |
| Q16 Five-Level QDA 方法的五個層級分別是什麼? | 2 | 3 | 8 | 6 | 4 | 5 | — |
| Q17 為什麼質性分析的策略和軟體操作之間會有矛盾? | — | — | — | — | — | — | — |
| Q18 寫論文時應該怎麼分配時間?要預留多少緩衝? | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Q19 What are the four tests used to judge the quality of a case study research design? | — | — | — | — | — | — | — |
| Q20 How should a researcher interpret discrepant evidence from different sources in a case study? | 3 | 6 | 4 | 6 | 4 | 4 | 2 |
| 來源 | 結論 |
|---|---|
| Chroma Research(2024) | 遞迴切分 200 tokens、無重疊表現就很好;重疊會降低精確度。OpenAI 預設的 800 tokens+400 重疊在 IoU 指標上最差 |
| NVIDIA(2025) | 5 個資料集中,依頁切分的平均準確率最高(0.648)且最穩定;事實型問題用 256–512 tokens,分析型問題用 1,024 tokens 或整頁 |
| Qu、Tu、Bao,NAACL 2025 Findings | 語意切分的計算成本,換不到穩定的效果提升 |
| Anthropic Contextual Retrieval(2024) | 每個片段先補 50–100 tokens 的脈絡說明:檢索失敗率降 35%;加上 BM25 降 49%;再加重排序降 67% |
| Bennani & Moslonka(arXiv,2026 年 1 月) | 句子切分在約 5,000 tokens 以內與語意切分相當;重疊沒有可測得的效益,只增加索引成本 |
| ihower 繁體中文重做 Chroma 評估(2024,2025 更新) | 中文上,語意切分不如英文原始結果;建議先求召回率,再依模型的脈絡額度調整精確度 |
2026 年可以採用的起手式:先依 Markdown 結構切(章、節、頁),過長的再用遞迴切到 256–512 tokens,中文要把「。!?」加進分隔符號;重疊從 0 開始試;語意切分不必當預設;檢索用 BM25+向量混合;回傳給 LLM 時用小塊找、大塊答。最重要的一條:用你自己的問題評估。所有研究都指出,最佳設定會隨資料集改變;我們這次的結果也與部分文獻不同。
另外常被引用的「FloTorch 2026 基準:遞迴 69%、語意 54%」,原始出處目前無法讀取,二手文章的歸屬也互相矛盾,課堂上可當成「二手引用要溯源」的例子,不宜當作定論。
第 3–5 節的 RAG 是「實驗室版本」:一支 Python 程式(kmdb_rag.py)每次執行時,把書讀進來、切分,再在記憶體裡建兩套索引。BM25 關鍵字索引由 rank_bm25 套件建立;語意向量由 multilingual-e5-small 模型產生,存成一個數字矩陣。查詢時兩套索引各排一次,再以 RRF 合併成前 5 名。最後把這 5 段原文組成附來源編號的提示詞,貼給 Claude 作答。
它沒有資料庫伺服器,也沒有網頁介面,結果直接印在筆記本裡。這樣做是為了讓每一步都看得到,也方便同一批書換七種切法反覆比較。代價是索引每次都要重建:這次 7 本書在一般筆電等級的 CPU 上,光是向量化一種切法就要 4–8 分鐘。若要涵蓋 KMDB 全部 226 本、約 8,100 萬字元,就不能每次重算,這時才需要真正的 RAG 資料庫。
| 做法 | 例子 | 索引存在哪裡 | 新增一本書時 | 介面 | 適合 |
|---|---|---|---|---|---|
| 本講義的 Python 筆記本 | kmdb_rag.py | 記憶體(可另存成檔案) | 整個重建 | 筆記本輸出 | 學方法、比較切分策略 |
| Python+本機向量資料庫 | Chroma、LanceDB、Qdrant 本機模式 | 電腦上的資料庫檔案 | 只處理新增的那本(增量更新) | 需要時自己加 Streamlit 或 Gradio | 長期使用的個人研究庫 |
| Python+伺服器型資料庫 | pgvector、Milvus、Weaviate、Qdrant 伺服器 | 資料庫伺服器 | 增量更新,可多人同時使用 | 另外建置 | 研究團隊、系所共用 |
| 開源套裝應用 | AnythingLLM、Open WebUI、RAGFlow、Dify、Kotaemon | 應用程式內建 | 在介面上傳檔案 | 內建聊天介面 | 不寫程式、要快速給別人用 |
| 雲端託管服務 | Google NotebookLM(2026 年 7 月更名 Gemini Notebook) | 服務商的雲端 | 上傳檔案 | 網頁 | 來源不多、想快速探索;資料必須上傳到雲端 |
| AI 代理直接讀檔 | Claude Code、Codex 讀你的 Wiki | 不建向量索引,靠 index.md 與文字搜尋 | 更新 Wiki 頁與索引 | 對話本身 | 第 2 節的 Wiki 知識庫 |
表中的 LlamaIndex、LangChain、Haystack 這類名稱沒有列成一列,因為它們是框架:寫 Python 版 RAG 時用來少寫程式的工具組,本身沒有給使用者的介面。這份講義刻意不用框架,是為了讓切分、索引、合併每一步都看得見;正式建庫時用框架,可以省下大量程式碼。
「RAG 資料庫」比本講義的筆記本多了四件事:
看是誰要用。給自己做研究時,Claude Code 或 Codex 的對話視窗本身就是介面,不必另做網頁。依需要,有三種接法:
| 接法 | 怎麼運作 | 什麼時候用 |
|---|---|---|
| 直接讀 Wiki | AI 先讀 index.md,再打開相關頁面,需要時回到原文核對頁碼 | 概念、立場、跨書關係;不需要 RAG |
| AI 執行檢索程式 | 把檢索寫成指令列程式,例如 python search.py "問題";AI 自己執行、讀結果,再附頁碼回答 | 要在全文中找原句;最容易做到 |
| 包成 MCP 工具 | MCP(Model Context Protocol)是讓 AI 應用連接外部資料與工具的開放標準。把檢索包成 MCP server 後,Claude Desktop、Claude Code、Codex 都能直接呼叫。現成的例子有 qmd(本機 Markdown 搜尋,內建 MCP)與 Chroma 官方的 MCP server | 同一個檢索要在多個 AI 工具中重複使用 |
要給別人用時才需要前端,例如給研究團隊、給不寫程式的同事。Streamlit 或 Gradio 用幾十行 Python 就能做出「輸入問題、顯示原文段落、產生回答」的網頁;不想寫程式,就直接用表 17 的套裝應用。對多數 DBA 學生的個人論文研究來說,Wiki 加上一支可以由 AI 執行的檢索程式就夠了。
One-shot 的意思是:一次把需求講完整,讓 AI 能從頭做到驗證,而不是一來一往地補需求。一份好的 one-shot 提示詞包含七個部分:
下面三份提示詞由淺到深,可以直接複製到 Claude Code 或 Codex。
提示詞 A:寫出檢索程式(等同本講義的做法,附驗證)
請在這個資料夾建立一個最小的文獻 RAG 檢索程式,供我做研究使用。
【資料】
- books/ 底下每個子資料夾是一本書,全文在 cleaned_*.md。
- 每頁以「### PDF 第 N 頁」開頭;檔案開頭到「## 全書正文」之前是中繼資料,不要索引。
- 多數中文書是簡體字,我會用臺灣繁體中文提問;也有英文書。
【要做的事】
1. 讀檔時保留每個片段的書名與 PDF 頁碼。
2. 前處理:接回 PDF 的硬換行;用 OpenCC 的 s2tw 把簡體轉成臺灣繁體。
3. 切分:遞迴切分,目標 500 字元,分隔符號依序為段落、換行、。!?、英文句點、逗號;不加重疊。
4. 索引:BM25(中文用字元二元組,英文用單字)加上 intfloat/multilingual-e5-small 向量
(查詢加 "query: "、片段加 "passage: " 前綴),兩者以 RRF 合併。
5. 向量存成檔案,第二次執行不必重算。
6. 指令列用法:python search.py "問題",印出前 5 名,每筆附書名、PDF 頁碼與前 200 字。
7. 另寫 build_prompt():把前 5 名組成附 [編號] 來源的提示詞,要求模型只能依摘錄回答,
摘錄不足時說明缺什麼。
【驗證】
- 先只用 2 本書跑通,再跑全部。
- 寫 tests/test_search.py,至少包含:
(1) 隨機抽 3 個片段,確認原檔中標示的那一頁確實含有這段文字;
(2) 以下黃金問題的答案頁出現在前 5 名:
「溯因分析和歸納法、演繹法有什麼不同?」
→ data-analysis-to-theory-breakthrough,PDF 第 3、4、14–16 頁
「寫論文時應該怎麼分配時間?」
→ graduate-thesis-writing-time-management,PDF 第 44–45 頁
- 用一題書中沒有的問題(例如「2026 年台積電營收是多少?」)產生提示詞,
確認提示詞會要求模型說找不到依據。
【限制】
- 不要修改 books/ 裡的任何檔案。
- 先提出計畫讓我確認,再開始寫程式;需要安裝套件或下載模型時先告訴我。
- 完成後回報:建立了哪些檔案、完整的測試輸出、跑全部書花了多久、已知限制。提示詞 B:升級成 RAG 資料庫+網頁前端
請把現有的 search.py 升級成可以長期使用的文獻 RAG。
【資料庫】使用 Chroma 的 PersistentClient,資料存在 ./db。
每個片段的 metadata 包含 book、title、page、source_path,以及來源檔的 sha256。
【增量更新】python ingest.py 只處理新增或內容雜湊改變的書;
已刪除的書要從資料庫移除;每次執行把新增/更新/刪除寫入 ingest_log.jsonl。
【前端】用 Streamlit 做一個頁面:
- 輸入問題,可以勾選只查哪幾本書;
- 顯示前 5 段原文,每段附書名與 PDF 頁碼;
- 按「產生回答」才呼叫 Claude API。API 金鑰從環境變數 ANTHROPIC_API_KEY 讀取,
不要寫進程式碼或任何檔案。
【回答規則】每個論點後面附 [編號];摘錄不足時明說找不到依據,不要自行補充。
【驗證】
- 沿用 tests/ 裡的黃金問題,全部要通過。
- 新增一本書後,確認只有那本被處理;刪除一本書後,確認查不到它的片段。
- 用 streamlit run app.py 在本機開啟,並截圖給我看。
【限制】先給計畫;不要改 books/;完成後列出啟動指令與完整測試輸出。下載這份提示詞(B-database-frontend.md)
提示詞 C:包成 MCP 工具,讓 Claude Code 與 Codex 直接查
請把 search.py 包成本機 MCP server,用官方 Python MCP SDK 撰寫,以 stdio 執行。
提供一個工具 search_literature(query, top_k=5, books=None),回傳片段文字、書名與 PDF 頁碼。
完成後:
1. 告訴我在 Claude Code(claude mcp add)與 Codex(codex mcp add)註冊這個 server 的指令;
2. 自己用一個黃金問題呼叫一次,貼出回傳結果;
3. 在 README 寫明這個工具只讀取 books/ 與 db/,不會寫入任何檔案。以下以提示詞 A 為例,走一次完整流程。兩個工具的操作大同小異,差別列在表中。
| 步驟 | Claude Code | Codex | 你會看到什麼/要檢查什麼 |
|---|---|---|---|
| 1 準備資料夾 | 新增資料夾 my-rag/,從 KMDB 練習資料的 books 資料夾下載 2–3 本書放進 my-rag/books/。建議先請 AI 執行 git init 並提交一次,之後每個改動都看得到差異,也能還原 | 資料夾裡只有 books/,每本書一個子資料夾 | |
| 2 開啟資料夾 | Claude 桌面版的 Code 分頁,新增工作階段時選擇這個資料夾;或在終端機 cd my-rag 後輸入 claude | 在 ChatGPT 桌面版開啟這個資料夾並選 Codex;或在終端機 cd my-rag 後輸入 codex | AI 能列出資料夾裡的檔案 |
| 3 放規則檔 | 讀 CLAUDE.md;只有在沒有 CLAUDE.md 時才讀 AGENTS.md。兩個工具都要用時,在 CLAUDE.md 寫一行 @AGENTS.md | 讀 AGENTS.md | 規則檔寫三件事:不改 books/、先給計畫、用臺灣繁體中文回報。可直接下載範本:AGENTS.md、CLAUDE.md |
| 4 進入計畫模式,貼提示詞 | 按 Shift+Tab 切到 plan 模式;桌面版用輸入框旁的模式選單 | 輸入 /plan | AI 只讀檔、不改檔,回覆一份計畫。檢查三點:有沒有正確理解「### PDF 第 N 頁」?有沒有打算動 books/?要裝哪些套件、下載多大的模型? |
| 5 核准後執行 | 切回一般模式,回覆「照計畫執行」。每次要執行指令時會請你核准 | 預設的 Auto 模式可以在資料夾內寫檔;連網預設關閉,pip install 與下載模型時會請你核准 | 第一次要下載約 470 MB 的向量模型。看清楚每個要核准的指令在做什麼再按 |
| 6 AI 自己跑測試 | AI 會執行 pytest,失敗就自己修正再跑 | 要求它貼出完整的測試輸出,不要只接受「測試都通過了」這句話 | |
| 7 你親手驗證 | 見下方五項驗證 | 五項都過,才算完成 | |
| 8 留下紀錄 | 請 AI 寫 README.md,說明用法、測試結果與已知限制;再提交一次 git | 下次換書或換工具時,從 README 就能重跑 | |
python search.py "溯因分析和歸納法有什麼不同?",看前 5 名是不是你預期的書和頁。git status 與 git diff,確認 books/ 沒有被改動;也檢查 AI 有沒有為了讓測試通過而修改測試本身。| 狀況 | 處理 |
|---|---|
| 安裝套件或下載模型失敗 | Codex 預設不能連網,需要核准;學校網路擋下載時,改在 Colab 執行筆記本 |
| 跑很久沒有結果 | 先只放 2 本書。CPU 上每 50 萬字的向量化約需 5–10 分鐘;有 GPU 會快很多 |
| 中文檔名或內容出現亂碼 | 請 AI 讀寫檔案時一律指定 UTF-8 |
| 記憶體不足 | 請 AI 把向量化的 batch size 調小,或分批處理 |
| AI 說測試通過,卻沒有輸出 | 要求它貼出原始的 pytest 輸出 |
| AI 修改了測試,讓測試通過 | 在 git diff 中檢查 tests/ 的變更,退回並要求修正程式,而不是修改測試 |
Obsidian 是一套讀寫本機 Markdown 檔案的筆記軟體。它不會把你的檔案鎖在自家格式裡,所以 Obsidian 編輯的資料夾,Claude Code 或 Codex 也能同時讀寫。下面的流程從課程提供的骨架 wiki-starter/ 開始,分成兩個階段:
第一次只要做到這條鏈:概念頁 →(引用+頁碼)→ 書目頁 → raw/ 裡的清理稿 → 找到「### PDF 第 N 頁」那一段原文。這條鏈成立,Wiki 的核心就學會了;關係圖、Bases 與 AI 匯入,都是在這條鏈上增加的功能。
| 項目 | 階段一 | 階段二 | 說明 |
|---|---|---|---|
| Obsidian 1.9 以上 | 需要 | 需要 | 到 obsidian.md 下載桌面版,個人使用免費。步驟 9 的 Bases 需要 1.9 以上 |
| 實作包 zip | 需要 | 需要 | 內含 wiki-starter/ 骨架、範例頁、提示詞與工具程式 |
| 兩本練習書 | 第一本 | 第二本 | 步驟 1 與步驟 11 會分別下載,每本兩個檔案 |
| Claude Code 或 Codex | 不需要 | 需要 | 擇一即可,安裝與開啟方式見第 7 節表 19 |
| Python | 不需要 | 需要 | 用來執行 tools/ 的兩支程式。提示詞會要求 AI 先檢查,沒有 Python 時會停下來告訴你 |
講義使用 Obsidian 的英文介面名稱。第一次操作建議維持英文介面,選單名稱才對得上。動手前,先弄清楚四個觀念:
.md 檔就是筆記,不會被轉成別的格式。--- 之間那段文字(YAML frontmatter)的表單介面,兩者是同一批資料。要看原文,就切到原始碼模式:按 Ctrl/Cmd+P 開啟命令面板,輸入 source,選 Toggle Live Preview/Source mode;再做一次就切回來。| 名字 | 例子 | 用途 |
|---|---|---|
| ID | CON-001 | Wiki 內部的固定編號。書目頁用 SRC-、概念頁 CON-、主題地圖 MAP-、問答 QA- 開頭;引用時寫成(SRC-TT-ABD p.4) |
| 檔名 | abductive-analysis.md | 電腦裡真正的檔名,只用英文小寫、數字與連字號。[[連結]] 與 relations 的 target 都填檔名(不含 .md) |
| title | 溯因分析 | 人看到的正式名稱 |
| aliases | 溯因推理、abduction | 其他叫法。在任一頁輸入 [[溯因 也能找到這一頁;新建頁面前先用別名查,避免同一概念被建成兩頁 |
[[abductive-analysis|溯因分析]] 的前半段是要連到的檔名,後半段是畫面上顯示的文字。檔名用英文,是為了讓不同譯名都指到同一個檔案,AI 引用時也不會因為中文標點或空格出錯。寫在 Markdown 表格裡時,中間的 | 要寫成 \|,否則表格會被切斷。
| 種類 | 寫在哪裡 | 誰看得到 | 用途 |
|---|---|---|---|
| 內文連結 | 內文,例如 [[timmermans-tavory-abductive-analysis|蒂默曼斯與塔沃里]] | Obsidian 的 Backlinks 與關係圖 | 讓人點過去,讓關係圖畫出線 |
| 有型別的連線 | frontmatter 的 relations,每一條寫 type、target、basis | AI 與健康檢查程式;Obsidian 的關係圖看不到 | 記下「是什麼關係」,並分清楚哪些是原書說的、哪些是研究者推論 |
規則:每寫一條 relations,內文也要有一個對應的 [[連結]]。relations 這種多層欄位在 Properties 面板裡無法正常編輯,一律在原始碼模式修改。一行的 {type: 引用, target: …} 和逐行條列兩種寫法都可以;示範 Wiki 用前者,下面的範例用後者,比較不容易打錯。
| 步驟 | 操作 | 檢查點 |
|---|---|---|
| 0 建立自己的工作副本 | ① 下載實作包 zip。② 在 zip 上按右鍵選「全部解壓縮」(Mac 點兩下即可);不要直接點進 zip 裡操作。③ 在解壓出來的資料夾裡找到 wiki-starter,複製一份到「文件」等自己電腦上的位置,改名為 my-literature-wiki(可自訂,建議用英文)。④ 之後所有操作都只對這份副本;原本的 wiki-starter 留著備用。不要放在 OneDrive 或 Google 雲端硬碟的同步資料夾裡,同步時容易產生衝突檔 | my-literature-wiki 裡有 AGENTS.md、index.md、log.md 三個檔案,以及 concepts、maps、queries、raw、sources、tools 六個資料夾 |
| 1 把第一本書放進 raw/ | ① 打開第一本練習書的資料夾(溯因分析)。② 下載兩個檔案:cleaned_data-analysis-to-theory-breakthrough.md(清理後全文)與 knowledge_extraction_data-analysis-to-theory-breakthrough.md(知識萃取)。_handoff.md 是處理紀錄,不必下載。③ 在 raw/ 裡新增資料夾 data-analysis-to-theory-breakthrough,把兩個檔案放進去。先只放這一本 | raw/data-analysis-to-theory-breakthrough/ 裡有兩個 .md 檔 |
| 2 安裝 Obsidian | 到 obsidian.md 下載桌面版並安裝 | 能開啟 Obsidian 的啟動畫面 |
| 3 開成 vault | 啟動畫面選 Open folder as vault,選 my-literature-wiki 這個資料夾本身,不是外層的 cm979-wiki-rag-kit-20261003。已經開過其他 vault 時,從左下角的 vault 名稱選 Manage vaults | 左側檔案清單出現步驟 0 檢查點列出的檔案與資料夾 |
| 4 排除原始層 | 左下角齒輪 → Settings → Files and links → Excluded files → Manage,加入 raw/。注意:「排除」只是不出現在搜尋、關係圖與連結建議裡,不等於唯讀,檔案仍然可以開啟,也可能被改到。raw/ 不可修改是本課程的資料管理規則,所以 AGENTS.md 與提示詞才會一再要求「不要修改 raw/」 | 用左上角的搜尋找「金橘」,沒有任何結果 |
| 5 建第一張書目頁 | ① 在左側 sources 資料夾上按右鍵 → New note。② 把檔名「Untitled」改成 timmermans-tavory-abductive-analysis。③ 切到原始碼模式,貼上下方的「書目頁範例」。④ 打開 raw/ 裡的知識萃取檔,讀「文件定位摘要」,用自己的話改寫「定位摘要」那兩句 | 切回 Live Preview 時,最上方出現 Properties 面板,type 是 source、status 是 draft |
| 6 建第一張概念頁 | ① 在 concepts 上按右鍵 → New note,檔名改成 abductive-analysis。② 原始碼模式貼上「概念頁範例」。③ 自己再加一行:從知識萃取檔的「文件中的案例與證據」挑一個和溯因分析有關、附有證據位置的說法,寫成 - `原文依據` 說法(SRC-TT-ABD p.頁碼)。反引號與全形括號都要照寫,健康檢查才認得 | 點內文的連結能跳到書目頁;在任一頁輸入 [[溯因,建議清單出現「溯因分析」 |
| 7 回到書目頁補上連結 | 打開書目頁,把「可回查頁碼」的第一行換成下方的「補上的連結」。少了這一步,概念頁沒有任何頁面連入 | 書目頁的 Backlinks(右側欄;沒看到時按 Ctrl/Cmd+P 輸入 backlinks)出現 abductive-analysis;按 Ctrl/Cmd+G 開 Graph view,兩個點之間有一條線 |
| 8 回原文核對頁碼 | ① 在概念頁找到「(SRC-TT-ABD p.4)」。② 從左側檔案清單直接點開 raw/data-analysis-to-theory-breakthrough/cleaned_…md;raw/ 已被排除,用搜尋找不到。③ 在檔案裡按 Ctrl/Cmd+F,搜尋 ### PDF 第 4 頁。④ 讀這一頁,確認真的有金橘的比喻。這份是簡體中文譯本,搜尋原文詞句時要用簡體字。⑤ 步驟 6 自己加的那一句也照樣核對。都正確,就把兩頁的 status 改成 reviewed | 一分鐘內能從概念頁找到原句。p.4 指 PDF 檔的第 4 頁,不一定是書上印的頁碼;清理稿可能有 OCR 錯字,有原書或 PDF 的人可以再對一次 |
| 9 用 Bases 看進度(選做) | ① Settings → Core plugins,確認 Bases 已開啟。② Ctrl/Cmd+P 輸入 bases,選 Create new base。③ 在新 base 的 Filters 加一條:type 等於 concept。④ 在 Properties 勾選 title、status、updated | 表格出現一列:溯因分析|reviewed|2026-10-03 |
書目頁範例(步驟 5)
---
id: SRC-TT-ABD
type: source
title: 從資料分析到理論突破:如何用溯因分析做出創新性的質性研究
summary: 以溯因分析從質性資料做出理論突破:意外發現、開放編碼與聚焦編碼
aliases: [從資料分析到理論突破, 蒂默曼斯與塔沃里]
author: 史蒂芬.蒂默曼斯(Stefan Timmermans)、伊多.塔沃里(Iddo Tavory)
raw: raw/data-analysis-to-theory-breakthrough/cleaned_data-analysis-to-theory-breakthrough.md
raw_language: 簡體中文譯本
status: draft
updated: 2026-10-03
---
# 從資料分析到理論突破
- 作者:史蒂芬.蒂默曼斯(Stefan Timmermans)、伊多.塔沃里(Iddo Tavory)
- 原始層:`raw/data-analysis-to-theory-breakthrough/cleaned_data-analysis-to-theory-breakthrough.md`(簡體中文譯本)
## 定位摘要
本書主張質性研究的理論突破來自「意外發現」:研究者熟悉既有理論,才看得出資料中不符合預期的地方,再提出暫時性的解釋,並用資料反覆修正。
## 可回查頁碼
- 意外發現與金橘的做菜比喻:PDF 頁 2–4
- 溯因與歸納、演繹的差別:PDF 頁 14–16概念頁範例(步驟 6)
---
id: CON-001
type: concept
title: 溯因分析
summary: 從理論預期之外的意外發現出發,提出暫時性解釋,再用資料反覆修正以建構新理論
aliases: [溯因推理, 溯因, abductive analysis, abduction]
sources: [SRC-TT-ABD]
relations:
- type: 引用
target: timmermans-tavory-abductive-analysis
basis: 引用
status: draft
updated: 2026-10-03
---
# 溯因分析
## 一句話
從理論預期之外的「意外發現」出發,提出最有希望的暫時性解釋,再反覆用資料檢驗與修正。
## 原書怎麼說
- `原文依據` 做菜比喻:想照食譜做菜卻發現沒有大蒜,只有一筐一時衝動買的金橘,於是運用已知的烹飪知識做出新菜(SRC-TT-ABD p.4)。
- `原文依據` 皮爾士把溯因描述為從意外事實跳到暫時性假設的推論;歸納與演繹負責後續的檢驗(SRC-TT-ABD p.14–16)。
## 來源
- [[timmermans-tavory-abductive-analysis|蒂默曼斯與塔沃里《從資料分析到理論突破》]]補上的連結(步驟 7,換掉書目頁「可回查頁碼」的第一行)
- 意外發現與金橘的做菜比喻:PDF 頁 2–4 → [[abductive-analysis|溯因分析]]階段一完成的標準:一個 vault、raw/ 裡有一本書、一張書目頁、一張概念頁、兩頁互相連結,而且能從頁碼回到清理稿裡的原句。做到這裡就可以停;階段二是進階。
Claude Code 與 Codex 是能直接讀寫你電腦資料夾的 AI 工具。網頁版的 Claude 或 ChatGPT 看不到你電腦裡的 index.md,所以這個階段一定要在 Claude Code 或 Codex 裡、開啟 my-literature-wiki 這個資料夾操作。兩套工具擇一即可,操作原理相同。
| 步驟 | 操作 | 檢查點 |
|---|---|---|
| 10 用 AI 工具開啟同一個資料夾 | Claude Code:在 Claude 桌面版的 Code 分頁新增工作階段時選 my-literature-wiki,或在終端機 cd 到這個資料夾後輸入 claude。Codex:在 ChatGPT 桌面版開啟這個資料夾並選 Codex,或在終端機 cd 後輸入 codex。開啟後先問一句「列出這個資料夾的檔案」 | AI 列出的檔案和 Obsidian 左側一致。AI 要求核准時,只核准在這個資料夾內讀寫檔案與執行 python;要修改 raw/、刪除檔案或動到資料夾以外的,一律拒絕 |
| 11 放第二本書並匯入 | ① 照步驟 1 的方法,把第二本練習書(Gillham《Case Study Research Methods》,英文原文)的 cleaned 與 knowledge_extraction 兩個檔案,放進 raw/case-study-research-methods-bill-gillham/。② 在 AI 工具貼上下方的「匯入提示詞」。③ AI 工作期間,不要在 Obsidian 編輯這個資料夾裡的檔案,以免互相覆蓋 | AI 先回報 Python 檢查結果;Obsidian 左側陸續出現新的書目頁與概念頁;最後貼出健康檢查報告 |
| 12 讀健康檢查報告 | 報告最上方寫著「需要處理:幾類;只是提醒:幾類」。對照表 26 處理每一類,或請 AI 修正後再執行一次 python tools/wiki_lint.py | 「需要處理」為 0 類,剩下的都是提醒 |
| 13 用 Wiki 回答問題並存回 | 在同一個 AI 工作階段貼上「查詢提示詞」。AI 先讀 index.md,回答後存成 queries/ 的新頁,再重新產生索引。索引不會自己更新,所以提示詞裡要求它重跑 build_index.py | 回答的每個論點都附頁碼;index.md 的「問答歸檔」出現這一頁 |
| 14 人工核對 AI 起草的頁面 | 每張新概念頁至少抽 2 句,照步驟 8 的方法回清理稿核對。正確才把 status 改成 reviewed;錯了就直接修改,並在 log.md 追加一筆說明。2.5 節 Gillham 的錯誤就是這樣抓到的 | Bases 表格裡 reviewed 的比例逐步上升 |
匯入提示詞(步驟 11;換成別本書時,只改書名代號那一處)
請先讀 AGENTS.md,再依下列順序工作,每做完一步就告訴我結果:
0. 先確認這台電腦能執行 Python(執行 python --version;Windows 上若失敗,再試 py --version)。
兩者都不能執行時,停下來告訴我錯誤訊息,不要修改任何檔案。
1. 依 AGENTS.md「匯入」的步驟,把 raw/case-study-research-methods-bill-gillham/ 這本書匯入 Wiki:
- 建立 1 張書目頁;概念頁最多新建 5 張。新建之前先查 index.md 與各頁的 aliases,
已有的概念就補一節「這本書怎麼說」,不要重複建頁。
- 檔名只用英文小寫、數字與連字號;所有新頁面的 status 一律填 draft。
- 每句「原文依據」都附(SRC-ID p.頁碼),頁碼必須回 raw/ 的清理稿找到「### PDF 第 N 頁」確認;
查不到就標「待回查」。
- 連線只能用五種類型:引用、概念相近、方法延伸、立場衝突、研究者推論;
原書沒有直接說的關聯,一律標「研究者推論」。每條 relations 在內文也要有對應的 [[連結]]。
2. 執行 python tools/build_index.py 與 python tools/wiki_lint.py,貼出健康檢查報告的完整內容。
「需要處理」的項目請修正後再執行一次;標題含「提醒」的項目不用修。
3. 在 log.md 尾端追加一筆 ingest 紀錄。
不要修改 raw/ 與 AGENTS.md 裡的任何內容。查詢提示詞(步驟 13;換成自己的問題時,只改「問題:」那一行)
請先讀 AGENTS.md 與 index.md,再依 AGENTS.md「查詢」的步驟回答下面的問題:
問題:溯因分析和 Gillham 的個案研究,對「理論要不要先行」的看法有什麼不同?
- 只讀 index.md 加 3–5 個相關頁面;每個論點附(SRC-ID p.頁碼),需要時回 raw/ 的清理稿核對。
- Wiki 裡找不到依據的部分,直接寫「Wiki 中沒有依據」,不要自己補充。
- 回答後,把問題與回答存成 queries/ 裡的新頁:type 填 query,ID 用 QA- 開頭,
檔名只用英文小寫、數字與連字號,status 填 draft;內文用 [[連結]] 連到引用的頁面。
- 存檔後執行 python tools/build_index.py 與 python tools/wiki_lint.py,貼出健康檢查報告,
並在 log.md 尾端追加一筆 query 紀錄。
不要修改 raw/ 與 AGENTS.md 裡的任何內容。| 報告項目 | 要不要處理 | 怎麼處理 |
|---|---|---|
| 仍為草稿、待人工核對(提醒) | 不必修改 | 表示還沒核對。照步驟 14 核對後改成 reviewed,這一項就會消失 |
| 含「待回查」頁碼(提醒) | 不必修改 | AI 找不到頁碼的句子。有空時回清理稿補上頁碼 |
| index.md 沒有列出 | 要 | 執行 python tools/build_index.py |
| 孤兒頁(沒有其他頁連入) | 要 | 在相關頁面的內文加一個 [[連結]] 連到它。索引裡的連結不算 |
| 斷掉的連結 | 要 | 連到的檔名打錯,或那一頁還沒建。改正檔名,或先建立那一頁。直接搬用 wiki-examples/ 的完整範例頁時一定會出現,屬正常 |
| 缺少 frontmatter 欄位 | 要 | 補上報告列出的欄位;最常漏的是 updated |
| 檔名不符合規則 | 要 | 改成英文小寫、數字與連字號。請在 Obsidian 裡改名,並確認 Settings → Files and links 的 Automatically update internal links 已開啟,其他頁的連結才會跟著更新 |
| 別名重複 | 要 | 同一概念可能被建成兩頁。把內容合併到一頁、刪除另一頁,並把連結改指保留的那一頁 |
| 標為原文依據卻沒有附頁碼;概念頁沒有附頁碼的引用 | 要 | 回清理稿找頁碼補上;找不到就在句尾標「待回查」 |
| 未定義的連線類型 | 要 | 改成五種之一:引用、概念相近、方法延伸、立場衝突、研究者推論 |
| 頁面超過長度上限 | 要 | 拆成兩個概念,或把細節移到書目頁 |
Obsidian 的核心外掛 File recovery 會定期保留筆記的快照,可以救回誤刪的內容;要完整追蹤每次變更,就用 Git。進階外掛都屬於社群外掛,要在設定中開啟社群外掛後才能安裝:
安裝前先看清楚授權,以及資料會不會送到雲端。
| 問題類型 | 例子 | 較適合 |
|---|---|---|
| 概念是什麼、各家怎麼說 | 溯因分析和紮根理論對「理論先行」看法有何不同? | Wiki:概念頁已整合多本書,並標出立場衝突 |
| 原文怎麼寫、在第幾頁 | 書中金橘的比喻在哪一頁?原句是什麼? | RAG:直接從全文撈出原段落 |
| 跨書的關係 | 哪些書都談到證據的可追溯性? | Wiki:別名與型別連線 |
| 沒整理過的細節 | Yin 談社群媒體資料時提醒了什麼? | RAG:Wiki 只收核心概念,細節要回全文 |
實務上的分工:RAG 負責找,Wiki 負責記。用 RAG 找到原文段落、核對頁碼後,把整理好的結論寫進 Wiki,並在 log.md 留下一筆紀錄。下次再問相關問題,AI 先讀 Wiki,不必從頭撈。Karpathy 所說「好的答案應該存回 Wiki」,指的就是這個循環。
課程提供一份 KMDB 的唯讀複本,內含 226 本書的清理稿、知識萃取、書目檔,以及 00_課程示範/,也就是本講義的 Wiki 示範與筆記本。資料夾在 Google Drive,可以直接檢視與下載;各子資料夾的連結見表 30。
講義用到的程式、提示詞與 Wiki 骨架另外收在本頁的實作包,不含書稿,可以直接下載。
KMDB 練習資料只限本課程練習使用,請勿轉傳。共用資料夾是唯讀的:要練習時,先把需要的幾本書下載到自己的電腦,再在自己的資料夾中操作。在 Drive 對資料夾按右鍵選「下載」,Drive 會打包成 zip;整個資料夾約 150 MB,建議只下載需要的幾本書。
請在課前完成第 8 節步驟 0–3:下載並解壓縮實作包、把第一本書放進 raw/、安裝 Obsidian、開成 vault。課堂時間才夠做核心的步驟 4–8。
| 時間 | 做什麼 | 要看見的事 |
|---|---|---|
| 10 分 | 看示範 Wiki:在 Drive 對 00_課程示範/wiki 按右鍵「下載」,解壓縮後用 Obsidian 開成 vault。從 index.md 點進一張概念頁,再依頁碼回到原文 | 每句主張都能回到第幾頁;連線有五種,其中「研究者推論」是我們自己的判讀 |
| 25 分 | 依第 8 節步驟 4–8,手動完成 1 張書目頁與 1 張概念頁,並回原文核對頁碼 | 完成「概念頁 → 書目頁 → 清理稿 → PDF 第 N 頁」這條鏈;Backlinks 與關係圖都看得到連線 |
| 15 分 | 依步驟 10–12,用 Claude Code 或 Codex 匯入第二本書並讀健康檢查報告。還沒設定 AI 工具的 DBA 學生,看課堂示範即可 | AI 會先查別名再決定是否建新頁;報告分得出「需要處理」與「提醒」 |
| 15 分 | 依第 4 節在 Colab 執行筆記本,重點看步驟 3 與步驟 5:同一題比較四種切法的前三名 | 切點落在哪裡、哪種切法被截斷、BM25 和向量各自漏掉哪些題 |
| 5 分 | 把一題「找不到」的問題丟給 Claude | 沒有檢索到依據時,模型會不會照樣回答? |
基礎路徑:完成 Wiki 起始版,包括 AGENTS.md、index.md、3 張書目頁、5 張以上的概念頁,且至少一條連線標為「研究者推論」。
進階路徑:再用第 7 節的流程與提示詞 A,以自己選的書寫出檢索程式並完成五項驗證。
所有檔案都收在整包 zip 裡,也可以個別開啟。文字檔(.md、.py、.json)點開會直接顯示在瀏覽器中,可以全選複製;.ipynb 與 .zip 會直接下載。本包不含任何書籍全文,書稿請到 KMDB 練習資料(Google Drive)下載,各項連結見表 30。
| 檔案 | 用途 | 章節 |
|---|---|---|
| cm979-wiki-rag-kit-20261003.zip | 整包下載,內容同下列所有檔案 | 全部 |
| README.md | 實作包內容與快速開始 | 全部 |
| cm979-rag-notebook-20261003.ipynb | 在 Colab 從頭跑一次 RAG | 4 |
| kmdb_rag.py | RAG 程式:讀檔、前處理、七種切分、檢索、評估、提示詞 | 3–5 |
| eval_questions.json | 20 道評估題與答案頁碼 | 5 |
| prompts/A-search-program.md | 提示詞 A:寫出檢索程式並驗證 | 6、7 |
| prompts/B-database-frontend.md | 提示詞 B:RAG 資料庫+網頁前端 | 6 |
| prompts/C-mcp-tool.md | 提示詞 C:包成 MCP 工具 | 6 |
| prompts/D-wiki-ingest.md | 匯入提示詞:把一本書匯入 Wiki | 8 |
| prompts/E-wiki-query.md | 查詢提示詞:先讀索引再回答,並把答案存回 Wiki | 8 |
| templates/AGENTS.md | 寫程式專案的規則檔範本 | 7 |
| templates/CLAUDE.md | 讓 Claude Code 讀同一份規則 | 7 |
| wiki-starter/AGENTS.md | Wiki 維護規則:頁面類型、欄位、五種連線、三種操作 | 2、8 |
| wiki-starter/tools/build_index.py | 依各頁 summary 重建 index.md | 8 |
| wiki-starter/tools/wiki_lint.py | 健康檢查 | 2、8 |
| wiki-starter/tools/build_catalog_index.py | 從 KMDB 書目檔產生一行一本的總目錄 | 2 |
| wiki-examples/…abductive-analysis.md(書目頁) | 書目頁範例 | 2、8 |
| wiki-examples/abductive-analysis.md(概念頁) | 概念頁範例 | 2、8 |
| 位置 | 內容 | 章節 |
|---|---|---|
| KMDB 練習資料夾 | 整份複本:226 本書的清理稿與知識萃取、書目檔、處理紀錄、課程示範,約 150 MB | 全部 |
| books/ | 每本書一個資料夾,內有 cleaned_*.md(清理後全文,標有頁碼)與 knowledge_extraction_*.md(AI 萃取的摘要與概念) | 2、4、7、8 |
| 00_課程示範/ | 本講義的 Wiki 示範與 RAG 筆記本 | 2、4、10 |
| 00_課程示範/wiki/ | 7 本研究方法書做成的 Wiki 示範,可以用 Obsidian 打開 | 2、8、10 |
| 00_課程示範/rag/ | 筆記本、RAG 程式與 20 道評估題 | 3–5 |
| RAG_一次做起來.ipynb(在 Colab 開啟) | 課程版筆記本;打開後先「在雲端硬碟中儲存副本」再修改 | 4 |
| 00_README_DBA學生.md | 資料夾結構、使用範圍與已知的資料問題 | 10 |
| book_knowledge_catalog.csv(下載) | 226 本書的書名、作者、摘要、關鍵字與分類,可用來挑書或建總目錄 | 2 |
示範語料引用之原書:Yin, R. K.《案例研究:設計與方法》第 5 版(簡中譯本);Gillham, B. (2000). Case Study Research Methods;Timmermans, S., & Tavory, I.《從資料分析到理論突破》(簡中譯本);Kuhn, T. S.《科學革命的結構》(簡中譯本);Mahoney, J.《社會科學的邏輯》(簡中譯本);Woolf, N. H., & Silver, C. Qualitative Analysis Using NVivo: The Five-Level QDA Method;謝立斌《研究生論文寫作與時間管理》。頁碼皆指 PDF 頁碼,正式引用請回原書。