Clone with HTTP
git clone https://www.modelscope.cn/DUTIRbionlp/Taiyi-LLM.git
太一(Taiyi):基于多任务指令微调的中英双语生物医学大模型
项目背景
随着深度学习技术的迅速发展,类ChatGPT这样的大语言模型在自然语言处理领域已经取得了显著的进展。面向生物医学领域,大语言模型有助于医生与患者之间的沟通,提供有用的医学信息,并在辅助诊疗、生物医学知识发现、药物研发、个性化医疗方案等方面具有巨大潜力。然而,在人工智能社区中,已有的开源生物医学大模型相对较少,且大多主要专注于单语(中文或英语)的医疗问答对话。因此,本项目开展了面向生物医学领域大模型的研究,并发布初版中英双语生物医学大模型——太一(Taiyi),旨在探索大模型在生物医学领域中双语自然语言处理多任务的能力。
项目特色
- 丰富的生物医学训练资源:面向生物医学领域,本项目收集整理了丰富的中英双语生物医学自然语言处理(BioNLP)训练语料,总共包含38个中文数据集,覆盖10种BioNLP中文任务;102个英文数据集,覆盖12种BioNLP英文任务。本项目根据任务类型,设计制定任务数据统一格式,对数据集进行了统一格式转换。
- 出色的中英双语BioNLP多任务能力:通过丰富的中英双语任务指令数据(超过100W条样本)进行大模型指令微调,使模型具备了出色的中英双语生物医学智能问答、医患对话、报告生成、信息抽取、机器翻译、标题生成、文本分类等多种BioNLP能力。
- 优秀的泛化能力:除了生物医学领域,模型仍具备通用领域对话能力,并通过设计指令模板多样性,使模型具备了较优秀的指令理解能力,在同类任务的不同场景下具有较好的泛化能力,并激发了模型一定的零样本学习能力。
为了促进生物医学领域NLP发展,本项目开源了中英双语BioNLP数据集整理信息、“太一”大模型权重、模型推理使用脚本。
基座介绍
当前版本的太一是基于Qwen-7B-base通过指令微调得到。通义千问-7B(Qwen-7B)是阿里云研发的通义千问大模型系列的70亿参数规模的模型,在超过2万亿tokens数据进行预训练,包含高质量中、英、多语言、代码、数学等数据,涵盖通用及专业领域的训练语料。
模型推理
本项目将多轮对话拼接成如下格式,然后进行tokenize。其中eod为qwen tokenizer中的特殊字符<|endoftext|>
<eod>input1<eod>answer1<eod>input2<eod>answer2<eod>.....
可使用如下代码完成使用我们的模型完成推理。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "DUTIR-BioNLP/Taiyi-LLM"
device = 'cuda:0'
model = AutoModelForCausalLM.from_pretrained(
model_name,
low_cpu_mem_usage=True,
torch_dtype=torch.float16,
trust_remote_code=True,
device_map = device
)
model.eval()
tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True
)
import logging
logging.disable(logging.WARNING)
tokenizer.pad_token_id = tokenizer.eod_id
tokenizer.bos_token_id = tokenizer.eod_id
tokenizer.eos_token_id = tokenizer.eod_id
history_token_ids = torch.tensor([[]], dtype=torch.long)
max_new_tokens = 500
top_p = 0.9
temperature = 0.3
repetition_penalty = 1.0
# 开始对话
history_max_len = 1000
utterance_id = 0
history_token_ids = None
user_input = "你好,请问你是谁?"
input_ids = tokenizer(user_input, return_tensors="pt", add_special_tokens=False).input_ids
bos_token_id = torch.tensor([[tokenizer.bos_token_id]], dtype=torch.long)
eos_token_id = torch.tensor([[tokenizer.eos_token_id]], dtype=torch.long)
user_input_ids = torch.concat([bos_token_id,input_ids, eos_token_id], dim=1)
model_input_ids = user_input_ids.to(device)
with torch.no_grad():
outputs = model.generate(
input_ids=model_input_ids, max_new_tokens=max_new_tokens, do_sample=True, top_p=top_p,
temperature=temperature, repetition_penalty=repetition_penalty, eos_token_id=tokenizer.eos_token_id
)
response = tokenizer.batch_decode(outputs)
print(response[0])
#<|endoftext|>你好,请问你是谁?<|endoftext|>您好,我是医疗语言大模型Taiyi。<|endoftext|>
本项目提供两个用于对话的测试代码。可使用dialogue_one_trun.py
中的程序进行单轮问答对话测试,或者使用dialogue_multi_trun.py
中的示例代码进行多轮对话问答测试。
注:为了保证推理速度,建议使用4090显卡。
引用
如果你使用到了本项目的仓库,请引用下面论文。
@article{Taiyi,
title="{Taiyi: A Bilingual Fine-Tuned Large Language Model for Diverse Biomedical Tasks}",
author={Ling Luo, Jinzhong Ning, Yingwen Zhao, Zhijun Wang, Zeyuan Ding, Peng Chen, Weiru Fu, Qinyu Han, Guangtao Xu, Yunzhi Qiu, Dinghao Pan, Jiru Li, Hao Li, Wenduo Feng, Senbo Tu, Yuqi Liu, Zhihao Yang, Jian Wang, Yuanyuan Sun, Hongfei Lin},
journal={arXiv preprint arXiv:2311.11608},
year={2023},
}
评论