中文医疗大模型也可以“学富五车”?
前言:
BERT时代,笔者一个未竟的工作是如何训练一个充满知识的医疗领域BERT模型。在这篇文章中得到了工作上的延续,这里我们讨论如何为中文医疗大模型插上知识的翅膀。(实际原因是针对这个问题最近被挑战很多次~)
首先,为什么需要知识增强?
实际上在讨论这个问题的时候,笔者选择有意避开知识是什么这个老大难的问题。
在笔者之前的文章《ChatGPT在医疗NLP场景中的应用》中,基于ChatGPT测试过一个医学术语标准化的经典例子,如下:
在这个例子中,ICD是国家疾病标准。上述例子反映的除了知识实效性的问题,也包括知识利用的有效性问题。可以很明显地看到上述回答并不完美,但也不能苛求。并不能说ChatGPT没有知识。通过海量数据的学习,模型还是能够以一种简单但似乎并不高效的方式获取知识。但是一个通用领域的模型,如果直接用于垂直行业,应该也是不妥的。对于一个垂直行业,比如医疗领域。自身存在大量的知识未必通过数字化的手段存储于网络之上,本地化的知识自然无法使得模型能够习得。但是这个条件却是做行业模型必须去直面的问题,否则直接用一个通用大模型就可以解决了。这里给出了两个问题:
通用大模型习得了一些行业知识,但不充分
通用大模型存在无法习得的本地化的知识
在医疗方向上,过去一段时间形成了一个认知:医疗的算法问题需要数据和知识双轮驱动。在这个角度上可能显著区别于其他行业,可以通过单纯的数据形成一个可用的能力。
因此,怎么给行业大模型做知识增强?
按照惯例,在讨论这个问题的时候,可以看一下已经有的一些工作。在前一篇文章《中文医疗大模型的2W1H分析》中,列举的工作包括ChatDoctor,Baize等都可以看作相关方向的具体实现,这里不再一一赘述。另外一个角度是,似乎目前比较系统的讨论这个问题的工作暂时也没看到,理论上可以看一下BERT时代是怎么考虑这个问题的。
在文章《DoctorGLM: Fine-tuning your Chinese Doctor is not a Herculean Task》中,给出了微调和推理的具体流程。通过设计针对Query的抽取模块,显式的抽取Query中的疾病,症状,预防手段和治疗方法实体,该阶段可以通过设计Prompt完成。通过融合抽取的实体和Query作为LLM的输入,实现更好地知识融入。
与之相类似的工作,在《Empower Large Language Model to Perform Better on Industrial Domain-Specific Question Answering》中,具体方法如下:
LLM的输入除了融合Query(又称Question),还会融合领域知识。这里的领域知识其实是一个经过微调的领域小模型针对相同Query的响应。这是一种隐式的领域知识获取的方式。怎么得到这个领域小模型呢?在离线条件下,分为两个阶段,分别是预训练阶段和指令微调阶段,预训练阶段采用领域相关的文档作为训练数据集,指令微调阶段基于领域数据构建指令数据集完成。
回到BERT时代看同样的问题,在《SMedBERT: A Knowledge-Enhanced Pre-trained Language Model with Structured Semantics for Medical Text Mining》中,主要的启发来自下图:
在一个文本中,通过利用知识图谱建立实体和相邻实体的关系,能够进一步丰富实体在文本中的上下文表示。具体的建模思路如下:
这里的关键是在原始BERT的输入之外,增加了基于知识输入的表征,在编码阶段融合了二者的特征。
在任务设计上,除了原始的MLM任务(完形填空),增加了mention和neighbor的预测任务。引用原文的表达如下:
To fully exploit the structured semantics knowledge in KG, we further introduce two novel selfsupervised pre-training tasks, namely Masked Neighbor Modeling (MNeM) and Masked Mention Modeling (MMeM).
通过上述方法,该工作只利用较少的非结构化医疗文本数据(5G?),在医疗知识图谱的增强下,就取得了比更多医疗文本数据微调下的模型更好的效果。
类似的思路包括《Conceptualized Representation Learning for Chinese Biomedical Text Mining》中的想法,其实是一种更加朴素地实现。
相关的其他工作包括KGBERT,如下:
进一步地,《当BERT遇上知识图谱》中有三个类似的工作,《万字长文讲述大模型与知识图谱》[1]是近期的一个访谈对话记录,其中有些还是有启发性的观点的,《自然语言预训练模型知识增强方法》[2]是一个中文的总结,《A Survey of Knowledge-Enhanced Pre-trained Language Model》[3]是一个英文综述。
处理医疗领域的知识增强需求,在法律领域同样如此,比如这里[4][5]的工作:
给定一个用户的咨询,通过一个检索组件实现对民法典相关条款的检索,通过精心设计Prompt,融合用户的咨询和民法典的相关知识,更好地引导模型输出符合预期的结果。
结合笔者个人的想法,一个基本的思路如下:
整体上看,知识增强可以应用在训练和预测两个阶段。训练阶段实现全局知识增强,主要目标是形成参数化的医学知识。训练阶段可以进一步分为预训练和指令微调两个阶段。其中预训练阶段具体可以有三种实现方式:
单独使用医学图书,诊疗指南等侧重于医学知识的数据
单独使用医学知识图谱,需要配套特定的训练任务,比如上文所述工作
如上图所示,联合使用上述两者
在指令微调阶段,通过增加侧重于医学知识的问答类数据,使得模型参数化更多的医疗知识。
推理阶段通过retrieval&generate的方式,实现任务相关知识增强,主要目标是充分利用非参数化的医学知识。包括但不限于:
通过信息抽取显式提取Query中的知识
利用小型语言模型通过文本生成的方式获取Query的相关知识
围绕语义相似性,可以采用搜索引擎或者基于向量数据库获取相关知识表达
基于信息抽取和搜索引擎的方式,均是显式的知识获取;基于小型语言模型和向量数据库的方式是基于语义的隐式知识获取。
沿着这个思路向两边看,如果只是基于LLM,通过generate的方式得到响应,我们关注的是记忆和泛化;如果只是基于搜索引擎,通过retrieval的方式得到相关结果,我们关注的是相关性分析。而retrieval&generate的方式正是处于二者中间的状态。
总体上看,和BERT时代的知识增强在大方向上不会存在显著的不同,区别仍旧在于选择的具体实现方式和对细节的处理。
相关资料
[1]https://zhuanlan.zhihu.com/p/626433991
[2]http://jcip.cipsc.org.cn/CN/Y2021/V35/I7/10
[3]https://arxiv.org/abs/2211.05994
[4]https://arxiv.org/abs/2305.15062
扫码加笔者好友,茶已备好,等你来聊,
笔者个人博客:https://zhpmatrix.github.io/,近期重大更新,欢迎逛一逛~