動作
Fix #290
進行中
SC
SC
ICD-10 faceted pipeline 修正 — 側別過度編碼、傷情漏抓/幻覺、候選過窄
Fix #290:
ICD-10 faceted pipeline 修正 — 側別過度編碼、傷情漏抓/幻覺、候選過窄
開始日期:
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)
沒有任何資料可供顯示
動作