🚀 🍊 韓國醫療DPR(密集段落檢索)
這是一個可用於醫療領域的雙編碼器結構的檢索模型。為處理韓英混合體的醫療記錄,該模型採用了SapBERT-KO-EN作為基礎模型。問題通過問題編碼器進行編碼,文本則通過上下文編碼器進行編碼。
(※ 此模型是使用AI Hub的超大型AI醫療問答數據進行訓練的模型。)
✨ 主要特性
自我對齊預訓練(SAP)
韓國的醫療記錄通常使用韓英混合體書寫,因此需要一個能夠識別英語術語的模型。該模型使用多相似度損失,使同一代碼的術語之間具有較高的相似度。
例如:C3843080 || 高血壓疾病
C3843080 || Hypertension
C3843080 || High Blood Pressure
C3843080 || HTN
C3843080 || HBP
密集段落檢索(DPR)
為了將SapBERT-KO-EN轉換為檢索模型,需要進行額外的微調。該模型採用雙編碼器結構,使用DPR方法計算查詢與文本之間的相似度進行微調。使用了在現有數據集上增強韓英混合體樣本的數據集。
例如:韓語疾病名稱:高血壓
英語疾病名稱:Hypertenstion
查詢(原文):父親患有高血壓,但我不知道那是什麼。請解釋一下高血壓是什麼。
查詢(增強):父親患有Hypertenstion,但我不知道那是什麼。請解釋一下Hypertenstion是什麼。
🔧 技術細節
自我對齊預訓練(SAP)
SapBERT-KO-EN訓練中使用的基礎模型和超參數如下。使用了包含韓英醫療術語的醫療術語詞典KOSTOM作為訓練數據。
屬性 |
詳情 |
模型類型 |
klue/bert-base |
訓練數據 |
KOSTOM |
訓練輪數 |
1 |
批次大小 |
64 |
最大長度 |
64 |
丟棄率 |
0.1 |
池化器 |
'cls' |
評估步驟 |
100 |
閾值 |
0.8 |
正樣本縮放 |
1 |
負樣本縮放 |
60 |
密集段落檢索(DPR)
微調中使用的基礎模型和超參數如下。
屬性 |
詳情 |
模型類型 |
SapBERT-KO-EN(klue/bert-base) |
訓練數據 |
超大型AI醫療問答數據(AI Hub) |
訓練輪數 |
10 |
批次大小 |
64 |
丟棄率 |
0.1 |
池化器 |
'cls' |
💻 使用示例
基礎用法
此模型是用於對上下文進行編碼的模型,需要與問題模型一起使用。可以確認關於同一疾病的問題和文本具有較高的相似度。
(※ 以下代碼示例是使用ChatGPT生成的醫療文本。)
(※ 由於訓練數據的特性,該模型在比示例更精煉的文本上表現更好。)
import numpy as np
from transformers import AutoModel, AutoTokenizer
q_model_path = 'snumin44/medical-biencoder-ko-bert-question'
q_model = AutoModel.from_pretrained(q_model_path)
q_tokenizer = AutoTokenizer.from_pretrained(q_model_path)
c_model_path = 'snumin44/medical-biencoder-ko-bert-context'
c_model = AutoModel.from_pretrained(c_model_path)
c_tokenizer = AutoTokenizer.from_pretrained(c_model_path)
query = 'high blood pressure 처방 사례'
targets = [
"""고혈압 진단.
환자 상담 및 생활습관 교정 권고. 저염식, 규칙적인 운동, 금연, 금주 지시.
환자 재방문. 혈압: 150/95mmHg. 약물치료 시작. Amlodipine 5mg 1일 1회 처방.""",
"""응급실 도착 후 위 내시경 진행.
소견: Gastric ulcer에서 Forrest IIb 관찰됨. 출혈은 소량의 삼출성 출혈 형태.
처치: 에피네프린 주사로 출혈 감소 확인. Hemoclip 2개로 출혈 부위 클리핑하여 지혈 완료.""",
"""혈중 높은 지방 수치 및 지방간 소견.
다발성 gallstones 확인. 증상 없을 경우 경과 관찰 권장.
우측 renal cyst, 양성 가능성 높으며 추가적인 처치 불필요 함."""
]
query_feature = q_tokenizer(query, return_tensors='pt')
query_outputs = q_model(**query_feature, return_dict=True)
query_embeddings = query_outputs.pooler_output.detach().numpy().squeeze()
def cos_sim(A, B):
return np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))
for idx, target in enumerate(targets):
target_feature = c_tokenizer(target, return_tensors='pt')
target_outputs = c_model(**target_feature, return_dict=True)
target_embeddings = target_outputs.pooler_output.detach().numpy().squeeze()
similarity = cos_sim(query_embeddings, target_embeddings)
print(f"Similarity between query and target {idx}: {similarity:.4f}")
Similarity between query and target 0: 0.2674
Similarity between query and target 1: 0.0416
Similarity between query and target 2: 0.0476
📄 許可證
本項目採用MIT許可證。