扁鹊:指令与多轮问询对话联合微调的医疗对话大模型

这篇具有很好参考价值的文章主要介绍了扁鹊:指令与多轮问询对话联合微调的医疗对话大模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近更新

  • 👏🏻 2023.04.22: 基于扁鹊-1.0模型的医疗问答系统Demo,详情访问:https://huggingface.co/spaces/scutcyr/BianQue
  • 👏🏻 2023.04.22: 扁鹊-1.0版本模型发布,详情见:扁鹊-1.0:通过混合指令和多轮医生问询数据集的微调,提高医疗聊天模型的“问”能力(BianQue-1.0: Improving the “Question” Ability of Medical Chat Model through finetuning with Hybrid Instructions and Multi-turn Doctor QA Datasets)

简介

扁鹊-1.0(BianQue-1.0) 是一个经过指令与多轮问询对话联合微调的医疗对话大模型。我们经过调研发现,在医疗领域,往往医生需要通过多轮问询才能进行决策,这并不是单纯的“指令-回复”模式。用户在咨询医生时,往往不会在最初就把完整的情况告知医生,因此医生需要不断进行询问,最后才能进行诊断并给出合理的建议。基于此,我们构建了 扁鹊-1.0(BianQue-1.0) ,拟在 强化AI系统的问询能力 ,从而达到模拟医生问诊的过程。我们把这种能力定义为“望闻问切”当中的“问”。

综合考虑当前中文语言模型架构、参数量以及所需要的算力,我们采用了ClueAI/ChatYuan-large-v2作为基准模型,在8张 NVIDIA RTX 4090显卡上微调了1个epoch得到扁鹊-1.0(BianQue-1.0),用于训练的中文医疗问答指令与多轮问询对话混合数据集包含了超过900万条样本,这花费了大约16天的时间完成一个epoch的训练。

我们将计划围绕扁鹊模型的“望闻问切”能力,结合医学专家知识、多模态技术、多生理信号计算等,进行多个版本的模型迭代研究。

扁鹊(BianQue)模型欢迎你的贡献!我们鼓励你在 BianQue GitHub 页面报告问题、贡献 PR 并参与讨论。我们期待与更多的高校、医院、研究实验室、公司等进行合作,共同开展下一代扁鹊模型研究。对于此类需求(以及其他不适合在 GitHub 上提出的需求),请直接发送电子邮件至 eeyirongchen@mail.scut.edu.cn。

训练数据

我们结合当前开源的中文医疗问答数据集(MedDialog-CN、IMCS-V2、CHIP-MDCFNPC、MedDG、cMedQA2、Chinese-medical-dialogue-data),以及自建的指令数据集,通过进一步的数据清洗,构建了一个大于900万条样本的中文医疗问答指令与多轮问询对话混合数据集,数据集的平均轮数为3,最大轮数达到218,数据格式为:

input: "病人:六岁宝宝拉大便都是一个礼拜或者10天才一次正常吗,要去医院检查什么项目\n医生:您好\n病人:六岁宝宝拉大便都是一个礼拜或者10天才一次正常吗,要去医院检查什么项目\n医生:宝宝之前大便什么样呢?多久一次呢\n病人:一般都是一个礼拜,最近这几个月都是10多天\n医生:大便干吗?\n病人:每次10多天拉的很多\n医生:"
target: "成形还是不成形呢?孩子吃饭怎么样呢?"

训练数据当中混合了大量target文本为医生问询的内容而非直接的建议,这将有助于提升AI模型的问询能力。

模型“问”能力示例

“望闻问切”四诊法由扁鹊发明。“四诊法”(望、闻、问、切),是中医诊病的基本方法。其中,“问”的能力可以被建模到语言模型当中。我们把AI模型的“问”能力定义为:
“问”能力:AI模型能够根据病人输入的信息,结合医学知识来进行恰当的问询,并且结合进一步的问询得到的病人的信息,给出“合适的诊断或建议”。“问”的过程通常是一个多轮对话过程。

以下是2个简单的例子:

  • 例子1
    用户:我最近感觉全身疲惫
    扁鹊-1.0:是劳累了,还是熬夜了?
    用户:这周都在熬夜赶论文
    扁鹊-1.0:嗯,熬夜容易引起各种不适,如头晕、乏力、失眠、多梦等,多休息,可以口服谷维素、维生素B1和安神补脑液,避免熬夜。

  • 例子2
    用户:我最近经常失眠
    扁鹊-1.0:失眠多久了?
    用户:两周了
    扁鹊-1.0:睡眠怎么样?
    用户:上床几小时才睡得着
    扁鹊-1.0:可以口服一些药物
    用户:有具体推荐吗
    扁鹊-1.0:需要先检查一下
    用户:那我需要做什么检查?
    扁鹊-1.0:心电图

使用方法

直接使用扁鹊-1.0模型

import os
from transformers import T5Tokenizer, T5ForConditionalGeneration, AutoTokenizer
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")


tokenizer = T5Tokenizer.from_pretrained("scutcyr/BianQue-1.0")
model = T5ForConditionalGeneration.from_pretrained("scutcyr/BianQue-1.0")


def preprocess(text):
    text = text.replace("\n", "\\n").replace("\t", "\\t")
    return text

def postprocess(text):
    return text.replace("\\n", "\n").replace("\\t", "\t")

def answer(user_history, bot_history, sample=True, top_p=1, temperature=0.7):
    '''sample:是否抽样。生成任务,可以设置为True;
    top_p:0-1之间,生成的内容越多样
    max_new_tokens=512 lost...'''

    if len(bot_history)>0:
        context = "\n".join([f"病人:{user_history[i]}\n医生:{bot_history[i]}" for i in range(len(bot_history))])
        input_text = context + "\n病人:" + user_history[-1] + "\n医生:"
    else:
        input_text = "病人:" + user_history[-1] + "\n医生:"
        return "我是利用人工智能技术,结合大数据训练得到的智能医疗问答模型扁鹊,你可以向我提问。"
    

    input_text = preprocess(input_text)
    print(input_text)
    encoding = tokenizer(text=input_text, truncation=True, padding=True, max_length=768, return_tensors="pt").to(device) 
    if not sample:
        out = model.generate(**encoding, return_dict_in_generate=True, output_scores=False, max_new_tokens=512, num_beams=1, length_penalty=0.6)
    else:
        out = model.generate(**encoding, return_dict_in_generate=True, output_scores=False, max_new_tokens=512, do_sample=True, top_p=top_p, temperature=temperature, no_repeat_ngram_size=3)
    out_text = tokenizer.batch_decode(out["sequences"], skip_special_tokens=True)
    print('医生: '+postprocess(out_text[0]))
    return postprocess(out_text[0])

answer_text = answer(user_history=["你好!",
                                   "我最近经常失眠",
                                   "两周了",
                                   "上床几小时才睡得着"], 
                     bot_history=["我是利用人工智能技术,结合大数据训练得到的智能医疗问答模型扁鹊,你可以向我提问。",
                                  "失眠多久了?",
                                  "睡眠怎么样?"])

使用个人数据在扁鹊-1.0模型基础上进一步微调模型

  • 环境创建
    以下为在RTX 4090显卡,CUDA-11.6驱动配置下的环境配置
conda env create -n bianque_py38 --file py38_conda_env.yml
conda activate bianque_py38
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
  • 数据集构建
    参考.data/cMedialog_example.csv格式,构建你的数据集
  • 基于扁鹊-1.0模型微调你的模型
    修改./scripts/run_train_model_bianque.sh,通过绝对路径指定PREPROCESS_DATA,并且调整其他变量,然后运行:
cd scripts
bash run_train_model_bianque.sh

声明

扁鹊-1.0(BianQue-1.0) 当前仅经过1个epoch的训练,尽管模型具备了一定的医疗问询能力,但其仍然存在以下局限:文章来源地址https://www.toymoban.com/news/detail-619482.html

  • 训练数据来源于开源数据集以及互联网,尽管我们采用了严格的数据清洗流程,数据集当中仍然不可避免地存在大量噪声,这会使得部分回复产生错误;
  • 医生“问询”是一项复杂的能力,这是非医生群体所不具备的,当前的模型对于模拟“医生问询”过程是通过大量样本学习得到的,因此在问询过程当中,有可能出现一些奇异的提问风格。换一句话来说,当前版本的模型强化了“问”的能力,但是“望”、“闻”、“切”的能力仍待进一步研究!

引用

@article{chen2023bianque1,
      title={BianQue-1.0: Improving the "Question" Ability of Medical Chat Model through finetuning with Hybrid Instructions and Multi-turn Doctor QA Datasets}, 
      author={Yirong Chen and Zhenyu Wang and Xiaofen Xing and Zhipei Xu and Kai Fang and Sihang Li and Junhong Wang and Xiangmin Xu},
      year={2023},
      url={https://github.com/scutcyr/BianQue}
}

到了这里,关于扁鹊:指令与多轮问询对话联合微调的医疗对话大模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文心一言 VS ChatGPT测评--多轮对话

    上面的图,蓝色图表是文心一言;下面的图,绿色图标是chatGPT。 chatGPT还会抢答了。。。 chatGPT更有条理,1,2,3,4.。。。 文心一言的时效性更强一点,这回合算文心一言赢 还是chatGPT更有条理,文心的回答上句不接下句的,感觉差点意思。 文心的评价感觉更像是吹捧,专业性

    2024年02月15日
    浏览(42)
  • NLP实践——Llama-2 多轮对话prompt构建

    最近,META开源了Llama-2模型,受到了广泛的关注和好评,然而,在官方给的使用说明中,并没有对使用方法进行特别细节的介绍,尤其是对于对话任务,这就给我们在使用时带来了很多困扰。 以ChatGLM为例,在执行多轮对话时,需要将历史信息拼接到输入中,以供模型在生成时

    2024年02月15日
    浏览(40)
  • 【论文阅读】一些多轮对话文章的体会 ACL 2023

    本文是对昨天看到的 ACL 2023 三篇多轮对话文章的分享 这三个工作都是根据一些额外属性控制输出的工作,且评估的方面比较相似,可以借鉴 这几篇文章都不是做general任务的,倾向于通过一些额外信息,来做specific任务 【1】提出应该在instance-level上而不是task-level上生成attr

    2024年02月17日
    浏览(54)
  • 【课件】Python调用OpenAI API实现ChatGPT多轮对话

    如何实现多轮对话? gpt-3.5-turbo 模型调用方法 openai.ChatCompletion.create 里传入的 message 是一个列表,列表里每个元素是字典,包含了角色和内容,我们只需将每轮对话都存储起来,然后每次提问都带上之前的问题和回答即可。 代码解析: ChatGPT 类,包含三个函数: __init__ 初始

    2024年02月03日
    浏览(50)
  • 解锁大语言模型LLM对话潜力:ChatGLM3-6B的多轮对话实践与深入探索

    随着人工智能技术的飞速发展,多轮对话系统已成为自然语言处理领域的研究热点。多轮对话要求模型不仅能理解用户的当前输入,还需结合对话历史进行连贯回复,这对模型的上下文理解和生成能力提出了更高要求。ChatGLM3-6B作为一种先进的大型语言模型,在多轮对话任务

    2024年02月22日
    浏览(59)
  • 智能客服机器人:基于知识图谱的多轮对话系统

    ━━ ━━ 近年来, 随着人工智能的快速发展,人机交互能力不断增强,其中问答技术能够在保证一定准确度的情况下极大地简化用户的搜索操作,在节约时间的同时,还能够加深用户对搜索事物的了解程度,百度公司的小度、苹果公司的Siri等正是基于问答技术形成的产品。

    2024年02月15日
    浏览(69)
  • 在springboot项目中调用通义千问api多轮对话并实现流式输出

    阿里灵积提供了详细的官方文档 官方文档中提到只需要把每轮对话中返回结果添加到消息管理器中,就可以实现多轮对话。本质上就是将历史对话再次发送给接口。 官方文档中提出使用streamCall()方法就可以实现流式输出,在 ResultCallbackGenerationResult 参数中可以指点每个事件的

    2024年04月12日
    浏览(51)
  • LangChain 27 AI Agents角色扮演多轮对话解决问题CAMEL

    LangChain系列文章 LangChain 实现给动物取名字, LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄 LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve LangChain 5易速鲜花内部问

    2024年02月03日
    浏览(46)
  • 大模型开发(六):OpenAI Completions模型详解并实现多轮对话机器人

    授权声明: 本文基于九天Hector的原创课程资料创作,已获得其正式授权。 原课程出处:九天Hector的B站主页,感谢九天Hector为学习者带来的宝贵知识。 请尊重原创,转载或引用时,请标明来源。 全文共7000余字,预计阅读时间约15~30分钟 | 满满干货(附代码),建议收藏! 本文

    2024年02月16日
    浏览(44)
  • OpenAI开发系列(六):Completions模型的工作原理及应用实例(开发多轮对话机器人)

    授权声明: 本文基于九天Hector的原创课程资料创作,已获得其正式授权。 原课程出处:九天Hector的B站主页,感谢九天Hector为学习者带来的宝贵知识。 请尊重原创,转载或引用时,请标明来源。 全文共7000余字,预计阅读时间约15~30分钟 | 满满干货(附代码),建议收藏! 本文

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包