昨天我把 corpus 的文件身份、metadata、重複與 snapshot hash 固定下來。但 corpus 乾淨,不代表評測就公平。
如果問題全是我看著文件標題想出來的,BM25 很可能看起來特別強;如果只挑高度改寫的口語問題,又可能反過來偏袒 Dense Retrieval。在任何 retriever 進場以前,我得先知道 query set 裡到底有什麼、沒有什麼。
原本的 queries.jsonl 只有 query_id 與 query。這樣可以跑檢索,卻無法回答「我是不是只收集到某一種問題」。我沒有改寫已被舊實驗 hash-pinned 的檔案,而是新建 queries-day04.jsonl 保留擴充 metadata 後的 snapshot。
我為每題補上六個欄位:
{
"query_id": "q-room-approval",
"query": "八人以上會議室預約需要主管核准嗎",
"metadata": {
"intent": "policy",
"difficulty": "boundary",
"lexical_form": "multi-constraint",
"answerability": "answerable",
"split": "test",
"frozen": true
}
}
這些欄位不是為了把 JSON 變得好看,而是讓我能分別觀察:
寫了 labs/retrieval/audit_query_set.py,不跑 BM25、Embedding 或 Reranker,只檢查 schema 與類型覆蓋。執行:
python3 labs/retrieval/audit_query_set.py \
--output /tmp/day04-query-audit.json
實際輸出的核心結果是:
status: ready-with-gaps
query_count: 7
structural_issue_count: 0
coverage_warning_count: 4
intent:
escalation: 1
how-to: 2
policy: 3
troubleshooting: 1
answerability:
answerable: 7
四個 coverage warnings 是:
pilot set has fewer than 20 queries
no unanswerable query is represented
no ambiguous query is represented
no multi-hop query is represented
這個結果比「7 題都能跑」有價值得多。告訴我,目前只有一組結構正確的 pilot set,還不是可以代表真實使用情境的 benchmark。
現有 7 題的 answerability 全是 answerable。如果直接用這批題目評估 RAG,我其實沒有測到一個很重要的能力:當 corpus 沒有證據時,系統會不會停下來?
同樣地,沒有 ambiguous query,我就無法測到系統是否知道要追問;沒有 multi-hop query,就無法觀察單一文件檢索和多段證據整合的差別。
所以我不會用「再多想幾個類似問題」解決。後續擴充時必須先按 taxonomy 設配額,再在每類裡撰寫:
| 類型 | 目前 | 下一版最少要補的情境 |
|---|---|---|
| Answerable | 7 | 保留專有名詞、改寫、邊界值與多條件 |
| Unanswerable | 0 | corpus 完全沒有證據,不應硬找最像的文件 |
| Ambiguous | 0 | 少了時間、對象或範圍,應追問而非猜測 |
| Multi-hop | 0 | 需要兩份以上文件才能組成答案 |
小數據隨機切分看起來很「機器學習」,實際上每個 split 可能只剩一、兩題,類型也會因為隨機 seed 而消失。
我現在將這 7 題全部標成 split: test 與 frozen: true,意思不是已經足夠,而是:
這是我現在能做到的最小污染防線。
我又用現有 task validator 確認 enriched JSONL 仍然能被後續 pipeline 載入:
status: valid
documents: 7
queries: 7
qrel_pairs: 9
orphan_queries: 0
orphan_documents: 0
這和 query audit 的 ready-with-gaps 並不矛盾。valid 表示 ID、JSONL 與 qrels reference 沒有斷掉;ready-with-gaps 表示雖然可以跑,情境覆蓋還不夠。
這個區別很重要。一套可以成功載入的 benchmark,仍然可能從題目設計階段就已經偏了。
今天我沒有跑任何 retriever,而是把現有問題變成可統計的 query set,然後直接看見缺口。
一個 Query Set 的價值,不是能讓系統答對多少題,而是能不能代表我想要系統處理的成功、邊界與失敗情境。
下一步才是對這些 query 建立 qrels。到時另一個問題會出現:什麼叫「相關」,又該如何處理部分相關與無答案題?
下一篇:Day 05|Qrels:沒有相關性標註,就沒有真正的 Retrieval 評測
本篇所有 query 均為公開 synthetic data,與我的工作無關。