医疗手写病历数字化:多模态大模型如何破解OCR难题
1. 项目概述:当AI医生遇上“天书”病历
在医疗信息化的浪潮里,有一个环节的进展始终步履维艰,那就是将堆积如山的纸质病历,尤其是那些由医生在匆忙中手写的“天书”,转化为结构化的电子数据。我接触过不少医院的档案室,里面塞满了孕产妇的病历记录(Maternity Case Record, MCR),每一页都承载着关键的健康信息,但想要把它们录入数据库,却需要数据录入员(Data Capturer)逐字逐句地人工辨认和敲打。这个过程不仅耗时费力、成本高昂,更棘手的是,手写体的千变万化、医学缩写的随意性、以及表格外挤满的备注,让传统的光学字符识别(OCR)技术频频“卡壳”。
传统OCR的工作原理,本质上是一种“像素到字符”的映射。它对印刷清晰、排版规范的文档效果拔群,但一旦面对连人类都需要结合上下文才能猜个大概的临床笔迹,其表现就大打折扣了。错误会像多米诺骨牌一样,从单个字符的误识别,蔓延到整个字段,最终导致提取出的数据完全失真。在医疗场景下,这种错误不是简单的数据偏差,它可能直接关联到对用药安全、妊娠结局的误判,风险极高。
近年来,多模态大语言模型(MLLMs)的崛起,让我们看到了破局的希望。这类模型,比如大家熟知的GPT-4o、Gemini,以及开源的Qwen2.5-VL系列,其核心突破在于不再将“看”和“读”割裂开。它们通过一个统一的Transformer架构,同时处理图像和文本信息。简单来说,当模型“看到”一个潦草的“P”和“83”挤在一起时,它不仅能识别笔画,更能结合对“产前检查”章节的上下文理解,推断出这很可能指的是“脉搏(Pulse)83次/分”。这种将视觉感知与深度语言推理相结合的能力,正是攻克医疗手写表单数字化的关键。
本文的实践,正是基于南非UBOMI BUHLE项目的真实需求。该项目需要处理来自17个产前诊所、约1.5万名孕妇的MCR表单,涉及HIV/AIDS治疗、结核病、高血压等多种合并症的监测。我们将以这个高风险的临床环境为试验场,深入评测主流MLLMs在真实、复杂的手写医疗表单上的表现。这不仅仅是一次技术选型,更是一次关于如何让前沿AI技术真正落地,解决医疗数据“最后一公里”瓶颈的深度探索。
2. 核心挑战与数据集构建:真实世界里的“脏”数据
在实验室里用清晰规整的打印体测试模型性能是一回事,面对真实临床环境中产出的手写表单则是另一回事。后者的复杂性,构成了本次评估的核心挑战,也决定了我们必须构建一个能反映这些挑战的数据集。
2.1 医疗手写表单的“三重门”
医疗手写表单的识别难点,远不止字迹潦草那么简单,它是一系列结构性、语义性和环境性问题的叠加:
- 笔迹的极端不一致性:同一份表单可能由多位医护人员在不同时间填写。这意味着笔迹风格、书写习惯、甚至用力程度都完全不同。时间压力下,字符常常粘连、重叠,笔画宽度不均,“0”和“6”、“7”和“1”难以区分。
- 结构与语义的溢出:标准表格的空间是有限的,但病人的情况是复杂的。负责的医护人员常常会在预留的复选框旁手写注释,将日期竖向书写以节省空间,或者在表格边缘空白处补充关键信息。如图1所示,在“医学与一般病史”部分,本该勾选的选项被手写了“No”;在“咨询”部分,日期被纵向书写。模型必须理解,这些“溢出”结构的信息同样是有效数据。
- 高度专业化的临床简写与编码:这是医疗领域特有的“行话”。例如,“NAD”代表“未发现异常”,“?”表示“未知”,符号“°”是“无”的简写。更复杂的是,医护人员会使用表单未定义的私有编码,比如用“1”代表“现使用者”,“2”代表“既往使用者”,“3”代表“非使用者”。传统OCR面对这些符号和代码几乎无能为力,而MLLMs则需要通过提示词(Prompt)学习这些领域特定的“翻译规则”。
2.2 数据集构建策略:从合成到真实,步步为营
为了系统性地评估模型,我们采用了分阶段的数据集构建策略,兼顾了合规性与真实性。
第一阶段:合成数据集初筛 我们首先创建了4份包含模拟数据的合成表单。这些数据完全虚构,不涉及任何真实患者信息,因此绕开了严格的患者信息保护法规(如南非的POPIA)。合成数据的价值在于:
- 快速迭代:允许我们安全、快速地测试大量模型,包括所有开源选项,进行初步筛选。
- 控制变量:虽然笔迹比真实数据更工整(见图1),但我们刻意复现了真实表单中所有的字段类型、布局和前述的“溢出”书写、简写等挑战。这帮助我们初步观察模型对数据结构的理解能力,而非单纯比拼笔迹识别。
第二阶段:真实脱敏数据集深度评估 核心评测基于49份真实的、经过完全脱敏处理的医疗表单。所有个人身份信息(姓名、身份证号、诊所编号等)和诊疗机构信息均被隐去,仅保留手写内容和表格框架。这些表单与合成数据集具有完全相同的结构,确保了评估的一致性。
我们将所有字段归纳为三类,这也是设计提示词和评估指标的基础:
- 离散选择字段:如复选框、单选列表(例如,分娩方式:自然分娩/NVD、剖宫产/C/S等)。评估重点在于分类的准确性。
- 格式约束字段:具有固定格式,如日期(DD/MM/YYYY)、数值(血压、血糖值及单位)。评估重点在于格式合规性与值提取的精确性。
- 自由文本字段:医生填写的备注、诊断描述等。这是挑战最大的部分,评估重点在于字符和单词级别的还原度。
通过这种“合成试水,真实攻坚”的数据策略,我们既能广泛筛选模型,又能确保最终结论建立在坚实的现实挑战之上。
3. 方法论:构建端到端的智能表单解析流水线
传统OCR流水线像一条分工明确的流水线:先做版面分析,分割出一个个文本框;然后进行字符识别;最后再做简单的后处理。任何一个环节出错,错误都会传递并放大。MLLMs的做法则截然不同,它更像一个“一眼看懂”的专家,采用端到端的架构,将整个文档理解任务视为一个“序列到序列”的问题。
3.1 模型工作原理:从图像到结构化JSON的一步跨越
现代视觉语言模型的工作流程可以简化为三个核心步骤:
- 视觉编码:模型将输入的表格图像分割成固定大小的图像块,每个块被线性投影为一个高维向量(嵌入)。这些向量序列构成了整张图像的视觉令牌,它们天然地保留了字符、单词和字段在页面上的空间相对位置关系。关键在于,这一步没有显式的字符分割或边框检测,模型是从整体上感知文档布局的。
- 跨模态对齐与理解:视觉令牌序列通过一个交叉注意力层,被映射到语言模型的嵌入空间中。此时,语言模型(LLM)可以同时“关注”视觉信息和任务指令(提示词)。例如,当语言部分解码到“分娩方式”这个字段时,它会主动去视觉令牌中寻找对应位置的笔迹信息。
- 自回归生成与结构化输出:语言解码器开始像生成文本一样,逐个令牌地生成输出。它基于之前生成的文本和当前的视觉上下文,预测下一个最可能的令牌。这不是简单的字符分类,而是利用了模型在海量文本中预训练获得的语言和医学知识。例如,看到一个模糊的像“C/5”的笔迹,结合上下文是“分娩方式”,模型更可能推断出是“C/S”(剖宫产),而不是字面识别为“C/5”。最终,模型直接输出我们预先定义好的JSON结构。
对于前沿的闭源MLLM(如GPT、Gemini),由于其生成过程本身就内嵌了强大的语义连贯性,后处理步骤被极大简化,通常只需解析JSON即可。而对于一些开源模型,其输出可能包含无关的标记或格式瑕疵,需要额外的清洗步骤。
3.2 前沿模型(闭源)评测流水线
我们对GPT、Gemini、Claude等系列模型采用了统一的API调用流水线,如图2所示,核心设计追求稳定性和可重复性:
- 输入准备:将医疗表单图像进行Base64编码,与精心编写的系统提示词(包含指令和空的JSON输出模板)一并提交给模型API。
- 确定性生成:将API的温度参数设置为0,确保每次生成的结果尽可能确定,便于评测对比。
- 鲁棒性处理:
- 指数退避重试:API调用失败时自动重试,避免因网络波动导致评测中断。
- JSON修复策略:模型输出偶尔会有细微的格式问题(如多余的逗号、引号)。我们首先尝试严格解析,若失败则触发一个自动修复程序(如
json-repair库),尝试挽救数据。无法修复的文件会被记录并排除在最终评估外,保证流水线继续运行。
- 递归式字段级评估:将模型预测的JSON与人工标注的“标准答案”进行逐字段递归比对。比对前,会对字符串进行标准化(如转为小写、去除首尾空格)。任何字段的缺失、错误或模型“幻觉”(凭空生成)出的多余字段,都会被记录为错误。
3.3 开源模型处理策略
我们评测了dots.ocr、Qwen2-VL-2B和Qwen2.5-VL-3B等开源方案。这里出现了两种不同的技术路径:
dots.ocr的两阶段解耦流水线:这是一种更传统的思路。第一阶段,使用视觉编码器(如TrOCR)专门负责“读图”,提取图像中的所有文本,生成一段“原始转录文本”。第二阶段,将这段原始文本和JSON模板、规则提示词一起,送入一个纯文本语言模型(我们使用Qwen2.5-7B-Instruct)进行“理解”和“结构化”。这个语言模型的任务是根据提示词中的规则(如日期格式化、缩写解析),将杂乱文本填充到正确的JSON字段中。这种解耦的好处是灵活,可以分别优化OCR和NLP模块。- Qwen-VL系列的单阶段端到端流水线:其流程与前沿模型类似,模型一次性完成从图像到结构化JSON的输出。区别在于模型在本地运行,而非调用云端API。
提示:选择两阶段还是单阶段,取决于实际需求。两阶段方案对硬件要求可能更低(可以先在GPU上跑OCR,再在CPU上跑小LLM做解析),且中间产物(原始文本)可审计、可干预。单阶段方案更简洁,可能减少错误累积,但对端侧算力要求更高。
3.4 提示词工程的艺术:教会模型“医疗行话”
对于未经微调、直接使用的MLLMs,提示词的质量直接决定了性能上限。我们的提示词工程围绕两个核心目标:约束输出空间和注入领域知识。
我们设计了两套提示词模板:
- 基础模板:仅包含字段名称和类型的空JSON结构。
- 优化模板:在基础模板上进行了关键增强,这也是我们大部分评测所使用的:
- 离散化约束:对于离散选择字段,直接在JSON Schema中枚举所有可能值。例如,
"delivery_type": ["NVD", "C/S", "TOP", ...]。这相当于告诉模型:“这个字段的答案,只可能是列表中的某一个”,极大地减少了模型“胡思乱想”的可能。 - 16条领域规范化规则:这是提示词的精华,直接编码了医疗表单的“潜规则”。例如:
- 日期格式化:所有日期必须输出为
DD/MM/YYYY,月份和日期不足两位用零补齐。 - 缩写解析:遇到“NAD”应输出“No abnormalities detected”;“?”应输出“Unknown”。
- 复选框编码:解释手写“No”与复选框空白均表示否定。
- 血压字段拆分:将“120/80”拆分为
{"systolic": 120, "diastolic": 80}。 - 私有编码翻译:明确告知模型“1=现使用者,2=既往使用者,3=非使用者”。
- 日期格式化:所有日期必须输出为
- 离散化约束:对于离散选择字段,直接在JSON Schema中枚举所有可能值。例如,
通过优化模板,我们将大量本应在后处理中进行的文本清洗和标准化工作,前移至推理阶段,让模型在生成时就直接产出“干净”的数据,这在大规模处理时能节省大量成本。
3.5 评估指标:多维度透视模型能力
我们采用了一套组合指标来全面评估模型,而不仅仅是看一个总体准确率:
- 全局字符串准确率:最严格的指标,要求字段预测值与真实值完全一致(标准化后)。我们报告中位数以及第16和第84百分位数,以反映不同表单间的性能波动。
- 分类型评估:
- 离散选择字段:采用宏平均和加权平均的精确率、召回率、F1分数。宏平均平等看待每个类别(如“阳性”、“阴性”、“未知”),能暴露模型在稀有类别上的识别能力不足;加权平均则考虑了类别样本数,其高分可能由“空值”类别的超高准确率主导。
- 格式约束字段:评估输出是否符合预定格式(如日期格式)且值正确。
- 自由文本字段:使用词错误率和字符错误率。WER/CER越低越好,1.0意味着每个词/字符都错了。
- 幻觉率:模型在真实值为空或不存在时,自行生成内容的字段比例。在医疗场景下,即使是低幻觉率也可能是致命的。
- 分区块准确率:将表单按章节(如“检查”、“医学病史”)分别计算准确率,以识别模型在不同类型信息区块上的强弱项。
4. 实战性能评测:谁才是医疗表单的“最佳读者”?
我们测试了涵盖OpenAI、Google、Anthropic及开源社区的共17个模型。评测分为两步:先在4份合成表单上进行快速筛选,再在49份真实表单上进行终极考验。
4.1 合成数据初试:强者恒强,规模与新知是关键
在合成数据上,一个清晰的结论是:更新、更大的模型普遍表现更好。这体现了MLLM领域“规模带来能力”的规律。
- 性能梯队:Gemini 3.1系列(尤其是Flash Lite)和GPT-5.4表现最为突出,总体准确率(排除空字段)分别达到83%和76%左右。而较小的开源模型(如Qwen2.5-VL-3B)和预算型闭源模型(如GPT-5-Mini)则大幅落后,差距可达40个百分点以上。
- 一个反直觉的发现:推理能力并非唯一决定因素。Gemini的“Flash”版本(设计上更轻量、推理能力较弱)在多项任务上表现与甚至优于其“Pro”版本。GPT-5.4也在一些指标上超越了更昂贵的GPT-5.2 Pro。这表明,模型在视觉文档理解上的最新改进,可能比单纯的推理token数量更重要。
- 开源模型的困境:在合成数据上,最好的开源模型(Qwen2.5-VL-3B)准确率也仅34%,与传统OCR相比或有提升,但与顶级闭源模型差距明显。这主要受限于其参数量、训练数据和多模态对齐的精良程度。
- 格式与自由文本:在格式约束字段(如日期)上,Gemini 3.1系列依然领先。在自由文本字段上,所有模型的WER都较高(最佳为0.33),说明完整还原长段、含专业缩写的自由文本仍是巨大挑战。但CER相对较低,表明模型一旦识别出单词,字符级的准确度尚可。
4.2 真实数据决战:差距缩小,细节定胜负
在更复杂、更“脏”的真实数据上,顶级模型之间的差距显著缩小(通常在5%以内),但模型家族的特色和具体字段的挑战被放大。
- 总体表现:Gemini 3.1 Pro和GPT-5.4成为双雄,中位准确率(排除空字段)分别为78%和76%。Claude家族整体落后约10个百分点。GPT-5-Mini因无法理解优化模板中的离散选项列表(直接原样输出列表),性能暴跌,这凸显了模型遵循复杂指令能力的重要性。
- 格式字段的“水分”:包含空字段的格式准确率都很高(GPT-5.4达89%),但这很大程度上是因为模型正确识别了“空白”。当排除空字段后,所有模型表现均大幅下滑,Sonnet 4.6以77%领先。这说明,识别“有内容”的日期和数字,远比识别“空白”要难。
- 自由文本:真正的“硬骨头”:切换到真实数据后,所有模型的WER和CER均显著上升。最佳表现的Gemini 3.1 Pro,WER也高达0.5(即一半的词是错的)。这主要是因为真实表单中的自由文本包含大量非标准缩写(如“P83”指脉搏)、极潦草的笔迹和表格外的补充说明,模型经常直接遗漏这些内容。
- 幻觉率:所有模型均存在不可忽视的幻觉,最佳表现的GPT-5.4为6%,Gemini 3.1 Pro为8%。在医疗场景中,这意味着每处理100个字段,就可能产生6-8个完全虚构的数据点,这是绝对不能接受的。必须通过后置的人工审核或一致性校验来兜底。
4.3 分项能力深度剖析
为了给实际选型提供更精细的指导,我们深入拆解了模型在不同任务上的表现:
1. 离散选择字段的分类能力 如表3所示,如果看加权F1分数(受常见类别主导),所有模型表现都不错(0.83-0.91),Gemini 3.1 Pro最佳。但一旦切换到宏平均F1(平等看待所有类别,包括罕见类别),所有模型的分数都骤降至0.15-0.66。这揭示了一个关键问题:模型倾向于预测高频类别(尤其是“空值”或“阴性”),而对罕见但临床意义重大的类别(如某种特定并发症)识别能力很弱。在实际部署中,必须对少数类别给予额外关注,或通过数据增强、针对性微调来弥补。
2. 不同表单章节的表现差异 表4和图5清晰地展示了模型能力的“长板”与“短板”:
- 优势章节:主要由复选框和单选列表构成的章节,如“医学与一般病史”、“未来避孕”,模型准确率普遍超过90%。这类任务相对简单。
- 劣势章节:“检查”部分是所有模型的噩梦,最高准确率仅56%。原因在于该部分日期书写混乱、自由文本(如“其他”备注)极难识别、且包含大量医学简写。
- 明星时刻:在全是日期字段的“咨询”部分,GPT-5.4取得了100%的中位准确率,大幅领先其他模型。这表明不同模型在处理特定类型字段时可能存在独特优势,混合使用或根据字段类型路由任务可能是一个优化方向。
3. 最佳与最差字段分析 表5列出了模型集体表现最好和最差的字段,以及最容易产生幻觉的字段。
- 最佳字段:如“是否讨论过”,准确率高达98%,通常是结构清晰的复选框。
- 最差字段:如“妊娠期糖尿病筛查2”,准确率为0%。这类字段往往单位不统一(mmol, mmol/L混用)、笔迹差、且可能被错误地识别为其他类似字段。
- 最易幻觉字段:“EDD方法”幻觉率高达100%。我们发现,模型经常将复选框的视觉布局本身误判为已勾选。例如,一个方框旁边印着“超声”,即使框内空白,模型也可能输出“超声”。这提示我们,在提示词中必须明确描述复选框的识别逻辑(如“仅当框内有‘X’或勾号时才视为选中”)。
5. 部署考量与避坑指南
基于以上评测,如果你计划在实际项目中部署MLLM进行医疗表单数字化,以下是我总结的核心建议和避坑点:
5.1 模型选型:没有银弹,只有权衡
- 追求极致准确率与低幻觉:Gemini 3.1 Pro和GPT-5.4是首选。它们在综合性能、格式字段和自由文本处理上最为均衡,且幻觉率相对最低。Gemini 3.1 Flash Lite是极具性价比的替代品,性能接近Pro版,但成本更低、速度可能更快。
- 成本敏感型项目:可以考虑Claude Haiku或GPT-5-Mini,但必须接受其在复杂指令理解和离散字段上的显著性能下降。绝对不要将它们用于关键字段的提取,或必须辅以严格的校验规则。
- 开源与可控需求:目前,Qwen2.5-VL-3B是开源最佳选择,但需做好准确率显著低于第一梯队(约30-40个百分点)的心理准备。它更适合对数据隐私要求极高、且能接受较高人工复核比例的场景。两阶段的
dots.ocr方案在特定场景下可能更灵活。 - 重要提示:模型迭代极快。本次评测中的“小模型”在未来一两年内性能可能会大幅提升。选型时务必进行当前版本的POC测试。
5.2 提示词设计:成败的关键
- 结构化输出是必须的:务必使用JSON Schema严格定义输出格式,并为离散字段枚举所有可能值。这能极大减少模型输出乱码。
- 领域规则必须前置:将日期格式、缩写全称、单位转换、私有编码等规则,清晰、无歧义地写在系统提示词中。不要指望模型能自动学会医院的“黑话”。
- 明确视觉元素逻辑:对于复选框、单选按钮,必须用文字明确描述何种视觉状态代表“选中”、“未选中”或“不适用”。避免使用“是/否”等模糊描述,而用“如果复选框内有手写的‘X’或勾号,则输出‘是’,否则输出‘否’”。
- 分而治之:如果表单不同部分差异巨大,可以考虑设计多个专门的提示词,分区域截图识别,而非用一个大提示词处理整页。这能提升复杂章节的准确率。
5.3 后处理与人工审核:不可或缺的安全网
- 设立置信度阈值与人工审核队列:模型输出应附带置信度分数(如果API提供)。对于低置信度结果、关键字段(如诊断、用药)或已知易错字段,必须自动流入人工审核流程。
- 设计一致性校验规则:利用医学逻辑设计规则。例如,“分娩方式”为“剖宫产”,则“产程时长”可能应为空或特定值;收缩压应高于舒张压。违反这些规则的记录自动标记待查。
- 构建反馈闭环:将人工审核纠正后的数据,作为“标准答案”持续收集起来。这些数据可以用于定期评估模型性能的漂移,更重要的是,可以作为高质量数据用于后续的模型微调,从而不断提升在特定医院、特定表单上的专属性能。
5.4 关于开源方案的现实考量
当前,开源MLLM在医疗文档数字化这个高精度要求任务上,仍难以与顶级闭源模型抗衡。其主要瓶颈在于:
- 多模态对齐质量:如何让视觉特征与语言语义空间完美对齐,需要海量的高质量图文对数据和精巧的训练技巧,这正是开源社区追赶的难点。
- 领域知识匮乏:通用开源模型的训练数据中,高质量、结构化的医疗手写表单数据极少。
- 指令遵循能力:处理复杂、长篇幅的领域特定提示词的能力较弱。
因此,现阶段开源方案更适用于对准确率要求相对较低(例如,用于初步归档和检索)、或作为复杂流水线中特定环节(如先用开源模型做初筛和分类)的场景。如果选择开源路线,投入精力进行领域自适应微调几乎是必经之路。
医疗手写表单的数字化,是一条从“看得见”到“读得懂”的漫长征途。多模态大语言模型无疑是一盏强光灯,照亮了前路。它告诉我们,单纯提升“视力”已接近瓶颈,而融合了世界知识的“阅读理解”能力才是破局关键。本次评测表明,最顶尖的模型在结构化字段上已接近实用,但在自由文本和罕见类别识别上,仍需要“人工+规则”的坚固护栏。技术选型没有标准答案,它永远是性能、成本、合规性与可控性之间的平衡。我的体会是,与其追逐某个“全能冠军”,不如根据表单不同字段的难度和重要性,设计一个“模型路由+规则校验+人工兜底”的混合智能流水线。例如,用大模型处理复杂段落,用小模型或规则引擎处理标准化复选框,将宝贵的专家审核精力,精准投入到那10%最棘手、最关键的字段上。这条路虽不完美,但已是目前将沉睡的纸质医疗数据唤醒,让其真正服务于临床与科研的最优解。