← 回作品列表

ReguCheck-RF 法規警語比對

Regulatory Clause Verification with LLM Guardrails

把產品手冊法規警語的人工逐字比對,工程化為「字面完全相同先快速放行、其餘交 LLM 做可稽核語意判讀、與規則衝突時退回人工」的合規檢查平台。

compliance 法規SARPDFLLM合規稽核 原始碼:私有

問題現場

產品手冊裡有些安全警語是法規規定要寫的(例如 RF / SAR 相關)。我的任務聽起來很單純:確認每份手冊都有寫、而且寫對。

真正動手才發現有兩層坑:

  • 純人工太慢:警語多、手冊多,逐字比對是重複又耗時的工作。
  • 純比字面會判錯:同一條規定常被「換句話說」。只比字面相似度,會把合規的同義改寫誤判成不合規(false fail),或反過來放過真正缺漏的。

最小技術背景

  • 法規警語 / 合規(compliance):手冊上依法規必須出現的安全或使用警告。
  • SAR:衡量人體吸收無線電波能量的指標,相關警語常受規範。
  • lexical vs semantic:lexical 是「字面像不像」;semantic 是「意思一不一樣」。本案的本質是後者。
  • LLM 當裁判(guarded judge):讓大型語言模型判斷語意,但加上護欄——輸出格式固定、結果存檔、可回頭稽核、衝突退回人工。

系統架構與資料流

字面完全相同的先快速放行;只有需要判斷語意的才動用 LLM,且 LLM 與規則衝突時不自動過、退回人工:

flowchart TD
  PDF["手冊 PDF"] --> CL["抽取法規警語 clause"]
  CL --> EX{"與基準字面完全相同?"}
  EX -->|是| PASS["fast-pass 直接通過"]
  EX -->|否| LLM["LLM 語意判讀|structured JSON + cached + 可稽核"]
  LLM --> CMP{"與規則 / lexical 一致?"}
  CMP -->|一致| OK["判定一致"]
  CMP -->|衝突| NR["NEEDS_REVIEW|交人工確認"]

關鍵設計決策(含取捨)

決策選了什麼否決的替代為什麼
問題本質認定是語意判讀當成字串相似度問題否決:換句話說一下,字面相似度就失準了
AI 角色LLM 當裁判,但綁護欄讓 LLM 全權判定、直接放行否決:查不到來龍去脈的判斷,不能拿來做合規
輸出形式固定 structured JSON + 依內容快取自由文字回覆否決:格式一漂移,判斷就忽前忽後、難驗證
衝突處理與規則衝突 → NEEDS_REVIEW 人工以 LLM 為準自動放行否決:合規這種事,不容許「AI 說了算」

代表性技術證據

快速放行 + 受控裁判(pseudo-code,示意)

def adjudicate(clause, baseline):
    if clause.text == baseline.text:          # 1. 一字不差 → 直接放行,別浪費 LLM
        return "PASS"
    verdict = llm_judge(                       # 2. 不然才交給 LLM 判語意
        clause, baseline,
        response_format="json",                #    回傳鎖死成 structured JSON
        cache_key=content_hash(clause, baseline),  # 照內容快取,同一題重跑結果一樣
    )
    audit.log(prompt_version, model_id, verdict.raw)  # 3. 整段過程都留得下來、查得到
    if verdict.semantic != lexical_score(clause, baseline).agree:
        return "NEEDS_REVIEW"                  # 4. 跟規則打架 → 不自己決定,退回人工
    return verdict.semantic

固定回傳欄位(示意):{ "equivalent": true, "reason": "...", "confidence": 0.93 },缺欄即視為失敗,不放行。

踩過的坑

欄位內容
症狀同一條 clause、不同次執行,判斷結果不一致
初判(猜錯)第一個念頭是來源 clause 的內容變了
驗證比對稽核裡的 raw JSON,發現是 LLM 回覆的措辭 / 格式在漂移
根因prompt 沒有結構約束、沒有快取,每次自由發揮
修法鎖 structured JSON、依內容 hash 快取、記錄 prompt 版本與 model id
預防加「同輸入重跑結果一致」的測試,漂移即失敗

驗證方式

  • 一致性:同一輸入重跑,判斷與快取一致(不漂移)。
  • 可追溯:每筆判斷都能從稽核還原 prompt 版本、model、原始回覆。
  • 護欄:LLM 與規則衝突時一定進 NEEDS_REVIEW,不自動放行。
  • 驗收標準:字面相同必 fast-pass;同義改寫不被誤判為不合規;衝突一律人工。

可複製 SOP:讓 AI 做可信的判斷

適用情境:要 AI 判斷「兩段內容意思是否一致」這類語意問題,且結果需可信、可追溯。

不適用情境:純機械比對(字面、數值)就足夠時,不需要 LLM。

前置條件

  • 一個權威基準(這裡是法規警語基準)。
  • 稽核儲存:能保存每次判斷的 prompt 版本、model、原始回覆。

步驟

  1. 先機械、後語意:能用字面 / 規則快速判掉的先判掉,省成本,也少讓 AI 插手。
  2. 鎖輸出格式:LLM 只准回固定欄位的 structured JSON,少一欄就算失敗。
  3. 依內容快取:拿內容 hash 當 key,同一題進來,結果每次都一樣、重現得出來。
  4. 全程稽核:記 prompt 版本、model id、raw 回覆。
  5. 衝突退人工:LLM 跟規則不一致 → 丟 NEEDS_REVIEW 給人,而且留一個能切回舊做法的開關。

停損點

  • 同輸入重跑結果不一致 → 停,先補快取 / 結構約束。
  • 無法稽核某筆判斷 → 停,不可用於合規。

驗收標準

  • fast-pass、語意判讀、衝突退人工三條路徑都可驗證;判斷可重現、可追溯。

回滾:以 feature flag 切回純規則 / 人工流程,不影響既有合規檢查。

可複製到:任何「需要 AI 判斷語意、但結果要能被審計」的場景。

決策回放(三個月後回讀用)

  • 背景:手冊法規警語人工逐字比對成本高,純字面比對又因同義改寫失準。
  • 限制:合規判斷必須可追溯、可退回人工;不可外流真實手冊內容與產品名。
  • 考慮過但放棄:讓 LLM 直接取代規則引擎、自動放行——被「查不到來龍去脈」否決。
  • 證據:structured JSON 約束、內容 hash 快取、prompt/model 稽核、NEEDS_REVIEW 路徑。
  • 未解:人工覆核的人力到哪、分流門檻怎麼抓;還有不同法規版本的基準要怎麼維護。

作者備註: 合規這種事,「AI 判得準」其實只是最低標;真正能讓你晚上睡得著的,是「萬一判錯,你查得到、也攔得住」。所以我盯的從來不是模型多強,是護欄夠不夠牢。