檢索增強生成(Retrieval-Augmented Generation, RAG)是一種先從外部知識庫找出候選證據,再交給大型語言模型(Large Language Model, LLM)整理回答的方法。Lewis 等人:Retrieval-Augmented Generation Day 08 已把查詢表示、文件結構、門控、檢索與重排序拆成不同實驗因子;今天要再往前一步,把「想知道的事」接到「能夠判讀的結果」。
假設完整方法的平衡準確率增加 3 個百分點,但第一、二級案例的嚴重檢傷不足也增加 2 個百分點。這算進步,還是退步?如果文章只寫「哪一套系統最好」,看到結果後才挑一個有利指標,就能對同一份資料講出完全不同的故事。
真正需要在測試前回答的是:主要比較是哪兩組?主要量測是什麼?預期方向是什麼?可以接受的安全代價是多少?區間跨過零差異時,要寫成沒有差異,還是資料不足?
下圖把這些問題畫成五條獨立路線。每張空白卡片都要經過成對比較、量測框與三格判讀托盤;左側上鎖的資料盒代表共同測試集在規則寫完前不能打開。

上圖是研究設計的概念示意。每一題都要先寫清楚比較對象、量測方式與判讀規則,才能在打開測試資料後用相同標準解讀結果。
讀完 Day 09 後,你應該能夠:
今天的新名詞很多,先用表格建立索引。表格是快速查找用途;正文仍會在第一次使用時,以完整句子重新說明。
| 中文名稱 | 英文全名/縮寫 | 在本篇的用途 |
|---|---|---|
| 研究問題 | Research Question, RQ | 指定要用資料回答的未知問題 |
| 研究假設 | Research Hypothesis | 在看共同測試結果前,寫下預期效果方向 |
| 研究計畫書 | Study Protocol | 保存問題、比較、終點與分析規則的正式計畫 |
| 預先指定 | Prespecification | 先固定比較、指標與判讀規則,再開啟測試集 |
| 確認性分析 | Confirmatory Analysis | 按照預先規則檢查主要主張 |
| 探索性分析 | Exploratory Analysis | 從結果發現新線索,供下一輪驗證 |
| 主要終點 | Primary Endpoint | 一個問題最主要的量測結果 |
| 次要終點 | Secondary Endpoint | 補充機制、代價或其他結果的量測 |
| 安全護欄 | Safety Guardrail | 即使主要指標改善,也不能越過的安全界線 |
| 效果估計 | Effect Estimate | 兩種方法在指定指標上的差值 |
| 信賴區間 | Confidence Interval, CI | 表達有限樣本下效果估計的不確定範圍 |
| 拒答 | Abstention | 證據不足時不輸出正式級數,轉交人工處理 |
| 覆蓋率 | Coverage | 系統實際回答的案例比例 |
| 選擇性風險 | Selective Risk | 只在系統選擇回答的案例中計算錯誤風險 |
研究問題(Research Question, RQ)描述目前不知道、而且打算用資料回答的事情。好的研究問題至少要指出:評估對象、比較方法、結果指標與適用範圍。
研究假設(Research Hypothesis)則在看共同測試結果前,寫下預期差異與方向。它不是願望,也不是宣傳標語,而是一個可能被資料反駁的主張。
例如:
本篇的 H1 到 H5 是專案內的假設識別字,不是在介紹統計檢定中成對使用的假設符號。換句話說,H1 只是第一條研究主張的代號,不代表它已經成立。
如果已經有足夠理論與前期資料,可以預先寫下方向。若資料來源、制度映射或可用規則仍不完整,先保留成探索性問題,通常比勉強猜一個方向更誠實。
因此,本篇會讓 RQ1、RQ2、RQ3 與 RQ5 對應方向假設;RQ4 則先定位為探索性穩健性問題,檢查結論是否過度依賴某一次資料切分或某一種前處理方式。
預先指定(Prespecification)是先寫下比較組、主要終點、分析方式與判讀規則,再開啟共同測試集。它的目的不是禁止新發現,而是讓讀者分得出「原本要驗證的主張」與「看到資料後想到的新問題」。
確認性分析(Confirmatory Analysis)按照預先計畫檢查主要主張。探索性分析(Exploratory Analysis)則用來找新模式、錯誤群組或下一輪假設。兩者都有價值,但證據角色不同,不能在結果出爐後才把最漂亮的探索結果改名為主要假設。
國際醫藥法規協和會(International Council for Harmonisation of Technical Requirements for Pharmaceuticals for Human Use, ICH)的 E9 統計原則要求臨床試驗在研究計畫書(Study Protocol)中精確定義主要變數、主要假設與分析方式,並區分預先規劃和結果出現後的額外分析。本專案不是藥品臨床試驗,也不把這份指引當成部署認證;我們借用的是「主要問題必須事先說清楚」的實驗原則。ICH E9:Statistical Principles for Clinical Trials
臨床預測模型透明報告指引加人工智慧擴充版(Transparent Reporting of a Multivariable Prediction Model for Individual Prognosis or Diagnosis Plus Artificial Intelligence, TRIPOD+AI)也強調,預測模型研究應完整說明為什麼進行、實際做了什麼、資料如何使用,以及發現了什麼。這提醒我們:設定檔不只服務程式,也要讓讀者能追查問題、方法與結果。Collins 等人:TRIPOD+AI statement
主要終點(Primary Endpoint)是回答一個研究問題時,最主要的量測。主要終點不一定全篇只能有一個,但同一條確認性假設應盡量有一個清楚的主要量測,避免看完結果後在十幾個指標中挑最高者。
本系列延續 Day 07 的評估地圖:
安全護欄(Safety Guardrail)是主要效能改善時仍不能跨過的界線。例如 H1 即使平衡準確率提高,嚴重檢傷不足也不能增加超過事先容許差異。容許差異不能由本篇憑空決定;它需要臨床審查、樣本規模與使用情境支持,並在共同測試前鎖定。
效果估計(Effect Estimate)是兩種方法在指定指標上的差值。95% 信賴區間(95% Confidence Interval, 95% CI)則表達有限樣本造成的不確定範圍;區間不能被解讀成「研究假設有 95% 機率為真」。
如果容許差異仍寫著 to-be-locked,研究計畫書就仍是規劃草案,不能執行確認性測試。這項未完成狀態必須公開,而不是用一個看似精確、實際沒有依據的小數補上。
本系列把「哪一個 RAG 最好」拆成五個層次:
下圖將五題接到主要比較、量測與研究角色。五題都使用同一份 KTAS 資料;先看最右欄:RQ4 沒有預設方向,其他問題也不是全部使用同一個指標。

上圖把五題的研究角色分開,避免把不同問題硬塞進同一個總分。下面從 RQ1 開始逐題定義。
RQ1 不是問完整方法能不能打敗最弱的多數類別基準,而是先估計「加入整套外部規則證據流程」的淨差異。
主要比較使用:
P0:雙重查詢、階層知識庫、安全候選聯集、混合檢索與重排序組成的完整 RAG。B4:使用相同本地 LLM、相同查詢表示、相同基礎提示詞、相同測試案例與相同輸出格式,但不提供外部檢索證據。其他基準仍要保留:B0 多數類別、B1 部分規則、B2 結構化機器學習(Machine Learning, ML)、B3 文字嵌入加結構化特徵,以及 B5 平面稠密 RAG。這些比較提供上下文,但 H1 的主要效果先聚焦 P0 - B4,用來估計加入整套外部證據流程的淨差異;它不能拆解 RAG 內部哪一個元件造成差異,元件歸因仍由 RQ2 負責。
H1 的規劃寫法是:
效能差 = P0 的平衡準確率 - B4 的平衡準確率
安全差 = P0 的嚴重檢傷不足率 - B4 的嚴重檢傷不足率
兩個式子中的 P0 與 B4 是方法識別字。效能差大於 0,代表 P0 的平衡準確率較高;安全差大於 0,代表 P0 的嚴重檢傷不足反而更多。
因此,支持 H1 需要同時滿足:效能差的 95% 信賴區間完整位於 0 以上,而且安全差的 95% 信賴區間上限沒有超過事先鎖定的容許增加。只滿足第一項,不能寫成完整方法「更安全」。
RQ2 接續 Day 08 的 A 到 D2 控制比較:
| 階段 | 唯一主要變動 | 最接近的量測層 |
|---|---|---|
| A | 原始、語意與雙重查詢表示 | 前 k 筆候選是否保留正確規則 |
| B | 平面與階層文件結構 | 父層路由與子規則覆蓋 |
| C | 無門控、硬門控、軟門控與安全聯集 | 門控前後候選及安全錯誤 |
| D1 | 稠密與混合檢索 | 正確規則能否進入前 k 筆 |
| D2 | 同一候選集合的重排序關閉與啟用 | 正確規則的排序位置 |
前 k 筆候選(Top-k Candidates)是檢索後保留的前 k 筆規則;k 是事先設定的候選數量。候選覆蓋率只問正確規則是否仍在集合中,不等於最終級數正確。
H2 預期雙重查詢的 Top-k 候選覆蓋率高於只有原始數值與只有規則語意的查詢。這一條先量候選層,不能直接跳成「最終檢傷一定更準」。
H4 必須拆成兩段,否則會重新混淆檢索與重排序:
例如正確規則排第 2 名,倒數排名是 1 ÷ 2 = 0.5;排第 5 名則是 1 ÷ 5 = 0.2。若完全沒有正確規則,該筆記為 0。
H4b 還有一個實作驗證:開啟重排序前後,候選成員與 Top-k 覆蓋率必須相同。若候選內容改變,表示程式不只重排,這組比較就不再回答 H4b。
本系列的五級編碼採用第一級最急、第五級最不急的方向。嚴重檢傷不足是參考級數為第一、二級,模型卻輸出第三、第四或第五級。
H3 比較安全候選聯集、無門控與生命徵象硬門控。主要終點是第一、二級中的嚴重檢傷不足率:
嚴重檢傷不足率
= 參考為第 1~2 級且預測為第 3~5 級的案例數
÷ 全部參考為第 1~2 級的案例數
分子只計算被判得明顯較不急的高急迫案例;分母是測試集中全部第一、二級參考案例。數值越低,表示這一種錯誤越少。
但只讓這個比例下降仍不夠。若系統把大量案例都往第一、二級推,嚴重檢傷不足可能下降,整體檢傷過度與資源壓力卻上升。因此 H3 同時設定整體檢傷過度的安全護欄;檢傷過度差值的 95% CI 上限不能超過事先容許增加。兩個比例都要附分子、分母、各級樣本數與 95% CI。
本系列只使用 Kaggle 上 1,267 筆韓國急診檢傷與急迫度分級量表(Korean Triage and Acuity Scale, KTAS)資料,因此無法用另一個醫院資料集檢查外部效度。RQ4 改問一個這份資料真正能回答的問題:同一項效果是否只在某個亂數種子、某種折數或某個前處理選擇下出現?
主要敏感度軸包括:
每一種設定都計算相同的配對效果差:
設定內效果差 = 完整方法的平衡準確率 - 相同 folds 上基準方法的平衡準確率
接著比較效果方向、大小與 95% 信賴區間。若方法只在某一個種子下提高,其他設定接近零或方向相反,就應寫成「結果對切分敏感」,不能挑出最好的一次當成主結論。
RQ4 仍是探索性問題,因為敏感度分析不能取代真正的外部資料驗證。它能揭露內部不穩定,卻不能證明模型換到其他醫院後仍然有效。
目前的假設契約如下。H4 分成 a、b 兩段,是為了對齊 D1 檢索與 D2 重排序。
| 假設 | 主要比較 | 主要終點 | 預期方向 | 必要護欄或不變條件 |
|---|---|---|---|---|
| H1 | P0 對照 B4 | 平衡準確率 | P0 較高 | 嚴重檢傷不足增加不超過容許差異 |
| H2 | 雙重對照原始與語意查詢 | Top-k 候選覆蓋率 | 雙重高於兩種單通道 | 相同知識庫、檢索器與 k |
| H3 | 安全聯集對照無門控與硬門控 | 嚴重檢傷不足率 | 安全聯集較低 | 檢傷過度增加不超過容許差異 |
| H4a | 混合對照稠密檢索 | Recall@k | 混合較高 | 重排序關閉 |
| H4b | 重排序啟用對照關閉 | MRR | 啟用較高 | 候選成員與覆蓋率相同 |
| H5 | 證據感知對照信心式拒答 | 相同覆蓋率的選擇性風險 | 證據感知較低 | 第一、二級覆蓋率不低於下限 |
這張表仍缺少兩個需要外部審查的數字:H1、H3 的容許差異,以及 H5 的覆蓋率與第一、二級覆蓋下限。設定檔會把它們保留為待鎖定,提醒我們不能先跑測試再補門檻。
下圖以 H3 展開一條完整契約。請從左到右確認六個欄位,接著看下方三種可能結果。「結果不明確」是正式判讀,不等於證明兩種方法完全相同。

上圖把一個可反駁假設拆成六個必填欄位,並預先保留三種結果。下面說明這三種判讀不能互相混用。
前面定義的效果估計與 95% CI,要一起用來判斷方向與不確定性,不能只看點估計。
以下三組數字只用來示範判讀。假設預期效果差要大於 0:
| 合成效果差與 95% CI | 判讀 | 原因 |
|---|---|---|
+3.2 百分點 [+0.8, +5.6] |
支持預期方向 | 整段區間都大於 0;仍要檢查安全護欄 |
+3.2 百分點 [-0.6, +7.0] |
結果不明確 | 區間同時包含負值、0 與正值 |
-3.0 百分點 [-5.0, -1.0] |
方向相反 | 整段區間都小於 0 |
百分點是兩個百分比直接相減的單位。例如 60% 減 55% 是增加 5 個百分點,不是增加 5%。
p 值(p-value)可以描述資料和某個指定統計模型之間的不相容程度,但它不是研究假設為真的機率,也不表示效果大小或臨床重要性。美國統計協會(American Statistical Association, ASA)的正式聲明也提醒,科學結論不應只依賴 p 值是否跨過單一門檻。ASA:Statement on Statistical Significance and P-Values
所以本系列會一起報告:效果差、95% CI、樣本數、分子、分母、安全護欄與預先角色,而不是只在表格放一顆星號。
拒答(Abstention)是系統在證據不足、必要欄位缺失或輸出無法通過驗證時,不產生正式級數,改為清楚標記並交由人工處理。拒答不是刪除案例,也不是把案例移出評估資料。
覆蓋率(Coverage)是系統實際回答的案例比例:
覆蓋率 = 系統有輸出正式級數的案例數 ÷ 全部測試案例數
假設 100 筆案例中回答 90 筆,覆蓋率就是 90 ÷ 100 = 90%。覆蓋率越低,表示拒答越多。
選擇性風險(Selective Risk)是在系統選擇回答的案例中計算錯誤。對 H5 的安全問題,還要把第一、二級分母寫清楚:
已回答案例的嚴重檢傷不足率
= 已回答、參考為第 1~2 級、預測為第 3~5 級的案例數
÷ 已回答且參考為第 1~2 級的案例數
第一、二級覆蓋率
= 已回答且參考為第 1~2 級的案例數
÷ 全部參考為第 1~2 級的案例數
假設 100 筆案例中有 15 筆參考為第一、二級,系統回答其中 12 筆,並有 2 筆嚴重檢傷不足:
第一、二級覆蓋率 = 12 ÷ 15 = 80%
已回答案例的嚴重檢傷不足率 = 2 ÷ 12 ≈ 16.7%
若另一個方法只回答 9 筆第一、二級案例,錯 1 筆,風險雖降為約 11.1%,卻多拒答了 3 筆高急迫案例。這就是 H5 必須同時設定第一、二級覆蓋率下限的原因:不能藉由拒答高風險案例,讓已回答子集看起來特別安全。
H5 比較兩種方法:
兩組要在相同整體覆蓋率下比較;拒答門檻在開發資料選定,不能看共同測試結果後左右移動。選擇性分類研究把「風險」與「覆蓋率」的交換關係視為核心問題,但相關研究多在一般影像分類資料上驗證,不能直接當成急診系統安全證明。Geifman 與 El-Yaniv:Selective Classification for Deep Neural Networks
下圖使用固定合成數值示範 H5 預期怎麼讀。藍線低於紫線只代表在相同覆蓋率下,藍線對應的選擇性風險較低;仍要檢查逐級覆蓋、所有拒答案例與外部驗證。

上圖也提醒一個容易忽略的事:如果某種拒答方法在 70% 覆蓋率時風險很低,另一種方法卻回答 100%,兩者不能直接排名。必須先把覆蓋率對齊,並揭露被拒答的 30% 是哪些級別與哪些錯誤類型。
本篇接下來會建立 configs/experiments/day-09-research-protocol.json。JavaScript 物件表示法(JavaScript Object Notation, JSON)是一種以鍵與值保存結構化資料的純文字格式。這份設定檔目前明確標示 planning,不代表研究計畫已鎖定,也不代表任何結果已完成。
接下來不會要求你前往任何程式碼網站。請在自己的電腦開啟專案資料夾,依下列順序建立檔案;每個程式碼區塊都是該檔案的完整內容,不含省略號。
本篇沿用 Day 08 已完整建立的控制比較設定,並新增研究問題與假設契約。
先從專案根目錄建立需要的資料夾:
mkdir -p configs/experiments
如果指令沒有印出訊息是正常的。可用 test -d 資料夾路徑 && echo "資料夾已建立" 驗證單一資料夾。接著使用你熟悉的文字編輯器新增各檔案,把對應區塊完整貼入後儲存。
configs/experiments/day-09-research-protocol.json保存研究問題、假設、主要終點、方向與安全護欄。
請在文字編輯器建立 configs/experiments/day-09-research-protocol.json,貼入以下完整內容並儲存:
{
"schema_version": "0.2",
"status": "planning",
"description": "Day 09 研究問題與預先假設草案;所有待鎖定欄位完成前,不得執行共同測試集。",
"scope": {
"system_role": "clinical decision support candidate only",
"test_sets_locked_after_protocol": true,
"triage_system_scores_must_not_be_pooled": true,
"effect_estimates_reported_with_confidence_intervals": true
},
"analysis_policy": {
"confidence_level": 0.95,
"resampling_unit": "record; patient identifier is unavailable, so within-patient dependence cannot be ruled out",
"multiplicity_adjustment": "to-be-locked-before-test",
"safety_margins": "to-be-locked-with-clinical-review",
"inconclusive_rule": "confidence interval crosses a decision boundary",
"post_hoc_findings": "exploratory-only"
},
"research_questions": [
{
"id": "RQ1",
"role": "confirmatory",
"question": "外部規則檢索是否比無檢索生成與其他基準增加可測量價值?",
"primary_comparison": "P0 versus B4",
"contextual_comparisons": ["P0 versus B0", "P0 versus B1", "P0 versus B2", "P0 versus B3", "P0 versus B5"],
"hypotheses": ["H1"]
},
{
"id": "RQ2",
"role": "mechanism",
"question": "查詢表示、文件結構、門控、檢索與重排序各自改變哪一層結果?",
"experiment_stages": ["A", "B", "C", "D1", "D2"],
"hypotheses": ["H2", "H4a", "H4b"]
},
{
"id": "RQ3",
"role": "confirmatory-safety",
"question": "安全候選聯集能否降低第一、二級案例的嚴重檢傷不足?",
"experiment_stages": ["C", "E"],
"hypotheses": ["H3"]
},
{
"id": "RQ4",
"role": "exploratory-robustness",
"question": "預先比較的效果方向是否對資料切分、缺失值策略與主訴正規化保持穩健?",
"sensitivity_axes": ["fold seeds", "number of folds", "missing-value handling", "chief-complaint normalization"],
"hypotheses": []
},
{
"id": "RQ5",
"role": "confirmatory-after-coverage-lock",
"question": "在相同覆蓋率下,證據感知拒答能否降低已回答案例的選擇性風險?",
"coverage_target": "to-be-locked-on-development-data; candidate=0.90",
"hypotheses": ["H5"]
}
],
"hypotheses": [
{
"id": "H1",
"comparison": "P0 full retrieval-augmented pipeline versus B4 same local language model without retrieval",
"primary_endpoint": "paired difference in balanced accuracy",
"expected_direction": "greater than 0",
"safety_guardrail": "upper confidence bound for the increase in severe undertriage does not exceed a pre-locked margin"
},
{
"id": "H2",
"comparison": "dual query representation versus raw-only and semantic-only representations",
"primary_endpoint": "top-k candidate coverage on the versioned rule probe set",
"expected_direction": "dual is greater than both single representations"
},
{
"id": "H3",
"comparison": "safety-union gate versus no gate and vital-sign hard gate",
"primary_endpoint": "severe undertriage among reference levels 1 and 2",
"expected_direction": "safety-union is lower than both comparators",
"safety_guardrail": "upper confidence bound for the increase in overall overtriage does not exceed a pre-locked margin"
},
{
"id": "H4a",
"comparison": "hybrid retrieval versus dense retrieval with reranking disabled",
"primary_endpoint": "rule recall at pre-locked k",
"expected_direction": "hybrid is greater than dense"
},
{
"id": "H4b",
"comparison": "reranker enabled versus disabled on the exact same candidate sets",
"primary_endpoint": "mean reciprocal rank of the correct rule",
"expected_direction": "enabled is greater than disabled",
"invariant": "candidate membership and top-k coverage are unchanged"
},
{
"id": "H5",
"comparison": "evidence-aware abstention versus confidence-only abstention at matched coverage",
"primary_endpoint": "severe undertriage among answered cases at the pre-locked coverage target",
"expected_direction": "evidence-aware is lower than confidence-only",
"safety_guardrail": "lower confidence bound for coverage among reference levels 1 and 2 does not fall below a pre-locked floor",
"required_report": "all rejected cases and the full risk-coverage curve remain visible"
}
]
}
儲存後先確認檔名與相對路徑完全一致,再繼續建立下一個檔案。
以下命令會在需要時產生套件鎖定檔,接著檢查設定格式與 Python 語法;它們不會啟動模型,也不會把病患資料送到網路:
python3 -m json.tool configs/experiments/day-09-research-protocol.json
每個命令都應正常結束。若 JSON 顯示行號,先檢查貼上時是否遺漏逗號、引號或括號;若 py_compile 報錯,先依行號修正縮排或漏貼內容。靜態檢查通過後,再執行本文後面的正式步驟。
接下來用四個步驟檢查它。
configs/experiments/ 中同時存在兩份 JSON。day-08-controlled-comparisons.json 與 day-09-research-protocol.json。在專案根目錄執行:
python3 -m json.tool configs/experiments/day-09-research-protocol.json
json.tool 解析並格式化內容。research_questions 與 hypotheses 兩個陣列。to-be-locked 值換成有理由、可追溯的設定,保存研究計畫版本與鎖定時間。設定檔只是最低限度的機器可讀契約。正式執行時仍要產生執行清單(Run Manifest),記錄實際資料、程式、規則、提示詞、模型與輸出版本,才能從結果追回當時條件。
「階層 RAG 好不好?」沒有指定比較組、資料範圍與主要量測。可回答的問題要說清楚和誰比、改哪一項、看哪一層結果。
假設必須可能失敗。若無論結果變高、變低或不變都能解釋成成功,那是宣傳話術,不是研究假設。
p 值不表示效果大小或臨床重要性。還要看效果差、信賴區間、樣本數、安全護欄與使用情境。
區間跨過 0 表示目前資料同時容許負差、零差與正差,應寫成結果不明確。要判斷差異是否小到可忽略,需要另外事先定義容許界線與相應實驗設計。
不同 folds 仍來自同一批 1,267 筆 KTAS 紀錄。它們可以檢查結果是否依賴單次切分,不能代表新的醫院、族群或時間。
拒答可能把困難案例,甚至高急迫案例移出已回答分母。必須在相同覆蓋率下比較,並另報第一、二級覆蓋率與所有拒答案例。
今天沒有執行模型,也沒有產生效能排行。我們把後續實驗要回答的問題寫成一份可失敗、可追查的契約:
這些規則只能提升實驗的可解釋性,不能讓 Side Project 自動取得臨床部署資格。系統仍定位為決策支援候選,所有級數與拒答狀態都需要專業人員覆核。
研究問題已經寫清楚,下一步才知道資料集必須提供哪些欄位、標籤與規則來源。
Day 10 會說明為什麼本系列最後只選 Kaggle KTAS 資料、這項選擇排除了哪些資料,以及單一小型資料集可以支持和不能支持哪些結論。