專案

一般

配置概況

動作

Feature #153

進行中
SC SC

優化 RAG Pipeline 減少 LLM 調用次數

Feature #153: 優化 RAG Pipeline 減少 LLM 調用次數

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

狀態:
New
優先權:
Normal
被分派者:
開始日期:
2026-02-04
完成日期:
完成比例:

0%

預估工時:
4:00 小時

概述

目前 ICD-10 RAG Pipeline 每次查詢會調用 LLM 1 + N 次(N = 傷害數量):

  • 1 次:提取傷害 (Extract)
  • N 次:排名候選碼 (Rank),每個傷害各一次

當病歷包含多個傷害時,LLM 調用次數會線性增加,嚴重影響回應速度和資源消耗。


h1. 1. 現況分析

目前流程(以 2 個傷害為例):


┌─────────────────────────────────────────────────────┐
│ Step 1: Extract (LLM #1)                            │
│   輸入: 病歷全文                                     │
│   輸出: ["傷害1", "傷害2"]                           │
└──────────────────────────┬──────────────────────────┘
                           │
             ┌─────────────┴─────────────┐
             ▼                           ▼
┌──────────────────────────┐  ┌──────────────────────────┐
│ Step 2-4 for 傷害1:      │  │ Step 2-4 for 傷害2:      │
│ Search → Filter → Rank   │  │ Search → Filter → Rank   │
│ (LLM #2)                 │  │ (LLM #3)                 │
└──────────────────────────┘  └──────────────────────────┘

總計: 3 次 LLM 調用


h1. 2. 優化方案

h2. * 方案 A:合併 Rank 調用(推薦)

將所有傷害的候選碼合併,一次性讓 LLM 進行排名。

優化後流程:


┌─────────────────────────────────────────────────────┐
│ Step 1: Extract (LLM #1)                            │
│   輸出: ["傷害1", "傷害2"]                          │
└──────────────────────────┬──────────────────────────┘
                           │
             ┌─────────────┴─────────────┐
             ▼                           ▼
┌──────────────────────────┐  ┌──────────────────────────┐
│ Step 2-3 for 傷害1:      │  │ Step 2-3 for 傷害2:      │
│ Search + Filter (無 LLM) │  │ Search + Filter (無 LLM) │
└──────────────────────────┴──┬───────────────────────┬──┘
                              │ (匯總候選資料)        │
                              ▼                       ▼
┌─────────────────────────────────────────────────────┐
│ Step 4: Batch Rank (LLM #2)                         │
│   一次性排名所有傷害的候選碼                        │
└─────────────────────────────────────────────────────┘

總計: 2 次 LLM 調用(固定)

  • 優點:LLM 調用次數固定為 2 次,不受傷害數量影響。
  • 缺點:單次 prompt 較長,需注意 context window token 限制。

h2. * 方案 B:合併 Extract + Rank

將提取和排名合併為單一 LLM 調用。

極簡流程:


┌─────────────────────────────────────────────────────┐
│ Step 1: Extract + Search + Filter (無 LLM)          │
│   - 使用 NER (命名實體識別) 或規則提取傷害          │
│   - 向量搜索 + 過濾                                 │
├─────────────────────────────────────────────────────┤
│ Step 2: Rank ALL (LLM #1)                           │
│   一次性處理所有傷害                                │
└─────────────────────────────────────────────────────┘

總計: 1 次 LLM 調用

  • 優點:最少 LLM 調用次數。
  • 缺點:傷害提取準確度可能大幅下降(依賴非 LLM 的提取能力)。

h2. * 方案 C:並行調用 (Async)

維持現有架構,但使用 asyncio 並行調用 LLM。

  • 優點:不改變邏輯,減少總等待時間 (Latency)。
  • 缺點:LLM 調用次數不變 (Cost 不變),僅優化使用者等待時間。

h1. 3. 預期效益比較

方案 LLM 調用次數 複雜度 準確度影響
現況 1 + N - -
方案 A (推薦) 2 (固定)
方案 B 1 (固定)
方案 C 1 + N

相關檔案

  • backend/rag_service.py
    • 修改目標函數: extract_injuries(), rank_candidates()

沒有任何資料可供顯示

動作

匯出至 PDF Atom