物理知識庫專案

用 Claude Code(Opus 4.5)將高中 108 課綱物理教材的全圖掃描 PDF 轉化為原子化增強筆記,搭配 qmd 混合搜尋 + agentic flow,建構能夠協助學生解題、詢問概念、幫助老師出題的知識系統。

目的

驗證 qmd 原子化筆記方案 在教育場景的可行性。具體目標:

  1. 學生端:輸入物理問題 → 系統精準回答,附帶概念解釋和相關題目
  2. 老師端:指定概念和難度 → 系統從知識庫生成或推薦題目
  3. 技術驗證:證明「LLM 增強筆記 + qmd + agentic flow」在回答品質上可行
  4. OJT 連結:作為 115 OJT 創新專案 的技術路線驗證(qmd vs RAG)

架構

全圖掃描 PDF
    │
    ▼ Claude Code (Opus 4.5, multimodal 讀取)
    │
原子化增強筆記 (Markdown + 連結)
    │
    ▼ qmd collection add + qmd embed
    │
混合索引 (BM25 關鍵字 + 向量語意 + LLM re-ranking)
    │
    ▼ 使用者提問 → qmd query → Agent 讀取 → 沿 連結 擴展 context → 回答

資料夾結構

~/Documents/physics-kb/
├── CLAUDE.md              # 專案指令(建構模式 + 查詢模式)
├── notes/
│   ├── concepts/          # 概念筆記(定律、理論、現象)
│   ├── scientists/        # 人物筆記(科學家)
│   ├── formulas/          # 公式筆記(方程式、計算)
│   ├── applications/      # 應用筆記(半導體、雷射、光纖...)
│   ├── questions/         # 題目筆記(每題一檔)
│   └── moc/               # 章節地圖
├── templates/             # 六種模板
├── attachments/           # 從 PDF 提取的圖片
├── sources/               # 原始 PDF(或 symlink)
└── scripts/
    └── index.sh           # qmd add + embed 腳本

框架與技術選擇

為什麼選 qmd + 原子化筆記,不選 Graph RAG

比較項qmd + 原子化筆記Graph RAG
內容與關聯合一(連結 在筆記正文中)分離(原文 chunk + 知識圖譜分開維護)
建構成本LLM 跑一次(產出筆記)LLM 跑多次(entity/relation extraction, resolution, summarization)
維護成本改 .md → 重跑 qmd add + qmd embed改原文 → 重建 chunk + 重建圖譜 + 重建 mapping
Agentic flow天然支援(筆記中的 連結 就是遍歷路徑)不支援(原文 chunk 裡沒有連結資訊)
可讀性Obsidian / 任何編輯器直接閱讀需要 Neo4j 介面或自建前端
回答品質取決於筆記品質(LLM 增強過的精華)取決於 chunk 品質(原文切片)

核心原則:內容品質勝過檢索技術。把算力前置投入在高品質筆記建構,而非後期用複雜架構補救。

技術棧

層級技術用途
筆記生成Claude Code + Opus 4.5 (multimodal)讀取掃描 PDF → 產出原子化增強筆記
搜尋引擎qmdBM25 + 向量 + LLM re-ranking
本地推論qmd 內建 GGUF 模型(via node-llama-cpp)embedding(300MB)+ reranker(640MB)+ query expansion(1.1GB),首次使用自動下載至 ~/.cache/qmd/models/
查詢回答Claude Code接收問題 → qmd query → 讀筆記 → 沿連結擴展 → 回答
編輯Obsidian / 任何文字編輯器人工校驗筆記

關鍵設計決策

決策選擇理由
題目顆粒度每題一檔qmd 不怕檔案多;分組會傷害檢索精確度;出題場景需要精準命中
跨領域人物一人一筆記人物是天然知識單元;筆記內按領域分段並用 連結 指向概念
CLAUDE.md 模式建構 + 查詢合一MVP 階段需要緊密迭代:建完筆記 → 馬上提問測試 → 發現缺漏 → 補上
公式表示法LaTeX + 純文字描述雙寫LaTeX 供人讀;純文字描述供 qmd BM25 搜尋
圖片處理提取圖檔 + 文字等效描述qmd 是文字搜尋;圖片必須有等效文字描述才能被檢索到

五種筆記類型

1. 概念筆記 (type/concept)

定律、理論、現象。例:光的波粒二象性、萬有引力定律、日心說。

tags: [type/concept, topic/*, chapter/*, difficulty/*, status/*]
prerequisites: ["背景概念"]  # 理解此概念需先懂什麼

正文:定義 → 背景知識連結 → 詳細說明 → 常見錯誤(LLM 增強)→ 相關概念連結 → 相關題目連結

2. 人物筆記 (type/scientist)

科學家。例:牛頓、伽利略、愛因斯坦。一人一筆記,跨領域用分段 + 連結處理。

tags: [type/scientist, topic/* (多個), era/*, status/*]
lifetime: "1642-1727"
nationality: 英國
fields: [力學, 光學, 天文學]

正文:生平 → 按領域分段列貢獻(每項連結到概念筆記)→ 歷史地位 → 相關人物連結

3. 公式筆記 (type/formula)

方程式、計算公式。例:質能互換公式、百分誤差公式。

tags: [type/formula, topic/*, chapter/*, difficulty/*, status/*]

正文:LaTeX 公式 → 純文字描述(供搜尋)→ 變數定義表 → 物理意義 → 應用場景連結 → 計算範例 → 易錯點

4. 應用筆記 (type/application)

物理技術的實際應用。例:半導體/IC、雷射、光纖、超導體、核能發電。

tags: [type/application, topic/*, chapter/*, status/*]

正文:定義 → 物理原理連結 → 結構與運作 → 圖表描述 → 發展歷史 → 日常生活應用 → 相關應用連結

5. 題目筆記 (type/question)

每一道例題和類題。每題獨立一檔。

tags: [type/question, topic/*, chapter/*, difficulty/*, question-type/*, source/108-textbook, status/*]
tests_concepts: ["被測試的概念"]
answer: "答案"

正文:題目 → 選項 → 答案 → 解析(逐選項分析 + 概念連結)→ 解題策略(LLM 增強)→ 相似題目連結

6. MOC 章節地圖 (type/moc)

每章一個索引,組織所有筆記的入口。

標籤系統

# 類型
type/concept | type/scientist | type/formula | type/application | type/question | type/moc

# 物理主題
topic/astronomy | topic/mechanics | topic/optics | topic/thermodynamics
topic/electromagnetism | topic/modern-physics | topic/measurement | topic/technology

# 章節
chapter/1-1 (物理學簡史) | chapter/1-2 (物理學對人類生活的影響) | chapter/1-3 (物理學與測量)

# 難度
difficulty/basic (記憶、定義) | difficulty/intermediate (理解、應用) | difficulty/advanced (分析、綜合)

# 題型
question-type/multiple-choice | question-type/fill-in-blank | question-type/calculation

# 來源
source/108-textbook

連結設計——Agentic Flow 的骨架

每則筆記至少三個方向的連結,讓 agent 能沿 [[]] 逐步擴展 context:

方向用途範例
向上 (prerequisites)理解此概念需先懂什麼光的波粒二象性 → 光的波動說, 光的粒子說
平行 (related)同層級相關概念萬有引力定律 → 克卜勒行星運動三大定律
向下 (applied_in / tested_by)被用在哪、被哪題考全反射 → 光纖通訊, Q-光纖全反射判斷

Agent 遍歷範例

  1. 學生問「光纖為什麼能傳輸訊號?」
  2. qmd 搜尋 → 找到 光纖通訊
  3. Agent 讀到「物理原理:全反射折射定律
  4. 判斷需要解釋原理 → 再搜尋 全反射
  5. 全反射筆記有公式、條件、常見錯誤
  6. 組合 context → 生成完整回答

Generation Pipeline

建構流程

  1. 輸入:使用者在專案 Claude Code 中貼 PDF 路徑
  2. 讀取:Claude (multimodal) 讀取掃描 PDF 所有頁面
  3. 識別:列出所有知識單元清單(概念、人物、公式、應用、題目),讓使用者確認
  4. 生成:一次生成所有筆記(確保 連結 一致性)
  5. 校驗:人工檢查公式 LaTeX、歷史年代、連結指向
  6. 索引qmd collection add notes/ --name physics --mask "*.md" && qmd embed(首次)或 qmd update && qmd embed(更新)

公式處理

Claude multimodal 直接從掃描圖片「看」到公式。每個公式三層表達:

  • LaTeX:$$E = mc^2$$
  • 純文字:能量等於質量乘以光速的平方
  • 變數表:markdown table 列出每個變數意義和單位

圖片處理

  • 從 PDF 提取圖片存入 attachments/
  • 筆記中嵌入:![[光纖截面圖.png]]
  • 必須附詳細文字描述(qmd 看不到圖片,只能搜文字)
  • 樹狀圖直接轉為 markdown 結構

Agentic Flow CLI 實作

目的

將 Phase 4 手動測試中「Claude Code 接收問題 → 搜尋 → 讀筆記 → 沿連結擴展 → 回答」的流程自動化為獨立 CLI 工具,不依賴 Claude Code session。

bun run src/index.ts "光纖為什麼能傳輸訊號?"

架構

Question
  → Haiku 拆解搜尋關鍵字(extractKeywords)
  → Search(grep / qmd search / vsearch / query,依 .env 設定)
  → 讀取筆記 + 提取 連結
  → Judge:context 足夠嗎?
    ├─ No → 讀取建議的 連結 筆記 → 回到 Judge(最多 5 輪)
    └─ Yes → Generate 答案
  → Verify:答案品質檢查
    ├─ No → 補充搜尋 → 重新 Generate(僅一次 retry)
    └─ Yes → 輸出最終答案

檔案結構

~/Documents/physics-kb/agent/
├── package.json
├── tsconfig.json
├── .env / .env.example
└── src/
    ├── index.ts        # CLI 入口(stderr 日誌 + stdout 答案)
    ├── agent.ts        # Agent loop 主體(state machine)
    ├── search.ts       # 搜尋策略抽象(Strategy Pattern × 4 種實作)
    ├── notes.ts        # 讀筆記、提取 連結、建立 title→path 索引
    ├── llm.ts          # Anthropic API 封裝(4 個 prompt)
    └── config.ts       # .env 載入 + 型別定義

依賴:@anthropic-ai/sdk + gray-matter,共 2 個。Bun 原生支援 .env、glob、TypeScript。

Model 選擇

步驟Model理由
extractKeywordsHaiku 4.5簡單的關鍵字拆解,不需要強推理
judgeHaiku 4.5判斷 context 是否足夠 + 建議追蹤連結,結構化輸出
generateHaiku 4.5根據已收集的筆記生成答案,context 品質比模型能力重要
verifySonnet 4.5品質把關需要更強的判斷力(見下方「Prompt 調整」)

成本:每次問答 3× Haiku + 1× Sonnet ≈ $0.01,可接受。

搜尋策略

透過 .envSEARCH_STRATEGY 切換,Strategy Pattern 實作:

策略指令特性適用場景
grepgrep -rl即時、全量召回、關鍵字精確匹配預設,最穩定
searchqmd searchBM25,單詞搜尋(多詞有 AND 匹配問題)需要 BM25 排序時
vsearchqmd vsearch向量語意搜尋語意模糊的問題
queryqmd queryBM25 + 向量 + rerankingGPU 環境(CPU 太慢)

Prompt 調整紀錄

問題:初版全用 Haiku,跨概念題目(如「密立坎油滴實驗跟原子模型的關係」)會混淆不同實驗、硬湊因果關係,且 Verify 判斷力不足,放過了錯誤。

調整

  1. Generate prompt 加入:「嚴格區分不同的實驗/事件/理論」「資料不足以建立因果關係時誠實說明,不要硬湊」
  2. Verify 改用 Sonnet 4.5,加入:「檢查是否混淆不同概念」「因果關係是否有筆記支撐」

效果:調整後同一題目不再硬湊關聯,改為誠實回覆「筆記中未直接記載兩者的因果關係」,Sonnet Verify 判定此為合格回答。

測試結果

題目類型範例問題Agent 行為結果
概念題(單一概念)光纖為什麼能傳輸訊號?Search 15 篇 → Judge 1 輪即 sufficient → Verify PASS✅ 正確解釋全反射原理
概念題(開放)光的波粒二象性是什麼?Search 36 篇 → Judge 1 輪即 sufficient → Verify PASS✅ 涵蓋定義、實驗證據、歷史、常見錯誤
人物題愛因斯坦有哪些重要貢獻?Search 45 篇 → Judge 1 不足 → 追蹤 愛因斯坦 原子模型演進 → Judge 2 sufficient → Verify PASS✅ 完整列出各領域貢獻
公式題庫侖定律的平方反比是什麼意思?Search 46 篇 → Judge 1 輪即 sufficient → Verify PASS✅ 正確解釋 F∝1/r²,含常見錯誤提醒
跨概念題密立坎油滴實驗跟原子模型的關係?Search 21 篇 → Judge 不足但無新連結 → Generate → Verify PASS(Sonnet 認可誠實回答)✅ 誠實說明筆記未記載因果,分別整理兩條脈絡
歷史演變題從伽利略到牛頓的力學轉變?Search 6 篇 → Judge 1 不足 → 追蹤 4 篇 → Judge 2 仍不足但無更多筆記 → Generate → Verify PASS✅ 正確梳理亞里斯多德→伽利略→牛頓脈絡

關鍵觀察

  • 簡單概念題:Judge 一輪就夠,不需要連結追蹤
  • 人物/歷史題:通常需要 1-2 輪連結追蹤來補充 context
  • 跨概念題:當筆記本身對跨領域關聯描述不足時,agent 無法補救——此時「誠實說明不足」比「硬湊」更好
  • grep 策略作為預設足夠穩定,搜尋速度快且召回率高

使用說明

環境需求

項目需求說明
OSLinux / macOSWindows 未測試
RAM8GB+qmd embed 需載入 embedding 模型(~300MB)
CPU任何 x86_64qmd query 的 reranking 在無 GPU 時很慢(~5 分鐘)
GPU非必要有 GPU 可加速 qmd query
磁碟~500MBnotes + qmd 模型 + node_modules

部署步驟

# 0. Clone repo
git clone https://github.com/echoedinvoker/physics-kb.git
cd physics-kb
 
# 1. 安裝 Bun(TypeScript runtime)
curl -fsSL https://bun.sh/install | bash
source ~/.bashrc
 
# 2. 安裝 qmd(搜尋引擎,必要依賴)
bun install -g github:tobi/qmd
 
# 3. 建立知識庫索引 + 向量嵌入(首次會自動下載 embedding 模型 ~300MB)
bash scripts/index.sh
 
# 4. 安裝 agent CLI 依賴
cd ~/Documents/physics-kb/agent
bun install
 
# 5. 設定 .env
cp .env.example .env
# 編輯 .env,填入 ANTHROPIC_API_KEY

.env 設定說明

# 搜尋策略(必填)
SEARCH_STRATEGY=grep          # 預設,最穩定
# SEARCH_STRATEGY=search      # qmd BM25,需先跑 index.sh
# SEARCH_STRATEGY=vsearch     # qmd 向量語意搜尋,需先跑 index.sh + qmd embed
# SEARCH_STRATEGY=query       # qmd 全功能(BM25 + 向量 + reranking),CPU-only 很慢
 
# Anthropic API Key(必填)
ANTHROPIC_API_KEY=sk-ant-...
 
# Agent loop 控制(選填)
MAX_ITERATIONS=5              # Judge 最多迭代幾輪,預設 5
MAX_CONTEXT_NOTES=20          # context 最多放幾篇筆記,預設 20

策略選擇建議

  • 日常使用 → grep(即時、精確匹配)
  • 需要相關性排序 → search(BM25)
  • 語意模糊的問題 → vsearch(向量語意搜尋)
  • 有 GPU 的環境 → query(最佳品質但最慢)

增加知識庫內容

方法 1:用 Claude Code 建構模式(批量生成)

# 在 physics-kb 目錄開啟 Claude Code
cd ~/Documents/physics-kb
claude
 
# 輸入指令觸發建構模式
> 處理教材:/path/to/教材.pdf

Claude Code 會依照以下流程處理:

  1. 盤點現有筆記 — 掃描 notes/ 建立標題清單
  2. 讀取 PDF → 識別知識單元
  3. 跨章節比對 — 新清單與現有筆記比對,標記 🆕新增 / 🔄合併 / ⏭️跳過
  4. 確認清單 — 使用者確認每項的處理方式
  5. 生成 / 更新筆記 — 新建或合併到舊筆記(追加內容,不覆蓋)
  6. 回填連結 — 舊筆記中的空連結若被這次新建的筆記填補,自動回填
  7. 空連結報告 — 列出仍未解決的 連結

詳見 CLAUDE.md 的建構模式說明。

核心原則:筆記品質是整個系統的根基。每次新增章節時,必須與現有筆記建立正確的 連結,而非產出孤立的新筆記。

方法 2:手動新增筆記

  1. templates/ 複製對應模板
  2. date +%Y%m%d%H%M 產生 ID 填入 frontmatter
  3. 存入 notes/ 對應子目錄(concepts / scientists / formulas / applications / questions / moc)
  4. 確保至少 3 個 連結(向上、平行、向下)

新增後更新索引

新增筆記後務必重新索引,確保所有搜尋策略都能找到新內容:

bash scripts/index.sh --update  # 僅更新(較快)
bash scripts/index.sh           # 完整重建(含 BM25 + 向量嵌入)

發問方式

cd ~/Documents/physics-kb/agent
 
# 基本用法
bun run src/index.ts "你的物理問題"
 
# 範例
bun run src/index.ts "光纖為什麼能傳輸訊號?"
bun run src/index.ts "愛因斯坦有哪些重要貢獻?"
bun run src/index.ts "庫侖定律的平方反比是什麼意思?"
 
# 臨時切換搜尋策略(覆蓋 .env 設定)
SEARCH_STRATEGY=vsearch bun run src/index.ts "兩物體間的交互作用力"
 
# 輸出結構:
#   stderr → agent loop 日誌(搜尋、Judge、連結追蹤過程)
#   stdout → 最終答案(Markdown 格式)
#
# 可用 pipe 分離:
bun run src/index.ts "問題" 2>/dev/null          # 只看答案
bun run src/index.ts "問題" > answer.md 2>&1      # 日誌到螢幕,答案存檔

Chapter 1 預估筆記量

類型數量說明
概念~15日心說、地心說、萬有引力、運動定律、光的粒子說/波動說、熱力學定律…
人物~25托勒密、哥白尼、伽利略、牛頓、愛因斯坦、法拉第、馬克士威…
公式~8質能互換、百分誤差、絕對誤差、庫侖定律…
應用~6半導體/IC、雷射、光纖、超導體、核能發電
題目~80例題 12 + 類題 ~68
MOC~4總覽 + 三個小節各一
合計~138

規模化分析(1 章 → 25 章)

目前 Ch1 有 307 篇筆記。完整 20-25 章預估 6,000-7,500 篇。以下是已識別的瓶頸與處理狀態:

問題嚴重度狀態說明
grep 搜尋失去精準度🔴 高待處理grep 回傳無排序,7,000 篇時 slice(0,10) 取到的可能完全不相關。規模化後應改預設為 search(BM25 有排序),grep 退為標籤全量召回輔助
buildNoteIndex 每次重掃🟡 中✅ 已修復改為 JSON 快取(.note-index.json),index.sh 執行時清除快取,下次 agent 啟動自動重建
檔名碰撞🟡 中✅ 已修復NoteIndex 改為 title → path[],碰撞時 stderr 警告並以啟發式規則選擇(優先非 question 筆記)。25 章下來需持續關注命名唯一性
qmd embed 時間🟢 低可接受7,000 篇的 embedding 建構時間會顯著增加,但為一次性操作
qmd query CPU 效能🟢 低已有替代無 GPU 環境已改用 search + vsearch 替代,不影響規模化
LLM context window🟢 低無需處理20 篇 × 2000 chars = 40K chars,在 Haiku 200K window 內

Checklist

Phase 1:專案骨架

  • 建立 ~/Documents/physics-kb/ 目錄結構
  • 撰寫 CLAUDE.md(定義建構模式與查詢模式)
  • 建立六種筆記模板(concept, scientist, formula, application, question, moc)
  • 撰寫 scripts/index.sh

Phase 2:工具安裝與驗證

  • 安裝 Bun(curl -fsSL https://bun.sh/install | bash
  • 安裝 qmd(bun install -g github:tobi/qmd)— 不需要 Ollama,qmd 自帶 GGUF 模型
  • 驗證 qmd collection add / qmd embed / qmd search / qmd vsearch / qmd query

Phase 3:Chapter 1 筆記生成

實際盤點後筆記量為 ~335 則(原估 ~138),主要差異在科學家(55)和題目(~250)數量。分批生成。

3.1 讀取 PDF 與清單確認

  • 讀取 ~/Downloads/p1_01_small.pdf 全部 44 頁
  • 生成知識單元清單(概念22/人物55/公式10/應用5/題目~250/MOC4)
  • 人工確認清單

3.2 批量生成——第一批:知識骨架(~93 則)

  • 概念筆記 1-1(14 則:地心說~夸克理論)
  • 概念筆記 1-3(7 則:測量與誤差~密度)
  • 科學家——天文(4):托勒密、哥白尼、第谷、克卜勒
  • 科學家——力學(3):亞里斯多德、阿基米得、伯努力
  • 科學家——光學(7):司乃耳、海更士、楊格、夫朗和斐、克希仁夫、菲左、佛科
  • 科學家——熱學(5):侖福特伯爵、卡諾、焦耳、克勞乃士、能士特
  • 科學家——電磁學(13):吉爾伯特~馬可尼
  • 科學家——近代物理(21):侖琴~蓋耳曼
  • 科學家——跨領域(2):伽利略、愛因斯坦(牛頓已存在)
  • 公式筆記(9 則,質能互換公式已存在)
  • 應用筆記(5 則:半導體、雷射、光纖、超導體、核能)
  • MOC 筆記(4 則)

3.3 批量生成——第二批:題目(~250 則)

  • 1-1 題目:物理史/力學/熱學(16 則)
  • 1-1 題目:光學(11 則)
  • 1-1 題目:電磁學(11 則)
  • 1-1 題目:近代物理/原子/量子(21 則)
  • 1-2 題目:半導體/雷射(16 則)
  • 1-2 題目:光纖/超導體/核能(18 則)
  • 1-3 題目:測量/有效數字/數量級(16 則)
  • 1-3 題目:SI制/因次/時間(22 則)
  • 1-3 題目:單擺/半衰期(16 則)
  • 1-3 題目:長度/螺旋測微器/游標尺(21 則)
  • 1-3 題目:三角測量/測遠儀/光學測微儀(14 則)
  • 1-3 題目:體積/質量/密度(28 則)

3.4 校驗與索引

  • 人工校驗(公式 LaTeX、歷史年代、連結指向)
  • 從 PDF 提取圖片至 attachments/,補充文字描述
  • 執行 bash scripts/index.sh 建索引(307 則筆記)
  • 驗證 qmd search(BM25)基本可用
  • 驗證 qmd vsearch(向量搜尋)基本可用
  • 驗證 qmd query(combined:query expansion + reranking)— 修復 OOM 後通過

OOM 問題與修復qmd query 同時載入三個 GGUF 模型(embedding 314MB + reranker 610MB + query expansion 1.2GB ≈ 2.1GB),在 7.5GB RAM 筆電上觸發 OOM 死當。根因:swap 為 zram(壓縮 RAM,非磁碟),swappiness=10。修復:建立 8GB btrfs swap file(btrfs filesystem mkswapfile)+ swappiness=60。修復後 query 正常運作。

Phase 4:查詢測試

測試策略:因 qmd query(reranking)在 CPU-only 筆電上太慢(~5 分鐘),改用 qmd search(BM25)+ qmd vsearch(向量)分開搜尋,由 Claude 判斷相關性。

  • 學生場景:問概念問題(「什麼是全反射?」)
  • 學生場景:問解題問題(「光速怎麼測量的?」)
  • 老師場景:按概念搜題(「找所有電磁學選擇題」)
  • 老師場景:要求出相似題(基於庫侖定律題目生成)
  • 記錄失敗案例(見下方)

測試結果

場景結果問題
學生問概念(全反射)⚠️ 部分通過缺少全反射概念筆記;BM25 多詞查詢零結果;連結追蹤淺(Q → 光纖通訊,無底層概念)
學生問解題(光速測量)⚠️ 部分通過找到菲左和相關題目;但菲左筆記太薄,未解釋旋轉齒輪法原理
老師按概念搜題(電磁學)❌ 召回率不足實際 12 題,BM25 找到 3 題,vsearch 找到 5 題;標籤搜尋零結果
老師出相似題(庫侖定律)✅ 通過BM25 找到完整知識網(概念+公式+科學家+題目),context 充足

發現的問題

P1 — 跨章節概念缺口(預期行為,非 bug)

  • 全反射、折射定律等光學概念不在 Ch1 教材範圍,處理後續章節時自然補上
  • 科學家筆記深度受限於教材提及的程度(如菲左在 Ch1 僅一句帶過)

P2 — BM25 多詞搜尋失敗(檢索問題)

  • 「全反射 原理 條件」「topic/electromagnetism question-type/multiple-choice」等多詞查詢零結果
  • BM25 似乎做 AND 匹配,需用單詞搜尋

P3 — 按標籤搜題召回率低(檢索問題)

  • 老師場景需要「找出所有某主題的題目」,qmd search/vsearch 都無法保證全量召回
  • 可能需要 grep 標籤作為補充手段,或在查詢模式中加入 grep fallback

P4 — qmd query 在無 GPU 筆電上不實用(效能問題)

  • Reranking 25 份文件需 ~5 分鐘(CPU-only)
  • 改用 search + vsearch 分開跑 + Claude 判斷相關性作為替代方案

Phase 5:迭代優化

  • P1:跨章節概念缺口是預期行為,處理後續章節時自然補上,不需額外動作
  • P2/P3 修復:查詢模式改為三層搜尋策略(vsearch + search 單詞 + grep 標籤),grep 保證全量召回
  • P4:qmd query 在無 GPU 筆電不實用,已改用 search + vsearch 替代,不需額外動作
  • 重新索引並重測 — 筆記內容未變動,索引有效,不需要
  • 撰寫驗證報告:實驗:qmd 原子化筆記方案驗證(物理 Ch1)

Phase 6:Agentic Flow CLI

  • 建立 ~/Documents/physics-kb/agent/ 專案骨架(package.json, tsconfig.json, .env)
  • 實作 config.ts(.env 載入 + 型別定義)
  • 實作 notes.ts(readNote + extractWikilinks + buildNoteIndex)
  • 實作 search.ts(Strategy Pattern × 4 種搜尋策略)
  • 實作 llm.ts(4 個 prompt:extractKeywords / judge / generate / verify)
  • 實作 agent.ts(agent loop state machine)
  • 實作 index.ts(CLI 入口)
  • 測試 6 種題型(概念 / 人物 / 公式 / 跨概念 / 歷史演變 / 開放問題)
  • Prompt 調整:Generate 加入「不硬湊因果」規則,Verify 換 Sonnet 4.5
  • 後續章節筆記建構完成後,重新測試跨章節概念題

Web Demo

詳見 物理知識庫 Demo。為 Agentic Flow CLI 做的瀏覽器介面(demo/server.ts + demo/index.html),支援即時思考過程串流、多輪對話、出題去重。

線上 Demohttps://physics-kb.fly.dev/(密碼保護,Fly.io 東京機房)

# 本地開發
cd ~/Documents/physics-kb/demo && ~/.bun/bin/bun run server.ts
# → http://localhost:3456
 
# 部署更新
cd ~/Documents/physics-kb && /home/matt/.fly/bin/flyctl deploy

連結