
Day 24 我把 1,720 份 Kubernetes 文件切成 chunks、建立 FTS5 索引,也量了索引大小和查詢延遲。今天沿用 Day 22 的十道問題,確認搜尋結果前幾名有沒有答案所需的 chunks。
搜尋速度和證據命中率是兩回事,得分開量。我把人工標記的支援 chunks 當作答案證據,另外記錄每題的搜尋延遲。
data/benchmark.jsonl 記錄十題中文問題、預期答案與 Kubernetes 來源章節。新建的 data/day25-retrieval-queries.json 為每題固定一組英文搜尋詞,並列出直接支持預期答案的 gold_chunk_ids。我逐題對照 Day 22 標記的來源章節和切塊內容。結果即使來自同一份文件,只要沒命中標記的段落,就不算找到證據。
Kubernetes 語料是英文,現有 FTS5 也依關鍵字搜尋,所以查詢詞固定用英文。題目仍保留中文;這次沒有把題目翻譯成英文,也沒有請模型改寫查詢詞。查詢器會用 AND 組合搜尋詞,因此每個詞都必須出現在同一個 chunk 裡。
每題的 Recall@K,是前 K 個結果命中的 gold chunks 數量,除以該題標記的 gold chunks 總數。平均 Recall@K 是十題分數的算術平均,每題權重相同。Recall@K 的 K 固定為 1、3、5、10。每題先暖身一次,再依固定順序量 20 輪。這次只量測既有的搜尋流程;索引沒有重建,也沒有呼叫 Qwen 生成答案。
完整索引有 1,720 份文件、36,807 個 chunks。下表列出十題的平均 Recall@K,以及前 K 名已包含全部必要 gold chunks 的題數。
| K | 平均 Recall@K | 找齊所有 gold chunks 的題目 |
|---|---|---|
| 1 | 0.500 | 5/10 |
| 3 | 0.800 | 8/10 |
| 5 | 0.850 | 8/10 |
| 10 | 0.900 | 9/10 |
k8s-005 需要 ConfigMap 和 Secret 兩段證據。查詢 ConfigMap confidential data 把它們排在第 4 和第 8 名。前五名只命中第一段,所以 Recall@5 是 0.5;到前十名兩段都出現,Recall@10 才是 1.0。
k8s-007 則完全沒找回標記的證據段落:查詢 PersistentVolumeClaim storage 的前十名,兩個說明 PV 與 PVC 定義的 gold chunks 都沒有出現。前十名裡有同一份來源文件的其他 chunks,單看檔名很容易以為找對了。對照段落 ID 才看得出來,它們不是這題標記的證據;因此 K=10 的 Recall 仍是 0。把搜尋結果上限調到 100 後,兩個 gold chunks 才分別出現在第 65 和第 87 名。
200 次正式查詢中,p50 是 0.199 毫秒,p95 是 0.354 毫秒。計時從查詢解析開始,包含 SQLite 連線、MATCH、BM25 排序、讀取結果和轉成 Python 物件。不含索引建置與模型生成。量測環境為 Apple M5、32 GiB 記憶體、Python 3.13.15、SQLite 3.53.1。
這次只有十道題,搜尋詞是為英文語料人工挑選,每題標記一到兩個段落。結果只代表這批語料、查詢和標記方式,不能用來推論中文檢索或一般問題的表現。
以下指令從 Repository 根目錄執行,依序用 Day 23 raw 建立 manifest、索引並執行評估器。執行前,tokenizer 必須已在本機快取。
mkdir -p data/day25/reproduction
HF_HUB_OFFLINE=1 uv run python knowledge/ingest.py \
--raw-dir data/day23/results/raw \
--output data/day25/reproduction/manifest.json \
--tokenizer mlx-community/Qwen3.8-27B-4bit \
--max-tokens 160 --overlap-tokens 24
HF_HUB_OFFLINE=1 uv run python knowledge/retrieve.py \
--manifest data/day25/reproduction/manifest.json \
--database data/day25/reproduction/retrieval.sqlite
HF_HUB_OFFLINE=1 uv run python knowledge/benchmark_retrieval.py \
--manifest data/day25/reproduction/manifest.json \
--database data/day25/reproduction/retrieval.sqlite \
--output data/day25/reproduction/summary.json
評估器先核對索引與 manifest 的 chunk ID、來源和文字 hash,再確認每個 gold chunk 都對應到題集標記的來源。結果摘要存於 data/day25-retrieval-summary.json。本機重跑產物放在 data/day25/reproduction/,不加入 Git。
bm25()