CMB 中国医学基准测试
📃 论文 • 🌐 网站 • 🤗 HuggingFace
中文 | English
🌈 更新
- [2024.03.14] CMB被2024年NAACL主会议接收,感谢学术界的认可。
- [2024.02.21] CMB-Exam测试的答案已更新,并修复了版本管理遗漏导致的一些错误。
- [2024.01.08] 为便于测试,我们公开了CMB-Exam测试的答案。
- [2023.09.22] CMB已被纳入OpenCompass。
- [2023.08.21] 论文发布。
- [2023.08.01] 🎉🎉🎉 CMB正式发布!🎉🎉🎉
🌐 下载数据
- (推荐)下载压缩文件并解压:
git clone "https://github.com/FreedomIntelligence/CMB.git" && cd CMB && unzip "./data/CMB.zip" -d "./data/" && rm "./data/CMB.zip"
- 或查看HuggingFace数据集以按如下方式加载我们的数据:
from datasets import load_dataset # CMB-Exam数据集(单选和多选题) exam_datasets = load_dataset('FreedomIntelligence/CMB','exam') # CMB-Clin数据集 clin_datasets = load_dataset('FreedomIntelligence/CMB','clin')
- 或查看百度网盘
🥇 排行榜
请查看排行榜。
🥸 数据集介绍
组成部分
- CMB-Exam:全面的多层次医学知识评估
- 结构:6大类和28个子类,查看目录
- CMB-test:每个子类400个问题,共11200个问题
- CMB-val:280个带有解答和解释的问题;用作思维链和少样本学习的来源
- CMB-train:269359个问题用于医学知识注入
- CMB-Clin:74个复杂医疗咨询案例
CMB-Exam项目
{
"exam_type": "医师考试",
"exam_class": "执业医师",
"exam_subject": "口腔执业医师",
"question": "患者,男性,11岁。近2个月来时有低热(37~38℃),全身无明显症状。查体无明显阳性体征。X线检查发现右肺中部有一直径约0.8cm类圆形病灶,边缘稍模糊,肺门淋巴结肿大。此男孩可能患",
"answer": "D",
"question_type": "单项选择题",
"option": {
"A": "小叶型肺炎",
"B": "浸润性肺结核",
"C": "继发性肺结核",
"D": "原发性肺结核",
"E": "粟粒型肺结核"
}
},
- exam_type:主要类别
- exam_class:子类别
- exam_subject:具体科室或学科细分
- question_type:单项选择题 或 多项选择题
CMB-Clin 项目
{
"id": 0,
"title": "案例分析-腹外疝",
"description": "现病史\n(1)病史摘要\n 患者,男,49岁,3小时前解大便后出现右下腹疼痛,右下腹可触及一包块,既往体健。\n(2)主诉\n 右下腹痛并自扪及包块3小时。\n\n体格检查\n体温:37.8℃,脉搏101次/分,呼吸22次/分,血压100/60mmHg,腹部柔软,未见胃肠型蠕动波,肝脾肋下未触及,右侧腹股沟区可触及一圆形肿块,约4cm×4cm大小,有压痛、边界不清,且肿块位于腹股沟韧带上内侧。\n\n辅助检查\n(1)实验室检查\n 血常规:白细胞5.0×109/L,中性粒细胞78%。\n 尿常规正常。\n(2)多普勒超声检查\n 沿腹股沟纵切可见一多层分布的混合回声区,宽窄不等,远端膨大,边界整齐,长约4~5cm。\n(3)腹部X线检查\n 可见阶梯状液气平。",
"QA_pairs": [
{
"question": "简述该患者的诊断及诊断依据。",
"solution": "诊断:嵌顿性腹股沟斜疝合并肠梗阻。\n诊断依据:\n①右下腹痛并自扪及包块3小时;\n②有腹胀、呕吐,类似肠梗阻表现;腹部平片可见阶梯状液平,考虑肠梗阻可能;腹部B超提示腹部包块内可能为肠管;\n③有轻度毒性反应或中毒反应,如体温37.8℃,脉搏101次/分,中性粒细胞78%;\n④腹股沟区包块位于腹股沟韧带上内侧。"
},
{
"question": "简述该患者的鉴别诊断。",
"solution": "(1)睾丸鞘膜积液:肿块完全局限在阴囊内,上界可以清楚触及;透光试验多为阳性,而疝块则不能透光。\n(2)交通性鞘膜积液:肿块外形与睾丸鞘膜积液相似。每日起床后或站立活动时肿块缓慢出现并增大。平卧或睡觉后肿块逐渐缩小,挤压肿块体积也可逐渐缩小。透光试验为阳性。\n(3)精索鞘膜积液:肿块较小,在腹股沟管内,牵拉同侧睾丸可见肿块移动。\n(4)隐睾:腹股沟管内下降不全的睾丸可被误诊为斜疝或精索鞘膜积液。隐睾肿块较小,挤压时可出现特有的胀痛感觉。如患侧阴囊内睾丸缺如,则诊断更为明确。\n(5)急性肠梗阻:肠管被嵌顿的疝可伴发急性肠梗阻,但不应仅满足于肠梗阻的诊断而忽略疝的存在;尤其是患者比较肥胖或疝块较小时,更易发生这类问题而导致治疗错误。\n(6)此外,腹股沟区肿块还应与以下疾病鉴别:肿大的淋巴结、动(静)脉瘤、软组织肿瘤、脓肿、圆韧带囊肿、子宫内膜异位症等。"
},
{
"question": "简述该患者的治疗原则。",
"solution": "嵌顿性疝原则上需要紧急手术治疗,以防止疝内容物坏死并解除伴发的肠梗阻。术前应做好必要的准备,如有脱水和电解质紊乱,应迅速补液纠正。手术关键在于正确判断疝内容物的活力,然后根据病情确定处理方法。在扩张或切开疝环、解除疝环压迫的前提下,凡肠管呈紫黑色,失去光泽和弹性,刺激后无蠕动和相应肠系膜内无动脉搏动者,即可判定为肠坏死。如肠管尚未坏死,则可将其送回腹腔,按一般易复性疝处理,即行疝囊高位结扎+疝修补术。如肠管确已坏死或一时不能肯定肠管是否已失去活力时,则应在患者全身情况允许的前提下,切除该段肠管并进行一期吻合。凡施行肠切除吻合术的患者,因手术区污染,在高位结扎疝囊后,一般不宜作疝修补术,以免因感染而致修补失败。"
}
]
},
- title:疾病名称
- description:患者信息
- QA_pairs:基于描述的一系列问题及其解答
ℹ️ 如何评估和提交
修改模型配置文件
点击展开
configs/model_config.yaml
:
my_model:
model_id: 'my_model'
load:
# # HuggingFace模型权重
config_dir: "path/to/full/model"
# # 使用Peft加载
# llama_dir: "path/to/base"
# lora_dir: "path/to/lora"
device: 'cuda' # 仅支持cuda
precision: 'fp16' #
# 支持transformers.GenerationConfig中的所有参数
generation_config:
max_new_tokens: 512
min_new_tokens: 1
do_sample: False
修改模型工作器
点击展开
在workers/mymodel.py
中:
-
将模型和分词器加载到CPU
def load_model_and_tokenizer(self, load_config): ''' 参数: load_config:`configs/model_config.yaml`中的`load`键 返回: model, tokenizer:均在cpu上 ''' hf_model_config = {"pretrained_model_name_or_path": load_config['config_dir'],'trust_remote_code': True, 'low_cpu_mem_usage': True} hf_tokenizer_config = {"pretrained_model_name_or_path": load_config['config_dir'], 'padding_side': 'left', 'trust_remote_code': True} precision = load_config.get('precision', 'fp16') device = load_config.get('device', 'cuda') if precision == 'fp16': hf_model_config.update({"torch_dtype": torch.float16}) model = AutoModelForCausalLM.from_pretrained(**hf_model_config) tokenizer = AutoTokenizer.from_pretrained(**hf_tokenizer_config) model.eval() return model, tokenizer # cpu
-
系统提示词
@property def system_prompt(self): ''' 预置到每个输入前的提示词。 ''' return "你是一个人工智能助手。"
-
指令模板
@property def instruction_template(self): ''' 指令输入的模板。必须包含'{instruction}'占位符。 ''' return self.system_prompt + '问:{instruction}\n答:'
-
带少样本示例的指令模板
@property def instruction_template_with_fewshot(self,): ''' 指令输入的模板。此模板中必须包含'{instruction}'占位符。 ''' return self.system_prompt + '{fewshot_examples}问:{instruction}\n答:' # 必须带有 {instruction} 和 {fewshot_examples} 的占位符
-
每个少样本示例的模板
@property def fewshot_template(self): ''' 每个少样本示例的模板。每个少样本示例会被连接并放入上面的`{fewshot_examples}`占位符中。 此模板中必须包含`{user}`和`{gpt}`占位符。 ''' return "问:{user}\n答:{gpt}\n" # 必须带有 {user} 和 {gpt} 的占位符
点击展开
from workers.mymodel import MyModelWorker # 在此处修改
id2worker_class = {
"my_model": MyModelWorker, # 在此处修改
}
生成少样本示例(如使用少样本学习则必需)
点击展开
修改 generate_fewshot.sh
:
model_id="baichuan-13b-chat"
n_shot=3
test_path=data/CMB-Exam/CMB-test/CMB-test-choice-question-merge.json
val_path=data/CMB-Exam/CMB-val/CMB-val-merge.json
output_dir=data/fewshot
python ./src/generate_fewshot.py \
--use_cot \ # 是否使用思维链模板
--n_shot=$n_shot \
--model_id=$model_id \
--output_dir=$output_dir \
--val_path=$val_path \
--test_path=$test_path
然后运行:
bash generate_fewshot.sh
修改主脚本
点击展开
generate_answers.sh
:
# # 输入文件路径
# data_path='data/CMB-Exam/CMB-test/CMB-test-choice-question-merge.json'
# data_path='data/CMB-Clin/CMB-Clin-qa.json'
task_name='Zero-test-cot'
port_id=27272
model_id="my_model" # 与 `configs/model_config.yaml` 中相同
accelerate launch \
--gpu_ids='all' \
--main_process_port 12345 \
--config_file ./configs/accelerate_config.yaml \ # 加速配置文件路径
./src/generate_answers.py \ # 主程序
--model_id=$model_id \ # 模型ID
--use_cot \ # 是否使用思维链模板
--use_fewshot \ # 是否使用少样本学习
--batch_size 3 \
--input_path=$test_data_path \ # 输入路径
--output_path=./result/${task_name}/${model_id}/answers.json \ # 输出路径
--model_config_path="./configs/model_config.yaml" # 模型配置文件路径
运行评估并提交
点击展开
步骤1:生成并提取答案
bash generate_answers.sh
步骤2:对你的答案进行评分
将步骤1中的输出提交到提交页面并下载评分结果。如果您希望公开模型的性能,请将相关结果连同模型名称和所属机构发送至cmedbenchmark@163.com。我们将及时审核并更新。
提高性能的技巧
尝试不同的解码策略
您可以在 ./configs/model_config.yaml
中配置生成的超参数。我们发现,对于大多数模型,较低的温度通常会带来更高的性能。然而,其他超参数的影响尚不明确。
修改答案匹配策略
您可以修改 src/utils.py
中的 match_choice()
函数。不同模型的输出模式各不相同,这使得我们很难用单一的正则表达式考虑所有模型的所有情况。如果您为我们论文中评估的模型找到了更好的匹配策略,请提交您的结果以进行更新。
提示词格式
CMB-Exam 提示词
仅答案提示词
{系统提示词}
<{角色1}>:以下是中国{考试类型}中{考试科目}考试的一道{题目类型},不需要做任何分析和解释,直接输出答案选项。。
{题目}
A. {选项A}
B. {选项B}
...
<{角色2}>:A
[n个少样本示例,零样本情况下n为0]
<{角色1}>:以下是中国{考试类型}中{考试科目}考试的一道{题目类型},不需要做任何分析和解释,直接输出答案选项。
{题目}
A. {选项A}
B. {选项B}
...
<{角色2}>:
思维链提示词
{系统提示词}
<{角色1}>:以下是中国{考试类型}中{考试科目}考试的一道{题目类型},请分析每个选项,并最后给出答案。
{题目}
A. {选项A}
B. {选项B}
...
<{角色2}>:.......所以答案是A
[n个少样本示例,零样本情况下n为0]
<{角色1}>:以下是中国{考试类型}中{考试科目}考试的一道{题目类型},请分析每个选项,并最后给出答案。
{题目}
A. {选项A}
B. {选项B}
...
<{角色2}>:
CMB-Clin 提示词
{系统提示词}
<{角色1}>:以下是一位病人的病例:
{描述}
{问答对[0]['问题']}
<{角色2}>:..........
[n个问题,基于问答对的长度]
CMB-Clin GPT-4 评估提示词
点击展开
你是一位专门评估其他语言模型所提供答案质量的AI评估员。你的主要目标是根据答案的流畅度、相关性、完整性和医学专业性来对其进行评分。使用以下量表来评估每个标准:
流畅度:
1:完全破碎且无法阅读的句子片段
2:大部分破碎,只有少数可读的词语
3:中等流畅但词汇有限
4:在表达复杂主题时大致连贯
5:人类水平的流畅度
相关性:
1:与问题完全无关
2:与问题有一些关系,但大部分偏离主题
3:相关,但缺乏重点或关键细节
4:高度相关,涉及问题的主要方面
5:直接相关且精确针对问题
完整性:
1:极度不完整
2:几乎不完整,信息有限
3:中等完整,包含一些信息
4:大致完整,展示了大部分信息
5:完全完整,呈现了所有信息
医学专业性:
1:使用普通语言,没有医学术语
2:具备一些医学知识,但缺乏深入细节
3:清晰地传达中等复杂的医学信息
4:显示出对医学术语的扎实掌握,但在细节上有一些小错误
5:在所有呈现的医学知识中完全正确
你将获得以下信息:
- 一段描述
- 基于描述的对话(可选)
- 基于描述和对话的问题
- 问题的解决方案
- 模型对问题的回答
[描述]
{描述}
[描述结束]
[对话]
{历史}
[对话结束]
[问题]
{问题}
[问题结束]
[解决方案]
{解决方案}
[解决方案结束]
[回答]
{回答}
[回答结束]
请确保以JSON格式提供您的评估结果,并且只提供JSON,对每个提到的标准进行单独评分,如下例所示:
{"流畅度": 3, "相关性": 3, "完整性": 3, "专业性": 3}
引用
如果您打算将我们的数据集用于训练或评估,请使用以下引用:
@article{wang2023cmb,
title={CMB: A Comprehensive Medical Benchmark in Chinese},
author={Wang, Xidong and Chen, Guiming Hardy and Song, Dingjie and Zhang, Zhiyi and Chen, Zhihong and Xiao, Qingying and Jiang, Feng and Li, Jianquan and Wan, Xiang and Wang, Benyou and others},
journal={arXiv preprint arXiv:2308.08833},
year={2023}
}
@misc{cmedbenchmark,
title={CMB: Chinese Medical Benchmark},
author={Xidong Wang*, Guiming Hardy Chen*, Dingjie Song*, Zhiyi Zhang*, Qingying Xiao, Xiangbo Wu, Feng Jiang, Jianquan Li, Benyou Wang},
note={Xidong Wang, Guiming Hardy Chen, Dingjie Song, and Zhiyi Zhang contributed equally to this github repo.},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/FreedomIntelligence/CMB}},
}
致谢
-
我们感谢深圳市大数据研究院对本项目的巨大支持。
-
我们感谢以下医生参与CMB-Clin的人工评估:
- 林士军 (香港中文大学(深圳)附属第二医院)
- 常河
- 许晓爽