動作
Feature #152
已結束
SC
SC
實作 RAG-based ICD-10 編碼系統並優化急診編碼規則
Feature #152:
實作 RAG-based ICD-10 編碼系統並優化急診編碼規則
概述
重構 ICD-10 預測功能:導入 RAG 架構與急診編碼規則
將原本直接使用 LLM 的 ICD-10 預測功能,重構為 RAG (Retrieval-Augmented Generation) 架構,並加入急診室專用的編碼規則,大幅提升編碼準確性。
變更內容
- 新增 RAG 服務 (backend/rag_service.py)
實作三階段 RAG Pipeline:
- Extract: LLM 從創傷筆記提取各項傷害描述
- Search: ChromaDB 向量搜索找出候選 ICD-10 代碼 (top 30)
- Rank: LLM 根據 ER Coding Rules 篩選並排名
- 向量資料庫整合
- 使用 ChromaDB 作為持久化向量資料庫
- 使用 Sentence Transformers (
paraphrase-multilingual-MiniLM-L12-v2) 進行多語言向量嵌入 - 已建立索引包含 73,681 個 ICD-10 代碼
- ER Coding Rules 實作
新增急診室專用編碼規則,確保輸出符合臨床情境:
| 規則 | 說明 |
|---|---|
| Rule 1 | 強制使用 A 結尾代碼 (Initial encounter),禁止 D (Subsequent) 和 S (Sequela) |
| Rule 2 | 若未提及異物,優先選擇 "without foreign body" 代碼 |
| Rule 3 | 正確匹配側別 (左/右/未明示) |
| Rule 4 | 每項傷害提供 3 個候選代碼,含信心分級 (high/medium/low) |
- API Response 格式更新
{
"predictions": [
{
"injury_source_text": "laceration on left forearm",
"candidates": [
{
"code": "S51.812A",
"description_zh": "...",
"confidence": "high"
},
{
"code": "S41.112A",
"description_zh": "...",
"confidence": "medium"
},
{
"code": "S61.512A",
"description_zh": "...",
"confidence": "low"
}
]
}
]
}
- 候選代碼過濾機制
新增_filter_candidates_by_rules()函數,在 fallback 時自動過濾:
- D/S 結尾的代碼
- "with foreign body" 代碼(除非文本明確提及異物)
檔案變更
| 檔案 | 狀態 | 說明 |
|---|---|---|
backend/rag_service.py |
新增 | RAG 服務核心邏輯 |
backend/main.py |
修改 | 整合 RAG 服務、更新 Pydantic 模型 |
backend/requirements.txt |
修改 | 新增 chromadb, sentence-transformers, pandas |
backend/chroma_db/ |
新增 | 向量資料庫儲存目錄 |
reference/icd10_clean.csv |
新增 | ICD-10 代碼資料來源 |
新增依賴
chromadb>=0.4.0
sentence-transformers>=2.2.0
pandas>=2.0.0
測試結果
輸入:
"Patient presents with a 3cm laceration on the left forearm and contusion on the right knee after a fall."
輸出:
- ✅ S51.812A - 左側前臂撕裂傷未伴有異物之初期照護
- ✅ S80.01XA - 右側膝部挫傷之初期照護
相關 Issue¶
- 解決:RAG 結果過於具體的問題(如隨機選擇 "with foreign body" 或 "subsequent encounter")
動作