Doctor 專案改進建議 — 基於 7 個同領域專案的綜合比較分析
本文基於 8 個 GitHub 專案的完整教學分析,提出 Doctor 專案的系統性改進方案。
1. 現狀診斷:Doctor 的定位與核心問題
1.1 Doctor 做了什麼
Doctor 是一個 Streamlit + Google Gemini 的醫病角色扮演模擬器。核心概念:
- 9 步 system prompt (系統提示詞) 驅動的「臨床博弈引擎」
- 心理防禦指標(SAI 主導權感知、MF 面具疲勞度、B-D 邊界防禦)
<clinical_engine>內部推演 +<doctor_output>外部演繹的雙層輸出
1.2 核心問題(5 大缺失)
| # | 問題 | 影響 | 嚴重度 |
|---|---|---|---|
| 1 | 無醫療資料庫整合 | 所有「臨床推理」全靠 LLM 幻覺 (hallucination),無法查詢真實藥物、疾病、指引 | 🔴 致命 |
| 2 | 無實證醫學 (EBM; Evidence-Based Medicine) 支撐 | 鑑別診斷 (differential diagnosis) 缺乏統計依據,純靠 LLM 生成 | 🔴 致命 |
| 3 | 無知識檢索 (RAG; Retrieval-Augmented Generation) | 無法查詢教科書、臨床指引、藥物交互作用資料庫 | 🔴 致命 |
| 4 | 單一 LLM 呼叫架構 | 無法路由到專科 agent、無法分工協作 | 🟡 嚴重 |
| 5 | 無持久化記憶 | 多輪對話依賴 session_state,無跨 session 病歷管理 | 🟡 嚴重 |
1.3 Doctor 的亮點(值得保留)
- ✅ Doubt-Driven 懷疑度標籤化:每個診斷標籤綁定 0-100% 懷疑度,概念有價值
- ✅ 反向鑑別搜索:當懷疑度 > 60% 時強制啟動互斥搜索,防止 confirmation bias (確認偏誤)
- ✅ 心理防禦指標儀表板:SAI/MF/B-D 三維度即時監控,UX 設計有特色
- ✅ 對話節奏控制:一次只問一個問題、一次只提一項檢查的限制合理
- ✅ 雙層輸出結構:
<clinical_engine>內部推演 +<doctor_output>外部呈現的分離
2. 七個對照專案的關鍵啟示
2.1 專案對照矩陣
| 維度 | Doctor | HealthRex/CDSS | MediGenius | MedAgentBench | multi-agent-system | MedicalAI-Platform | MIMIC_RL_COACH | Drug-Interaction |
|---|---|---|---|---|---|---|---|---|
| ⭐ | 0 | 119 | 33 | 279 | 74 | 53 | 40 | 8 |
| 醫療 DB 整合 | ❌ 無 | ✅ STRIDE/STARR | ⚠️ PDF RAG | ✅ FHIR R4 | ✅ GraphRAG + FHIR | ⚠️ Gemini only | ✅ MIMIC-III | ❌ 無 |
| 推理方式 | 純 prompt | 統計共現 + ML | LangGraph agent | FHIR API agent | LangGraph + GraphRAG | prompt-as-agent | RL (DDQN-BCQ) | 純 prompt |
| 多 agent | ❌ 單一 | ❌ 模組化 | ✅ 8 node | ✅ HTTPAgent | ✅ 5 agent pipeline | ⚠️ 偽多 agent | ❌ 單一 | ❌ 單一 |
| 可解釋性 | ⚠️ LLM 生成 | ✅ 統計量追溯 | ⚠️ RAG citation | ✅ API 呼叫追蹤 | ✅ 決策鏈可追溯 | ⚠️ LLM 生成 | ✅ Q-value | ❌ 無 |
| 安全合規 | ❌ 無 | ✅ PHI 保護 | ❌ 無 HIPAA | ✅ POST 不執行 | ✅ HIPAA 設計 | ⚠️ 基本 auth | ⚠️ 研究用 | ❌ 無 |
| 即時處置 | ❌ | ⚠️ 建議性 | ⚠️ 建議性 | ⚠️ benchmark | ✅ 處方 + 審方 | ⚠️ 建議性 | ✅ 治療決策 | ⚠️ DDI 檢查 |
2.2 每個專案教會我們的一件事
| 專案 | 核心啟示 | 對 Doctor 的啟發 |
|---|---|---|
| HealthRex/CDSS | 臨床推薦用共現統計 + 貝氏條件頻率,不用深度學習——因為臨床需要可解釋性 | Doctor 的鑑別診斷應有統計依據,不能純靠 LLM |
| MediGenius | LangGraph 把「醫療對話」拆成 8 個專責 agent (intake → router → RAG → tools → memory → synthesis) | Doctor 的 9 步推演應拆成多個 agent,不是一個 prompt |
| MedAgentBench | 醫療 agent 必須能操作 EHR (Electronic Health Record; 電子病歷)——讀取、寫入、查詢、決策 | Doctor 需要 FHIR 介面連接真實臨床資料 |
| multi-agent-system | 企業級 CDSS 需要 5 agent pipeline (問診 → 診斷 → 治療 → 編碼 → 審核) + HIPAA | Doctor 應有完整問診到處方的 pipeline |
| MedicalAI-Platform | 多模態 (文字 + 影像 + DICOM) 是真實臨床場景的必要能力 | Doctor 未來應支援影像輸入(X-ray, CT) |
| MIMIC_RL_COACH | 敗血症 (sepsis) 治療用 RL 從真實 ICU 數據學習最佳處置策略 | 高危急症的即時處置需要從真實數據學習,不能靠 LLM 猜 |
| Drug-Interaction | 藥物交互作用檢查是反面教材——純 LLM 做 DDI (Drug-Drug Interaction) 不可靠 | Doctor 開處方建議時必須查 DrugBank/RxNorm,不能靠 LLM |
3. 改進方案:從 Prompt Engine 到 Clinical Intelligence Platform
3.1 改進架構總覽
graph TB
subgraph "Layer 1: 使用者介面"
UI[Streamlit UI
保留 Doctor 的儀表板設計]
DICOM[DICOM Viewer
影像檢視]
end
subgraph "Layer 2: Agent 編排 (LangGraph)"
Router[Router Agent
分診路由]
Intake[Intake Agent
問診採集]
Diagnosis[Diagnosis Agent
鑑別診斷]
Treatment[Treatment Agent
治療方案]
Audit[Audit Agent
安全審核]
Psychology[Psychology Agent
保留 Doctor 的 SAI/MF/B-D]
end
subgraph "Layer 3: 知識工具層"
PubMed[PubMed API
文獻檢索]
DrugDB[DrugBank/RxNorm
藥物資料庫]
Guidelines[臨床指引 RAG
UpToDate/急診教科書]
DDI[DDI Checker
藥物交互作用]
Lab[Lab Reference
檢驗參考值]
FHIR[FHIR R4
EHR 介面]
end
subgraph "Layer 4: 資料與記憶"
VectorDB[ChromaDB/FAISS
向量資料庫]
SQLite[SQLite
病歷記憶]
KG[Knowledge Graph
Neo4j 醫學圖譜]
end
UI --> Router
DICOM --> Router
Router --> Intake
Router --> Diagnosis
Router --> Treatment
Router --> Psychology
Intake --> Diagnosis
Diagnosis --> Treatment
Treatment --> Audit
Diagnosis --> PubMed
Diagnosis --> Guidelines
Treatment --> DrugDB
Treatment --> DDI
Treatment --> Lab
Audit --> FHIR
Guidelines --> VectorDB
Psychology --> SQLite
KG --> Diagnosis
3.2 六大改進模組
模組 A:醫療知識工具層(最高優先)
解決問題: Doctor 完全沒有醫療資料庫整合
| 工具 | 用途 | API / 資料來源 | 整合方式 |
|---|---|---|---|
| PubMed 檢索 | 查詢最新文獻支持診斷 | NCBI E-utilities API | LangChain PubMed Tool |
| DrugBank / RxNorm | 藥物資訊、適應症、劑量 | DrugBank API / RxNorm REST | Function calling |
| DDI 檢查器 | 藥物交互作用即時檢查 | DDInter / SIDER / ChEMBL | 結構化查詢 > LLM |
| 臨床指引 RAG | 急診處置指引、疾病教科書 | PDF → ChromaDB embedding | RAG retrieval |
| 檢驗參考值 | 正常值範圍 + 異常判讀 | LOINC code + 自建 JSON | 確定性查詢(非 LLM) |
| FHIR R4 | 病歷讀寫標準介面 | HAPI FHIR / SmileCDR | RESTful CRUD |
關鍵設計原則(借鑑 HealthRex/CDSS + Drug-Interaction 教訓):
- 結構化資料庫查詢 > LLM 猜測(DDI、藥物劑量、檢驗正常值必須用 DB)
- LLM 只做自然語言合成和推理,不做資料查找
- 每個推薦必須附帶來源引用(PubMed ID / 指引章節)
模組 B:Multi-Agent 架構(借鑑 MediGenius + multi-agent-system)
解決問題: Doctor 的 9 步推演壓在一個 system prompt 裡
1現在(Doctor):
2 User Input → [1 個巨大 System Prompt, 9 步推演] → Output
3
4改進後:
5 User Input → Router Agent
6 ├→ Intake Agent (問診採集, 結構化症狀)
7 ├→ Diagnosis Agent (鑑別診斷 + 知識工具查詢)
8 ├→ Treatment Agent (治療方案 + DDI 檢查 + 指引依據)
9 ├→ Psychology Agent (SAI/MF/B-D, 保留 Doctor 特色)
10 └→ Audit Agent (安全審核 + HIPAA 合規)
技術選型: LangGraph(借鑑 MediGenius 和 multi-agent-system 的驗證)
模組 C:臨床知識 RAG(借鑑 MediGenius)
解決問題: 無急診教科書、疾病教科書資料
| 知識來源 | 格式 | RAG 策略 |
|---|---|---|
| 急診醫學教科書(Tintinalli’s / Roberts & Hedges) | PDF → chunked embeddings | Semantic search + reranking |
| 臨床指引(AHA/IDSA/NICE guidelines) | PDF / HTML → structured extraction | Hybrid: keyword + semantic |
| 醫院常見參數表(vital signs, NEWS2 score, qSOFA) | JSON / CSV | 確定性查詢(不走 LLM) |
| 感染症處置指引(Sanford Guide) | PDF → embedding | RAG with citation |
Embedding 策略(借鑑 MediGenius):
- Chunk size: 512 tokens, overlap: 128
- Embedding model:
text-embedding-3-small或pubmedbert - Vector store: ChromaDB(本地優先,隱私考量)
模組 D:感染 + 即時處置判斷(借鑑 MIMIC_RL_COACH)
解決問題: 無法做敗血症等感染的即時處置判斷
| 功能 | 實作方式 | 來源 |
|---|---|---|
| qSOFA score 自動計算 | Rule-based(GCS + SBP + RR) | 確定性規則 |
| NEWS2 score | Rule-based(6 參數加權) | NHS 標準 |
| 敗血症 bundle 提醒 | 觸發條件 → 標準處置清單 | Surviving Sepsis Guidelines |
| 抗生素建議 | RAG → Sanford Guide + 院內 antibiogram | 結構化查詢 + LLM 合成 |
| 即時介入優先序 | Decision tree + 嚴重度分級 | 急診分級標準 (TTAS/ESI) |
模組 E:持久化病歷管理(借鑑 MediGenius + MedAgentBench)
解決問題: Doctor 的 session_state 重開就消失
1# 借鑑 MediGenius 的 SQLite 記憶
2class PatientMemory:
3 def __init__(self, db_path="patient_records.db"):
4 self.conn = sqlite3.connect(db_path)
5 self.create_tables()
6
7 def save_encounter(self, patient_id, encounter_data):
8 # SOAP note 結構化存儲
9 # S: Subjective (主訴)
10 # O: Objective (理學檢查 + 檢驗數據)
11 # A: Assessment (評估 + 鑑別診斷)
12 # P: Plan (治療計畫)
13 ...
模組 F:安全合規層(借鑑 multi-agent-system + MedAgentBench)
| 安全面向 | 現狀 | 改進 |
|---|---|---|
| API key 管理 | 硬編碼 + Streamlit input | .env + Secrets Manager |
| 輸入驗證 | 無 | Prompt injection 防護 |
| 醫療免責聲明 | 無 | 每次輸出附帶免責 + 就醫建議 |
| PHI 保護 | 無 | 去識別化 + 本地優先 |
| 審計軌跡 | 無 | 每次決策記錄 + 可追溯 |
4. 實施路線圖
Phase 1:基礎強化(1-2 週)
| 優先序 | 工作項 | 複雜度 |
|---|---|---|
| P0 | 加入 PubMed API 工具(LangChain PubMedQueryRun) | 低 |
| P0 | 加入 DrugBank / RxNorm 藥物查詢 | 中 |
| P0 | 加入 DDI 檢查(DDInter API) | 中 |
| P1 | 將 9 步 prompt 拆成 LangGraph 多 agent | 中 |
| P1 | 加入 SQLite 病歷持久化 | 低 |
| P1 | 加入醫療免責聲明 + API key 安全化 | 低 |
Phase 2:知識 RAG(2-4 週)
| 工作項 | 複雜度 |
|---|---|
| 建立 ChromaDB 向量資料庫 | 中 |
| 匯入急診教科書 / 臨床指引 PDF | 中 |
| 建立 RAG retrieval pipeline | 中 |
| 加入檢驗參考值 JSON(LOINC-based) | 低 |
| 加入 qSOFA / NEWS2 自動計算 | 低 |
Phase 3:進階功能(4-8 週)
| 工作項 | 複雜度 |
|---|---|
| 醫學知識圖譜(Neo4j + 疾病-症狀-藥物關係) | 高 |
| FHIR R4 EHR 介面 | 高 |
| 多模態支援(影像 + DICOM) | 高 |
| 敗血症 / 感染即時處置模組 | 中 |
| HIPAA 合規審計軌跡 | 中 |
5. 保留 Doctor 的核心特色
改進不是拋棄 Doctor 的設計——以下特色值得保留並強化:
| Doctor 特色 | 保留方式 | 強化方向 |
|---|---|---|
| Doubt-Driven 懷疑度 | 作為 Diagnosis Agent 的核心指標 | 用統計數據(共現頻率)輔助懷疑度計算 |
| 反向鑑別搜索 | 保留 > 60% 觸發機制 | 加入 PubMed 文獻交叉驗證 |
| SAI/MF/B-D 心理指標 | 獨立 Psychology Agent | 加入真實醫病溝通研究的指標校準 |
| 對話節奏控制 | 保留一問一檢限制 | 加入教學模式(可解除限制觀察完整推理) |
| 雙層輸出結構 | 保留 clinical_engine / doctor_output 分離 | 讓每個 agent 都有內部推演 + 外部呈現 |
6. 技術選型建議
| 類別 | 推薦 | 替代方案 | 理由 |
|---|---|---|---|
| LLM | Google Gemini(現有)+ Claude API | OpenAI GPT-4o | Gemini 已整合,Claude 用於審核 |
| Agent 框架 | LangGraph | CrewAI / AutoGen | MediGenius + multi-agent-system 驗證 |
| 向量 DB | ChromaDB | FAISS / Weaviate | 本地輕量、隱私友善 |
| 知識圖譜 | Neo4j | NetworkX (小規模) | 醫學關係圖查詢 |
| 病歷存儲 | SQLite → PostgreSQL | MongoDB | 結構化醫療記錄 |
| 前端 | Streamlit(現有) | Next.js + React | 原型階段保留 Streamlit |
7. 總結:從玩具到工具的三步跨越
1Step 1: 加入知識工具層(PubMed + DrugBank + DDI + 指引 RAG)
2 → 從「LLM 猜測」升級為「查詢 + 推理」
3
4Step 2: 拆成多 Agent(LangGraph pipeline: 問診 → 診斷 → 治療 → 審核)
5 → 從「一個大 prompt」升級為「專責分工」
6
7Step 3: 加入真實資料(FHIR EHR + 知識圖譜 + 感染即時處置)
8 → 從「模擬器」升級為「臨床決策支援系統」
Doctor 的 Doubt-Driven 概念和心理防禦指標是有特色的創新設計。問題不在概念,而在缺乏支撐這些概念的資料基礎設施。加上知識工具層和多 agent 架構後,這個專案有潛力成為一個真正實用的臨床決策支援系統。
Comments