患者模拟,不一样的医疗大模型应用
这篇文章是《关于hippocratic.ai和glass.health的产品讨论》的后续实践篇。之前我们聊过产品思路和可能的技术实现,其中最亮眼的功能莫过于——患者模拟。

这个方向特别值得展开。传统在线问诊产品,更关注的是医生模拟——希望用算法辅助甚至替代医生完成具体工作(至于“要不要代替医生”,那是另一个无趣且没有意义的话题)。而这里聚焦的是患者模拟:利用大模型的能力,生成一个能跟人类医生对话的虚拟患者。
医生资源昂贵且稀缺,所以“机器换人”的讨论有现实基础。换个角度看,具备特定特征的真实患者同样稀缺——所以“机器换人”在这个场景下同样有意义。应用场景包括但不限于:年轻医生通过与模拟患者的对话提升医患沟通能力、医生能力培训与考核,等等。更进一步,这其实是个性化AI的一个实践方向,类似Character.ai的玩法,又带点心理咨询机器人的味道,总之让人兴奋。
之前那篇文章里,我们梳理了可能的技术实现思路:

这次实践保持一致性:设定一个带着宝宝的妈妈与儿科医生之间的对话场景,用大模型模拟那位妈妈。
按照上述思路,可以通过设计prompt来实现不同角色的模拟。这里分别用OpenAI的API和ChatGLM2-6B作为模型服务。
先用OpenAI模型扮演医生,简单prompt是:“假设你是一个儿科医生,我是一个宝宝的妈妈来就诊。开始我们的对话:

第一个问题:OpenAI的服务后端可能针对医疗问题做了特殊处理,导致模型似乎抗拒扮演医生。典型表现是“作为医生,我不能为您的宝宝开处方药”——这句话本身还有事实性错误。其次,模型回答过于严谨、受约束,风格与真实医患对话的节奏不一致。猜测这与指令微调阶段的QA构造范式有关,本质上是一种数据偏置。
再看ChatGLM2模型的效果:

经过优化的ChatGLM2在扮演医生上表现相对更好。典型的第二轮回答:“宝宝发烧3天了,而且有呕吐的症状,这让妈妈很担心。” 紧接着追问:“可以给宝宝多喝水吗?” 既有上下文利用,又有合理推理,还辅以恰当追问,效果符合预期。但问题也存在——废话偏多、语境不一致,比如第三轮的回答。
接下来用OpenAI模型扮演患者,prompt设计为:“假设你是一个宝宝的妈妈,宝宝刚满月过几天,经常一边吃,一边拉,好像吃坏肚子了,也好像着凉了。现在你带着宝宝来找医生就诊。医生问:宝宝腹泻几天了?你答:

整体对话流程相对流畅,不像扮演医生时那么抗拒。但也有明显问题:第三轮的回答暴露了模型只是在“扮演”患者——尤其是那句“请提供更多相关信息…”。
ChatGLM2的效果如下:

回答整体流畅,不过现实中似乎很少有每次回答都这么长的宝妈,存在一些废话。
接着,我们专注在自己训练的患者模型上。快速验证思路,采用主流技术路线:基于ChatGLM + SFT,微调方式用P-Tuning。目前还没有系统比较LoRA/P-Tuning等各种PEFT方案,感兴趣的读者可以自行探索。为了训练模型,首先需要医患对话数据。可以从好大夫等互联网问诊平台爬取,这里选用的是CCL2021的医患对话数据集(儿科),约2000个真实对话。这也是前面场景选择儿科的缘由。
考虑到上下文拆解,2000个真实对话进一步扩充,最终训练数据集约为原来的10倍。关键参数如下:
LR=1e-2 PRE_SEQ_LEN=128 python3 main.py --do_train --train_file $CHAT_TRAIN_DATA --validation_file $CHAT_VAL_DATA --prompt_column prompt --response_column response --history_column history --overwrite_cache --model_name_or_path ../THUDM/chatglm-6b --output_dir $CHECKPOINT_NAME --overwrite_output_dir --max_source_length 1024 --max_target_length 64 --per_device_train_batch_size 16 --per_device_eval_batch_size 32 --gradient_accumulation_steps 8 --predict_with_generate --max_steps 5000 --logging_steps 300 --sa ve_steps 625 --learning_rate $LR --pre_seq_len $PRE_SEQ_LEN
实际构造的训练数据格式如下:

针对患者模拟场景,自己训练模型的对话效果如下:

对话1-较短上下文长度
在较短上下文中,模型回答整体流畅。特别是第二轮回答“之前…现在”的转折,比较自然。但相比OpenAI和ChatGLM2,模型扮演的宝妈显得比较冷淡,回答简短,没有转折或追问,体验上未拉齐真实对话场景。

对话2-较短上下文长度
回答整体流畅,有正面回答也有内容补充。

对话3-较长上下文长度
较短上下文中,模型只能理解就近轮次的问答,基本是一问一答,体验生硬,达不到产品预期。对话3显著增加了上下文长度。第一个回答有现象描述、有追问;第三个回答有追问、有自己理解的潜在诊疗方法,且无事实错误。整体体验显著优于短上下文。
还有一些问题对话:

对话4-较短上下文
典型问题是“大便次数是每天34次”。这里的“34”可能是想表达“3、4”次。问题来源可能是训练数据中实际表述方式,也可能是模型只学到这是一个数字,具体量级不确定。第二轮补充回答与问题语义不一致。第三轮存在事实性错误。一个显著模式:前半句语义一致,但句子内部内容不一致。

对话5-较短上下文
这位“宝妈”心真大,宝宝咳嗽一周了,还大方地说“没去”。

对话6-较长上下文
“橘子”并不是“辛辣刺激性”的东西,这里存在事实错误。可能的原因是:实际对话中,宝妈否认了吃辛辣刺激性的东西,但补充说吃了非辛辣刺激性的东西比如橘子,模型因此混淆,认为橘子属于辛辣刺激性。第三个回答则完全偏离预期。
整体来看,虽然还有大量细节没有优化,但已经可以得出一个基本结论:这件事在技术上具备实际可行性。进一步可以往病种维度、科室维度延伸。功能上可以整合医生考试培训类产品,最终延伸到模拟医学这个大方向。

关于大模型的价值判断,一个核心观点是:热度总会回落到一个较低点,但只要这个较低点比上一轮热度回落的较低点高,就带来了实际价值——高度差就是大模型真正带来的价值区间。从目前社区所处的位置看,最热的阶段已经过去,但仍处于继续下落的区间,尚未到底。这恰恰是给大模型应用开发者留出的时间窗口。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名