许可证:Apache-2.0
语言:
- 中文
基础模型:
- hfl/chinese-roberta-wwm-ext
任务类型:文本分类
标签:
- 医疗
评估指标:
- 混淆矩阵
- 准确率
- F1值
基于RoBERTa微调的医疗问诊意图识别模型
项目简介
- 项目来源:由中科(安徽)G60智慧健康创新研究院(简称"中科")在研发心理健康大模型对话导诊系统过程中开发的子模块,专注于意图识别任务。
- 模型功能:对用户输入对话系统的
query
文本进行意图分类,判断属于【医疗咨询】或【日常闲聊】类别。
数据说明
- 数据构成:融合Hugging Face开源对话数据集与中科内部医疗领域对话数据,经清洗预处理后构建。
- 数据规模:总计6000条样本,按4:1比例划分为训练集(4800条)和测试集(1200条),确保正负样本均衡。
- 数据示例:
[
{"query": "最近热门的5部电影叫什么名字", "label": "nonmed"},
{"query": "关节疼痛,足痛可能是什么原因", "label": "med"},
{"query": "最近出冷汗,肚子疼,恶心与呕吐,严重影响学习工作", "label": "med"}
]
实验环境
Featurize在线平台实例配置:
- CPU:6核E5-2680 V4
- GPU:RTX3060(12.6GB显存)
- 预装环境:Ubuntu 20.04 + Python 3.9/3.10 + PyTorch 2.0.1 + TensorFlow 2.13.0 + Docker 20.10.10(CUDA保持最新版本)
- 需手动安装依赖:
pip install transformers datasets evaluate accelerate
训练方法
训练参数与效果
{
output_dir: "output",
num_train_epochs: 2,
learning_rate: 3e-5,
lr_scheduler_type: "cosine",
per_device_train_batch_size: 16,
per_device_eval_batch_size: 16,
weight_decay: 0.01,
warmup_ratio: 0.02,
logging_steps: 0.01,
logging_strategy: "steps",
fp16: True,
eval_strategy: "steps",
eval_steps: 0.1,
save_strategy: 'epoch'
}
数据集 |
准确率 |
F1值 |
测试集 |
0.99 |
0.98 |
- 局限性说明:
模型在医疗问诊意图识别上表现良好,但由于训练数据规模有限且样本多样性不足,特定场景下可能存在误判。
使用指南
from transformers import AutoTokenizer, AutoModelForSequenceClassification
ID2LABEL = {0: "闲聊", 1: "问诊"}
MODEL_NAME = 'HZhun/RoBERTa-Chinese-Med-Inquiry-Intention-Recognition-base'
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, torch_dtype='auto')
query = '28岁患者情绪波动时频繁无诱因吐血,呼吸消化系统多次检查无果,近三天晨起连续吐血'
tokenized_query = tokenizer(query, return_tensors='pt')
tokenized_query = {k: v.to(model.device) for k, v in tokenized_query.items()}
intent = ID2LABEL[model(**tokenized_query).logits.argmax(-1).item()]
print(intent)
from transformers import AutoTokenizer, AutoModelForSequenceClassification
ID2LABEL = {0: "闲聊", 1: "问诊"}
MODEL_NAME = 'HZhun/RoBERTa-Chinese-Med-Inquiry-Intention-Recognition-base'
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, padding_side='left')
model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, torch_dtype='auto')
queries = [
'胃痛腹泻数日伴夜间呕吐',
'如何不用医药器械去除腿毛',
'感冒咳嗽用药建议',
'今天天气适合露营吗?'
]
tokenized_queries = tokenizer(queries, return_tensors='pt', padding=True, truncation=True)
tokenized_queries = {k: v.to(model.device) for k, v in tokenized_queries.items()}
preds = [ID2LABEL[i] for i in model(**tokenized_queries).logits.argmax(-1).tolist()]
print(preds)