專案

一般

配置概況

動作

Fix #290

進行中
SC SC

ICD-10 faceted pipeline 修正 — 側別過度編碼、傷情漏抓/幻覺、候選過窄

Fix #290: ICD-10 faceted pipeline 修正 — 側別過度編碼、傷情漏抓/幻覺、候選過窄

是由 Sashiba Chou約 1 個月 前加入.

狀態:
New
優先權:
Normal
被分派者:
開始日期:
2026-06-19
完成日期:
2026-06-19 (逾期 43 天)
完成比例:

100%

預估工時:
1:00 小時

概述

摘要

修正 #289 faceted pipeline 上線後使用者回報的 4 類系統性問題,並擴充回歸測試。全部仍在 ICD_PIPELINE=faceted 旗標下,legacy 路徑不受影響。

問題來源資料 docs/icd10_feedback_2026-06-16.json 已於 #289 提交,本 ticket 僅引用、不重複提交。

背景 / 問題

#289 上線後新回饋顯示 4 類錯誤:

  • A 側別過度編碼:病歷未述左右(「Chest: Contusion」),top1 卻給「左側/雙側前胸壁」。
  • B 傷情漏抓:同部位多傷型(頸部 abrasion + contusion)漏一個;上背挫傷整筆消失。
  • C 幻覺傷情:火灼傷左手掌,Stage1 無中生有一筆「前臂撕裂傷」。
  • D 候選過窄:右小腿玻璃傷口只回單一穿刺傷碼,過於侷限。

變更內容

後端核心 backend/rag_service.py

  • C 禁幻覺STAGE1_FACETED_PROMPT 加硬約束「僅抽病歷明載傷情、禁止臆測」,並附反例。
  • B-1 提高召回:同 prompt 加「逐行掃 Physical Examination 與機轉、同部位多傷型各列一筆」。
  • B-2 key 防撞predict_icd10_faceted 候選/排名改用唯一 key(同 raw_text 加序號),杜絕同名傷情互相覆蓋消失。
  • A 側別降權faceted_search 候選帶入 laterality;Stage1 側別為 unspecified 時,將具體左右/雙側碼降權、unspecified 碼拉前(與深層降權合併為複合穩定排序,非硬切)。
  • D 候選補滿/放寬重構faceted_search 改 soft/hard 兩段放寬——soft(維持同傷型+部位,放寬異物/側別)跨層累積補滿到 min_fill=3;hard(跨部位/跨傷型)僅在 soft 為 0 時保底。避免清楚傷情被塞入不相關碼(外在狹窄、肛門撕裂),同時讓通稱傷口能撈到同部位其他傷型作備選。

離線原型 backend/scripts/faceted_search_proto.py

  • 同步 A(側別降權)與 D(soft/hard 放寬補滿)邏輯,與線上 faceted_search 對齊,避免漂移。

Benchmark backend/benchmark/run_benchmark.py

  • --bench 參數(指定測試檔)。
  • 新增斷言類型:forbid_injury_extracted(驗 C)、expect_injuries_extracted(驗 B)、expect_min_candidates(驗 D)。

新增測試集 / 工具

  • backend/benchmark/icd10_benchmark_2026-06-16.json:5 個新反例(A/B/C/D)回歸測試集。
  • backend/scripts/proto_icd10_autotest.py / _v2.py / _v3.py:反向生題自動測試原型(從 ICD 參考倒推題目 + 家族層級評分),用於大範圍覆蓋與缺口偵測。

驗證結果(live,OpenAI)

Benchmark 結果
離線檢索層(21 斷言) 21/21
原始回歸 icd10_benchmark.json(24 斷言) 24/24(無回歸)
新反例 icd10_benchmark_2026-06-16.json(14 斷言) 14/14
反向生題抽樣(35 條代表碼) top1 命中 100%

已知後續(本 ticket 不含)

  • facet 脊椎歸類瑕疵:頸椎 S12 有 64/71 被標成 back(應為 neck)、胸椎/薦椎部位分裂。修正需改 facet 資料並重建向量庫,另案處理。
  • A 更細收斂(未述部位時優先選最 unspecified 碼):待評估。

風險 / 回滾

  • 全程在 ICD_PIPELINE=faceted 旗標下,legacy 路徑零改動。
  • 改動集中於 Stage1 prompt 與 faceted_search 排序/放寬邏輯,未動向量庫與資料(無需重建)。

擬納入此 commit 的檔案

  • M backend/rag_service.py
  • M backend/benchmark/run_benchmark.py
  • M backend/scripts/faceted_search_proto.py
  • A backend/benchmark/icd10_benchmark_2026-06-16.json
  • A backend/scripts/proto_icd10_autotest.py
  • A backend/scripts/proto_icd10_autotest_v2.py
  • A backend/scripts/proto_icd10_autotest_v3.py

(排除既有 scratch:scripts/test_faceted_query.py、scripts/validate_facets_sample.py、debug_icd10_output.md)

沒有任何資料可供顯示

動作

匯出至 PDF Atom