🚀 🍊 韩国医疗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许可证。