在保險理賠自動化與醫療申報系統的開發中,最令後端工程師頭痛的痛點之一,就是各家醫療院所的「醫療收據項目命名並無統一標準」。
以最常見的**「藥費」**為例:
- 台大醫院 收據上顯示為:
藥費 - 馬偕醫院 收據上顯示為:
藥品費 - 耕莘醫院 收據上顯示為:
西藥費
在實務上,後端系統必須將這些五花八門的異質名稱,精確對齊到保險核心系統標準的「100+ 項核心收費項目代碼」(例如:統一對齊到 016 藥費)。
傳統的做法是寫幾百行 Regular Expression (Regex) 正則表達式,或者維護一張極為龐大的資料庫 SQL 關鍵字對照表(CASE WHEN ... LIKE ...)。然而,當對接的醫院數量變多、名稱稍微變動或有錯字時,這種硬刻規則的方式高度依賴人工維護,隨著資料來源增加,容易產生規則衝突,也會使後續維護成本快速上升。這篇我們分享如何利用 AI Embedding 模型 計算語意向量相似度,實現自動化、具備容錯力的項目對齊。
核心概念:Embedding 向量相似度計算
用 Embedding 對齊項目的思路,是將文字從「字面比對」升級為「語意距離計算」,主要分為三個核心步驟:
語意向量對齊三步驟
- 文字向量化 (Embedding):利用預訓練的 Text Embedding 模型,將輸入的「異質收費項目名稱」與系統的「標準項目名稱」,分別轉換成高維度的語意向量(例如一個包含 768 或 1536 個浮點數的陣列)。
- 相似度計算 (Cosine Similarity):利用幾何學上的「餘弦相似度」公式,計算這兩個高維向量在空間中的夾角餘弦值,數值愈接近 1 代表語意愈相似。
- 自動映射對齊:系統將輸入項目的向量與標準項目資料庫進行比對,自動推薦或直接映射到相似度得分最高的標準項目(如:自動將「西藥費」對齊至「016 藥費」)。
數學原理:餘弦相似度 (Cosine Similarity)
餘弦相似度是計算兩個向量在方向上相似程度的經典幾何指標。給定異質項目向量 $\mathbf{A}$ 與標準項目向量 $\mathbf{B}$,其餘弦相似度計算公式如下:
$$\text{Cosine Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\Vert{}\mathbf{A}\Vert{} \Vert{}\mathbf{B}\Vert{}} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}$$
這個公式的巧妙之處在於,它不受字串長度的工作影響,只專注於向量在高維語意空間中的指向方向。即使兩個詞字面完全不同(如「西藥費」與「藥品費」),只要在模型訓練中它們的上下文含意相近,計算出來的相似度依然會非常高(通常 > 0.85)。
Python 程式碼實作與測試結果
以下我們使用 sentence-transformers 套件,搭配適合繁體中文語意的輕量模型,來實作這套對齊管線:
import numpy as np
from sentence_transformers import SentenceTransformer
# 1. 載入支援繁體中文的高效語意向量模型
# 在地端執行時會自動下載並載入此輕量化模型
model = SentenceTransformer('intfloat/multilingual-e5-base')
# 2. 定義系統內核心標準收費項目 (我們想對齊的目標)
standard_items = [
"004 診察費",
"015 檢驗費",
"016 藥費",
"017 注射處置費",
"018 病房費",
"019 膳食費"
]
# 預先計算標準項目的向量 (Production 環境中可存入向量資料庫或記憶體快取中)
standard_embeddings = model.encode(standard_items)
# 3. 定義各家醫院收據上可能出現的異質收費項目
raw_hospital_inputs = [
"台大醫院: 藥費",
"馬偕醫院: 藥品費",
"耕莘醫院: 西藥費",
"住院膳食費用",
"常規血液檢驗費",
"雙人病房差額"
]
def cosine_similarity(v1, v2):
# 計算兩個向量的餘弦相似度
dot_product = np.dot(v1, v2)
norm_v1 = np.linalg.norm(v1)
norm_v2 = np.linalg.norm(v2)
return dot_product / (norm_v1 * norm_v2)
# 4. 進行語意對齊匹配
print("=== 異質醫療項目向量對齊結果 ===")
for raw_text in raw_hospital_inputs:
# 去除醫院字樣,只保留項目名稱進行 Embedding 運算
clean_text = raw_text.split(":")[-1].strip()
input_embedding = model.encode(clean_text)
best_score = -1.0
matched_standard = None
# 與所有的標準項目向量計算相似度
for std_item, std_emb in zip(standard_items, standard_embeddings):
score = cosine_similarity(input_embedding, std_emb)
if score > best_score:
best_score = score
matched_standard = std_item
print(f"原始輸入: 【{raw_text}】")
print(f" -> 語意自動對齊: 【{matched_standard}】 (相似度得分: {best_score:.4f})")
print("-" * 50)
生產環境落地避坑指南
雖然向量語意對齊非常強大,但在商用環境落地時,我們建議搭配以下策略以確保系統穩定性:
- 慎選 Embedding 模型:若使用過於輕量或非中文原生的模型,處理短字串時常會因為缺乏上下文而導致相似度失準。
- 設定門檻值閥值 (Threshold filtering):在實際專案中,應設定相似度門檻值(實際門檻值應根據驗證資料集與實際錯誤成本進行調整。)。若最高得分依然低於此數值,代表可能出現了全新的收費科目,系統應引導至人工進行覆核判定,而非強行映射,以避免帳目出錯。
- 使用向量資料庫加速:若您的標準項目多達數千項,每次即時計算餘弦相似度會造成 CPU 負擔。也可以使用如 Milvus, Qdrant 等向量資料庫 (Vector Database) 進行快速的索引與相似度近鄰檢索 (ANN Search)。
- 預先向量化與快取:標準項目的 Embedding 向量通常是靜態不變的,建議在系統啟動時一次性計算並常駐於記憶體中,運行時只需對輸入的字串進行單次 Embedding 運算即可。
如果您正尋求高精度、高安全性的企業級文檔處理解決方案,歡迎了解並測試我們的 ezAcquire AI+OCR 系統。 另外,我們也供AI+OCR雲端辨識服務 https://aiocr.io