reduce-hallucination 是做什麼的?
將訊問科學用於讓知識淵博的證人說出真相的驗證技術,轉化為 LLM 代理的標準審計流程。每個 LLM 節點都是一位證人。節點之間的交接是證詞的轉錄。用戶修正與任務記錄則是物證。
理論與證據存放於 references/。請閱讀 references/research-map.md 以了解每個主張背後的引用來源。
三條鐵律
- 無證據不指控(Wellman 法則)。每項發現都必須引用它所針對的實際提示詞、架構或輸出。沒有引文的懷疑應放入「待驗證」清單,而非納入發現。
- 表面信號不代表真實。 流暢、自信、詳細的文字並不比簡潔的文字更正確。人們從行為解讀欺騙的準確率僅與機率相當。只應評判內容:是否有紮實依據、是否一致、被引用的片段是否存在。
- 自我修正需要新的外部訊號。 「你確定嗎?再檢查一次」若無新證據,會降低準確度。每次重新檢查都必須注入檢索結果或驗證器輸出。
良好引用的三大支柱
引用品質可分解為三個檢查層次,按難度與價值遞增:
| 支柱 | 問題 | 當前狀態 |
|---|---|---|
| 忠實 | 引文是否逐字真實?主張是否非虛構? | 大致可解:逐字比對 + 暫停回答 |
| 相關 | 來源是否針對問題? | 大致可解:檢索品質 + 一致性探測 |
| 支持 | 來源是支持、反駁 還是中立 於主張? | 前沿問題。困難,而罕見的「反駁」類別正是系統最弱之處。 |
一個指向真實且相關段落,但實際上並不支持主張的引用(「錯誤基礎」),比沒有引用更糟,因為它為錯誤主張製造了信任,並解除了審閱者唯一有效的防禦(檢查內容)。未經後端驗證就顯示引用,只會讓幻覺更危險,而非更安全。
審計協議
階段 1 — 訊問每位證人(提示詞 + 架構紅旗)
對每個 LLM 節點執行紅旗清單。每個標記都是一項訊問違規。
| 編號 | 紅旗(需注意的事項) | 為什麼重要 | 危害 |
|---|---|---|---|
| R1 | 枚舉欄位沒有 null / unknown 選項;單向的「輸出 X 的確認」指示。 | 強迫回答會產生服從(類比於虛假自白)。 | 強迫猜測、自信捏造。 |
| R2 | 提示詞授權暫停回答(「若缺失請用 null」),但架構中卻無 null。 | 架構優先,暫停回答無效。 | 無聲的捏造。 |
| R3 | 提示詞要求提供證據/引用,但下游並未檢查。 | 告知卻不驗證,會讓模型學會捏造更具說服力的引用。 | 偽造錨點。 |
| R4 | 方向性指示:「保守假設」、「假設」、「推斷自」、「預設為」。 | 單向預設;與 R1 結合會產生系統性偏差。 | 輸出朝單一方向傾斜。 |
| R5 | 聚合欄位未定義單位(「總年數」、「整體分數」)。 | 測量值在鎖定前需先宣告單位。 | 定義不符被解讀為提取錯誤。 |
| R6 | 少樣本範例偏離任務,或模仿無引用的推理。 | 範例設定了「好答案」的預期。 | 教導錯誤的輸出風格。 |
| R7 | 提示詞聲稱該節點能執行某項它沒有工具可完成的操作。 | 虛假前提。 | 虛構過程敘述。 |
| R8 | 由用戶或上游節點傳遞的「事實」,未標註來源直接當作真相。 | 只應以經驗證的證據對質。 | 前提污染。 |
| R9 | 模板有必填欄位但無空白分支。 | 模板版本的強迫回答。 | 空白處被填入最接近的值。 |
| R10 | 激進的重複檢查/重試(「你錯了,修正它」),但無新證據。 | 諂媚行為會翻轉正確答案。 | 正確答案被推翻。 |
每項記錄格式為:節點 | R# | 引文 | 一行後果。
階段 2 — 審計轉錄(節點邊界 / 資料流)
這是大多數管線幻覺發生的地方。繪製資料流並檢查每一條邊:
- 不確定性是否跨越邊界? 上游的
confidence/missing_fields/null/ 備註 — 下游是否消費了它們,還是模板將它們扁平化為斷言?尋找「死信」不確定性:已被產生但從未被讀取。 - 來源是否遺失? 上游推理中承認是「假設/推斷」的值,在下游變成了未標記的事實。架構應攜帶
stated | inferred | absent。 - 事實類別是否混淆? 配置或需求資料被渲染為是用戶/文件所斷言。
- 聚合值是否改變單位? 上游的「總醫療年資」在下游變成「擔任 X 職位的年資」。
- LLM 是否在做確定性運算? 日期計算、總和、計數應移出提示詞,改為程式步驟。
階段 3 — 比對物證(當有任務記錄時)
- 抽取一份任務樣本的中間節點輸出(優先選擇有用戶修正或失敗的任務)。
- 逐欄比對最終輸出 vs 各節點中間輸出 vs 原始輸入;找出在哪個邊界首先遺失真相。
- 尋找先前不一致的陳述:同一欄位在不同節點間自相矛盾。
- 若修正具有方向性(系統性地偏向某側),重新檢查階段 1 的 R4 方向性指示;隨機錯誤則較可能指向輸入品質問題。
- 誠實分類:「從未存在於來源中的資訊」(流程缺口,非幻覺) vs 「存在於輸入中但被錯誤陳述的資訊」(真正的幻覺)。
階段 4 — 分層修復(按投資報酬率排序)
第 1 層 — 提示詞 / 架構(零結構變更)
- 每個 R1/R2 → 加入
null/unknown列舉 + 一行去污名化文字(「X 是正確且預期的答案」)。 - 每個 R9 → 為模板加入空白分支(斷言變為開放式問題)。
- 每個 R5 → 拆分單位,或輸出範圍
{下限, 上限}。 - 每個 R3 → 為承載關鍵資訊的欄位加入
{value, source, evidence_quote}三元組。
第 2 層 — 確定性程式碼驗證器(零 LLM 成本)
| 驗證器 | 檢查項目 |
|---|---|
| 列舉白名單 | 欄位值是否在允許集合內。 |
| 引文逐字比對 | evidence_quote 是否逐字存在於引用的來源中;若無則拒絕或降級。 |
| 跨欄位一致性 | 總計是否吻合;missing_fields 不與已填入的值矛盾。 |
| 單位計算 | 日期差異 / 總和由程式處理;LLM 僅做語義提取。 |
| 出口契約 | 每個用戶可見的事實欄位非空,且來自允許的來源欄位。 |
放置於任何產生用戶可見內容的節點之前。若驗證失敗,寫入後備標記並路由至開放式問題或人工處理。
第 3 層 — LLM 交叉審問節點(LM-vs-LM)
- 一個獨立的節點,僅接收待審查的輸出以及來源文件(不含污染上下文)。
- 將任務表述為反駁:「嘗試反駁:此輸出中的每個主張是否都能追溯至來源文件?列出無法追溯的主張。」
- 輸出
{verdict, offending_claims[]};對於高風險流程,重新排序後再次提問並進行一致性投票。 - 成本:每項任務多一次 LLM 呼叫 — 僅限於用戶可見的出口或高風險決策時使用。
階段 5 — 報告
# 幻覺審計 — {代理}
## 一行結論
## 證據概覽(節點 / 審計版本 / 任務樣本 / 修正樣本 + 方向)
## 發現事項(每項:位置 | R# | 引文 | 後果 | 修正編號)
## 資料流圖與死信通道
## 修復建議(第 1/2/3 層,每項標記其消除的發現)
## 待驗證(缺乏足夠證據的懷疑 + 如何取得證據)
## 誠實邊界(哪些修正是流程缺口而非幻覺;此審計未涵蓋的範圍)
支持性作為前沿(可選擴展)
忠實 + 相關是基本門檻。待解決的開放問題是支持性:被引用的來源是支持、反駁,還是中立於該主張?研究中的兩點備註:
- 將其建模為立場加程度。三向立場(蘊含 / 反駁 / 中立)遺漏了部分或有條件的支持,而這正是監管和法律文本中最常見的情況。加入一個「部分/有條件」標記,將其路由至人工審查。
- 支持性是相對於意圖的。 同一段文字可能支持「我們符合規定」,同時反駁「我們有缺口」,取決於用戶的論點。當立場或意圖不確定時,應同時呈現支持與反駁的來源,讓用戶選擇。將方向呈現為一個邀請審查的標記,而非終審判決。
提醒
- 如果某個提示詞「糟糕到令人震驚」,首先檢查它是否為自動產生的樣板內容(重複的角色/目標/任務是特徵)。「此產生器有系統性問題」比逐個代理列出相同缺陷更有效。
- 在同一個代理內進行對比:哪些欄位乾淨,哪些失敗。差異通常就是答案(設有
unknown選項的欄位通常較乾淨)。 - 用白話文編輯報告:每項發現必須讓未讀過理論的人也能看懂。
相關技能
屬於一系列用於可信賴且清晰溝通的開放代理技能:
- reduce-hallucination — 審計 LLM 代理;確保紮實基礎、引用與暫停回答。
- better-doc — 經典風格 + 簡潔精煉。
- numbers — 讓數字有意義,並清晰呈現。