查看原文
其他

ChatGPT在医疗NLP场景的应用

zhpmatrix KBQA沉思录 2024-04-15

          前言:本篇文章的封面图片由机器自动生成。

        这是一篇迟到的文章随着ChatGPT的出圈,各种评测文章经非常多了。这篇文章希望站在医疗NLP的视角,以一个用户的身份,给出一些常见任务上的测试结果这篇文章不会过多讨论技术细节,这里可以参考InstructGPT官方一些说明以及张俊林老师等的文章。文章的最后,会针对自己的理解给出一些可以思考的地方。

        文章中的测试基本都是按照第一次测试的结果给出来,不存在CherryPick的问题。整体测试分为四个部分,分别是基础能力测试,医疗信息抽取能力测试,医疗产品能力测试和其他测试

具体测试问题列表如下:

  • 学术语区分

  • 代码

  • 医学实体抽取+属性识别

  • 医学术语标准化能力

  • 医疗关系抽取能力

  • 问句相似性匹配

  • 智能分诊

  • 合理用药

  • 病历质控

  • 其他测试

  • 失败测试


测试结果如下所示:

医学术语区分

        OMOP是笔者最近在关注的一个关于临床数据模型设计的工作,在此之前了解过UMLS,在看到OMOP的The Vocabulary的时候,觉得二者存在一定的相似性,因此尝试构建了一个专业度相对较高的问题给ChatGPT,回复如下:

        简而言之,OMOP专注于标准化EHR数据,而UMLS专注于整合不同的医疗术语体系,这个非常符合笔者现阶段的理解,又很精辟!

写代码

        这是笔者实际中遇到的问题,对于病历文书的存储,Java的同学会将文书通过base64进行加密之后存储在某个地方。但是作为写Python的同学,肯定要将对方给的Java的解密代码转化为Python才可以。Java的代码如下:

public static String getViewJsonContent(String v){ if (v!=null && v.length()>16) { String substringKey = v.substring(0, 16); String substringContent = v.substring(16, v.length()); String s = aesDecryptForFront(substringContent, substringKey); return s; } return null;}
/** * 文书内容解密 * @param encryptStr 文件内容16位(不包含)以后的所有 * @param decryptKey 密钥取文本加密后内容的前16位(包含) * @return */public static String aesDecryptForFront(String encryptStr, String decryptKey) { if (StringUtils.isEmpty(encryptStr) || StringUtils.isEmpty(decryptKey)) { return null; } try { byte[] encryptByte = Base64.getDecoder().decode(encryptStr); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES")); byte[] decryptBytes = cipher.doFinal(encryptByte); return new String(decryptBytes);
} catch (Exception var3) { var3.printStackTrace(); return null; }}

这是组里的算法小姐姐利用ChatGPT给出的Python的解密代码,如下:

Here is a possible Python implementation of the provided code:
Copy codeimport base64from typing import Optionalfrom Crypto.Cipher import AES
def get_view_json_content(v: Optional[str]) -> Optional[str]: if v is None or len(v) <= 16: return None
substring_key = v[:16] substring_content = v[16:] s = aes_decrypt_for_front(substring_content, substring_key) return s
def aes_decrypt_for_front(encrypt_str: str, decrypt_key: str) -> Optional[str]: if not encrypt_str or not decrypt_key: return None
try: encrypt_bytes = base64.b64decode(encrypt_str) cipher = AES.new(decrypt_key.encode(), AES.MODE_ECB) decrypt_bytes = cipher.decrypt(encrypt_bytes) return decrypt_bytes.decode() except Exception as ex: print(ex) return NoneNote that this implementation uses the Crypto library for AES encryption and decryption. You may need to install it using pip install pycrypto (or pip install pycryptodome for Python 3.7 and above).

结论是:亲测,我可以直接用!

        关于写代码的另外一个例子如下。场景是在做专病库的时候,会遇到很多可以通过正则就完成的抽取问题,因此这里给出一个从患者描述中做日期抽取的例子。在ChatGPT的回复中,不仅给出了正则表达式的写法,同时给出了具体的解释(解释性的问题,会在文末进一步分析),如下:

医学实体抽取+属性识别

        上述例子中,不仅正确识别了症状实体,同时正确识别了肯定和否定属性。除此之外,给出了识别的原因解释。

医学术语标准化能力

        这个回答并不算正确。ICD标准是国家标准,可以作为动态知识的一部分,而且ChatGPT在这个回答中,坦诚地说明了自己的知识的时间范围到2021年为止。最后,“胃MT”的翻译也并不算准确。

医疗关系抽取能力

        在这个例子中,非常正确识别到了时间关系,程度关系和因果关系。

问句相似性匹配

        在这个例子中,两个回答都是正确的,并且给出了正确的理由。在第二个回答中,针对术语“糖尿病”和“糖尿病肾病”做了区分。

智能分诊

        在智能分诊的场景下,能够正确的识别科室,同时针对给出的科室,做进一步的解释。

合理用药

        合理用药的例子采用的是阿里云的一次医疗NLP分享中讨论到的。虽然看起来说的很通顺,实际上是错误的!该场景下依赖ChatGPT对于药品和疾病知识的理解。实际上,单纯的基于合理用药的场景,训练一个BERT,通常也能够取得非常不错的效果。虽然业界某些做该类产品的团队是利用工程的方法,依赖一棵复杂的规则树来完成的。

病历质控

        第一个问题回答的很正确,而且给出了解释理由。第二个回答,也算不错的。

其他测试

        除了上述的医疗场景下的测试,针对PromptClue(https://www.cluebenchmarks.com/clueai.html)中的一些问题,也做了一些测试测试结果如下:

结论是:都正确!

失败测试

        除了上述成功的例子,也存在错误的情况,以下述任务为例:

基于投融资新闻的投资机构,融资机构,融资金额,融资轮次抽取任务

zhpmatrix,公众号:KBQA沉思录记一次模型探索过程(百度的UIE)

        最后一个问题,扎心了!

        以上,就是笔者的一些测试反馈,整体下来,个人认为amazing!!!除了上述回答,围绕ChatGPT,个人认为可以进一步思考的问题如下:

(1)ChatGPT的商业化

        何小鹏在最近的一个访谈中谈到,一般而言,有两种做事的路径。第一种是:业务需求->商业化方法->产品->技术;第二种是技术->产品->商业化方法->业务需求。通常认为,比较前沿的技术和产品,走的路径就是第二种。这样下来,似乎ChatGPT也要走第二种路径了,实则不然。

        笔者几年前的文章中写过一个观点,人工智能从业者之所以苦逼的一个原因之一是需求永远走在技术之前,客户太清楚的明白希望技术达到的水平了,从业者绝大多数情况下都在尽力追赶客户的预期。换而言之,需求以及需求的标准一直都在且没有改变。

        如今ChatGPT在效果这个维度上,大幅缩短了与预期之间的距离,这本身就是一个巨大的商业化的价值点所在。除此之外,基于大模型的生态衍生的新的商业模式,也是一个值得期待的方向。

        与之相关的是,前不久的基于Prompt的图像生成方向的一系列工作的商业化,比如:

盗梦师的故事

printidea,公众号:盗梦师AIGC赛道探秘丨西湖心辰 X 极客公园直播

(2)回答的可解释性

        在自己实测的例子中,印象很深刻的一点是生成的答案可以作为预测结论的可解释性依据。比如,在信息抽取的测试例子中,会在答案中告诉提问者,为什么抽取的结果是这样的?在其他测试中的例子中,情感分析的结论为什么会是这样?意图识别的依据是什么?都会在答案中给出。

        笔者并不确定为什么会这样,也许在训练过程中,会强化answer可解释性的正反馈。区别于之前的基于生成的方式做意图识别和情感分析只会给出一个结论,并不能给出一个得到结论的推理路径,这个方向上ChatGPT做的很赞。

(3)集中全球力量做成一件事情的又一案例

        19年的Magi着实给大家带来了一种冲击,但是这个系统虽然吸引了无数的用户,但是这些用户基本没有办法与这个系统形成友好的交互,继而无法拿到有效的反馈,记得当时比较多的一种交互是爬虫爬取Magi的数据,以至于Magi时不时会挂掉。

        但是ChatGPT通过提供一个非常不错的效果的版本的服务作为基础,以一种全球各种用户都能理解的对话的交互方式,吸引了无数的不同背景的共建者,构建了无数的对话流程(虽然大概率实际上以单轮对话为主)以及通过点击赞扬或者反对的简单操作,拿到了无数的反馈信号。

        这些信号的持续利用,会使得ChatGPT的效果持续提升,从而进入到数据飞轮效应。更多的数据->更好的对话效果->带给用户更多的价值->更多的用户->更多的数据。

        从这个角度而言,ChatGPT不仅是OpenAI的,更是全人类的。在没有搜索引擎的年代,答案存储于一个个的网页中,要想获取答案,理论上需要遍历这些网页;进入到搜索引擎年代,搜索引擎会告诉你很有可能的前几个答案,你自己来选择合适的答案,提升了知识获取的效率;进入ChatGPT时代,知识存储于一个巨大的数字矩阵中,你直接问,我直接答,知识获取的效率理论上接近最高。

(4)中文任务的效果,竟然都很棒

        在刚开始,笔者竟然不知道ChatGPT是支持中文的,但是实际上的中文任务上的测试,也显著超出了测试者的预期。

(5)ChatGPT,尚不完美

        虽然在上文中讨论了很多ChatGPT的亮点,但是也不乏缺点。

        ChatGPT通过量(效果更好)的飞跃带来了巨大的冲击力,实现了某些任务上的质的飞跃,但是作为一个语言模型,语言模型自身的本质问题并没有得到彻底的解决,我们有理由相信,一个“大”可以解决很多问题,但是不能解决所有问题。

        语言模型的基本问题。比如生成内容的可控性,比如生成内容的重复,比如内容生成中的Common Sense问题,比如更长上下文的理解问题等。

        知识的动态更新问题。在上文的某些回答中ChatGPT告诉我们,目前的知识截止到2021年为止,那么之后的知识怎么融入到ChatGPT中,实现知识更新和ChatGPT更新的无缝衔接?笔者相信在学术上一定已经有一些不错的解决方案。

      ChatGPT的普惠性。现阶段理论上全世界只有一个ChatGPT,而这个ChatGPT的知识基本上可认为是公开的知识,那么实际上仍旧存在很多的私有化的数据或者知识。如何实现在私有化的环境下,能够享受到ChatGPT的能力就是一个问题。如果我的数据不能给OpenAI,那ChatGPT能不能走进我?如果有一天我们谈到ChatGPT的时候,都不再提到OpenAI,那个时候将不只是ChatGPT的成功,更是OpenAI的成功。当然,这个问题不只是ChatGPT的问题,更是大模型的问题。

后记:Generative AI在2022年太长脸了,激动兴奋。

补充:

基于ChatGPT的生物医药知识抽取评测

森亿的病历生成应用

扫码加笔者好友,茶已备好,等你来聊~

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存