×

技术|大语言模型下的中医药信息抽取:从理论到应用

hqy hqy 发表于2025-04-08 00:03:41 浏览45 评论0百度已收录

抢沙发发表评论

大语言模型下的中医药信息抽取:从理论到应用

# 01

大语言模型在中医药信息抽取中的应用现状

  LLM在自然语言处理领域展现出强大的通用能力,也逐步应用于中医文本的信息抽取任务。

  中医药文本包含疾病诊断、症状描述、方剂组成等丰富内容,但语言形式复杂(包括古汉语、中医术语),给自动抽取带来挑战。将ChatGPT等大型模型应用于中医命名实体识别(NER)和关系提取(RE)可以取得“零样本”或“小样本”下可用的效果。例如,有研究在无需额外训练的情况下,让GPT-3.5和GPT-4直接对中医COVID-19文献进行NER标注,结果显示GPT-4在大多数实体类型上取得了比BERT问答模型更高的模糊匹配召回率,但在精确匹配上仍略逊于专门微调的模型。这说明LLM在中医领域具备一定抽取能力,尤其在识别变体表述、提升召回方面有优势。

    与此同时,一批专门面向中医的领域LLM相继涌现。例如,浙江大学等推出了TCMChat模型。清华大学等研发了BianCang中医LLM,采用两阶段训练将中医领域知识注入模型,再通过指令微调提升模型对中医诊断和辨证的理解。BianCang模型构建了大规模中医语料(包括真实医院病历和来源于《中国药典》的中医药数据集ChP-TCM),连续预训练并监督微调,从而在中医问诊、辨证等任务上显著优于通用模型arxiv.org。另有研究发布了Qibo、JingFang等中医对话模型,用于模拟专家诊疗和方剂推荐。这些模型通过在中医教材、古典医籍和临床记录上训练,掌握了中医专业术语和推理方法,在疾病问答、病例分析等应用中表现出接近专业水准的回答能力

    除了对话问答,学者们也开始探索利用LLM直接执行信息抽取任务。例如,Zhu等人(2024)比较了多个中英大型模型在中医命名实体识别任务上的表现,包括开源的ChatGLM2-6B、GLM-130B,以及OpenAI的GPT-3.5和GPT-4。他们针对中文电子病历数据进行零样本和少样本提示,发现模型规模越大效果越好:GPT-4在零样本条件下的F1比分别比6B的ChatGLM提升了约0.109,在公开医疗NER数据CCKS2017上达到接近0.80的F1。这证明大型模型有潜力胜任中医NER。然而,他们也指出,这些LLM与有监督微调的专用模型仍有显著差距——即使GPT-4这样的模型,零样本F1仍比专门训练的BERT序列标注模型低约10个百分点。为进一步提升,研究者尝试对ChatGLM2-6B进行指令微调(在中医NER数据上持续训练),结果F1大幅提升了16%以上,接近甚至超过GPT-3.5的水平。这表明经过中医领域数据微调后,中小规模LLM的性能可显著改善,但要达到最佳效果,LLM的参数优势依然关键

    另一项研究 Tong等人(2024)针对中医新冠文献搭建了一个包含6类实体的小型评测数据,比较了GPT-3.5、GPT-4与4种BERT问答模型的抽取表现。结果显示:在宽松匹配(模糊匹配)评测下,ChatGPT(GPT-4)在5/6个实体类型上超过了BERT模型,而在严格匹配下,BERT模型在5/6类型上略胜一筹,但差距不大。尤其是对于“中药方剂”和“中成药成分”等实体,GPT-4展现了显著优势,能更灵活地识别多种别名和组合。不过,各模型在精确F1上均未超0.5,GPT-4也仅略优于微调模型,说明中医领域抽取任务仍具挑战。研究还发现ChatGPT倾向于高召回低精度,即识别出更多候选但准确率偏低,需要后续过滤。因此,在注重召回的场景下,LLM有价值;但在严谨知识获取场景下,单纯依赖ChatGPT或BERT问答都不足以满足专业要求,需要结合领域校验和知识库辅助。

    值得关注的是LLM还被用于构建中医知识图谱,整合抽取结果以服务下游应用Zhang和Hao(2024)利用大型模型执行中医知识图谱构建,实现了对中医文献的大规模实体关系抽取和结构化。他们采用iFlytek Spark(一种中文开源对话LLM)和ChatGPT对海量中医文本进行处理,提取实体及其关系并存入图数据库。实验表明,通过精心设计提示词(包括角色设定和示例),Spark模型在NER任务上取得了90.36%的F1,而ChatGPT经过匹配示例提示也达到87.73%的F1。这样的性能已逼近传统有监督模型的水平(>90%),展示了LLM结合提示策略在信息抽取上的高效性。更重要的是,该研究将抽取的实体和关系用于构建中医知识图谱。同时面向疾病的问答系统也有进展。通过将LLM与知识检索相结合,TCM病例问答系统在答案相关性和真实性方面得分较高(RAGAS评估中faithfulness达0.9375)。这说明LLM不仅能直接抽取信息,还能与知识图谱融合,在中医决策支持中发挥作用。

    综上所述,当前LLM在中医信息抽取中的应用研究蓬勃发展。一方面,通用LLM(如GPT-4、ChatGPT)经验证在中医NER/RE任务上具有可用性,能在缺乏标注数据时提供基本抽取结果。另一方面,融合中医知识的专用LLM(如BianCang、TCMChat)不断涌现,在中医问答和诊断任务上取得突破,为信息抽取提供了更深的领域支撑。随着指令微调、提示工程等技术的发展,LLM在中医信息抽取的性能差距正逐步缩小,并展现出将抽取结果用于知识图谱、问答等实用系统的潜力。下面将详细对比LLM与传统方法在中医信息抽取方面的表现。

# 02

大语言模型与传统方法技术对比

    传统的信息抽取方法通常将任务建模为序列标注(用于实体识别)和分类(用于关系判定)问题。例如,早期大量工作采用BiLSTM+CRF架构:双向LSTM提取上下文特征,接上CRF层捕捉标签间约束,实现对每个字/词的标注。这一架构能够编码局部序列信息,并通过CRF确保输出的标注序列合法(例如开头标记B后面必须跟I或O),在中文NER中曾广泛使用。但其不足是对长距离依赖和全局语义把握有限,而且特征表示能力受限于LSTM的隐藏维度。随后,预训练语言模型BERT的出现为NER提供了强大的上下文表示:通过对大规模语料预训练双向Transformer编码器,BERT能输出每个词丰富的语义向量。将BERT与CRF结合(BERT-CRF)成为新主流,可大幅提升实体识别性能peerj.com。例如,在中医NER领域,Hou等(2024)指出BERT-BiLSTM-CRF已成为事实上的基线架构,因其融合了BERT的语义特征和LSTM的顺序依赖、CRF的标签一致性,各组件优势互补。然而,他们也发现简单叠加BERT+LSTM+CRF并不一定带来提升,反而可能因中间LSTM干扰了BERT输出的表达而降低效果。因此传统方法开始探索改进结构,如采用并行注意力网络而非串行LSTM,以充分利用BERT的表示能力。相比之下,大语言模LLM语言模型采用完全不同的范式:它通过提示词将信息抽取视作一个文本生成任务。模型接受一个包含指令和待处理文本的prompt,直接生成包含所需信息(实体列表或关系三元组等)的输出,而非逐字打标签。这种范式的优点是可以利用LLM的世界知识和语言生成能力,隐式完成理解、推理和抽取的全过程,无需专门设计网络结构来建模依赖。但同时,由于是生成而非分类,输出格式需要精心约束,否则可能出现偏差或不一致,需要后处理来解析。

    在有充足标注数据时,传统有监督方法通常能达到更高的精确度。例如,在前述BERT+CRF模型作为基线的实验中,F1往往能达到80%以上某些优化方法可达88-92%Hou等报告其改进的Dyn-Att-BERT模型在公开中医电子病历数据上F1达81.91%,比BERT+LSTM+CRF提升约1.5个百分点)。同时,集成词典信息的SoftLexicon模型F1也超过80%。相比之下,未经微调的LLM零样本直接抽取的性能往往稍逊。例如,Zhu等测得GPT-4在CCKS2017医疗NER数据上的F1约为0.80左右而精调的RoBERTa序列标注模型可达0.87-0.91。ChatGPT(GPT-3.5/4)在中医COVID文献6类实体上精确匹配F1平均不足0.5,而一个微调的领域模型GSAP-NER略高于GPT-4,达到0.5左右。可见,在严格评价下,LLM当前仍落后于专用模型。这主要因为LLM未经过该任务的监督优化,输出往往混入无关内容,降低精度。

    然而,生成式模型在召回率和泛化能力上展现出优势。Tong et al.发现,GPT-4对罕见实体或非常用表述的识别能力强于BERT问答模型,在“模糊匹配”标准下,GPT-4在绝大多数任务上F1高于BERT模型。这意味着LLM善于捕捉多样的表达方式,哪怕与训练语料不完全匹配,也能依据语义线索识别。这对中医文本尤为重要——中医症状和药材往往有别名、隐喻说法(如“咳嗽痰黄”亦可表述为“咳吐黄黏稠痰”)。微调模型若未见过特定表述,可能漏掉实体;而LLM凭借预训练的广博知识,有较强的语义泛化,因而召回更高。举例来说,GPT-4在提取“银翘散”组方中的药物时,能够识别文本中提到的各种药名(连翘、银花等)的不同写法,这种弹性是规则/分类模型欠缺的。

    此外,LLM还能一并完成实体分类和关系推断,减少了错误传播。在传统方法中,需先识别实体再两两判断关系,流程繁琐且错误可能累积。而LLM可在读取全文后,结合上下文直接生成成对的实体关系。比如某中医病例:“症见咳嗽痰黄,证属痰热郁肺,治以清热化痰,方用清金化痰汤。” 人工标注的三元组可能为:(痰热郁肺, 治疗, 清金化痰汤)、(清金化痰汤, 主治, 咳嗽痰黄) 等。微调模型需要分别识别出“痰热郁肺”为证候、“清金化痰汤”为方剂、“咳嗽痰黄”为症状,再通过规则判定它们的关系。而LLM只需一个指令就可能输出这些对应关系Zhang & Hao的研究中,他们使用逐步提示让Spark模型先抽取实体,再以实体对为条件提示模型判断存在何种关系,最终产出完整三元组列表。这种生成式的关系提取思路避免了繁琐的二分类遍历,在知识图谱构建中展现出高效性。值得一提的是,他们引入自我验证(self-verification)机制,让LLM生成答案后再检查修正,从而将Spark模型的NER F1由88.21%提高到90.36%,证明了LLM可以通过自身反思来增强准确性。这一点是传统模型无法实现的创新之处。

    使用BERT或BiLSTM-CRF等方法需要标注语料和任务特定训练。以中医NER为例,需人工标记大量医疗文本的实体边界和类别,然后进行模型训练调参。这对进入一个新领域(如出现新疾病、新疗法)时成本很高。然而,LLM可以利用少量示例甚至零示例,通过提示进行即时推理,大大降低了启动成本。例如,当出现COVID-19这样的新疾病时,几乎没有专门的中医NER训练数据,但LLM已经读过相关文献,可以零样本提取出“新冠肺炎”及其中医症候、方剂等信息。这对于应急事件或冷门领域信息抽取非常宝贵。当然,传统模型也可以通过迁移学习改进,例如使用通用医疗NER模型在少量新数据上微调。但LLM无需显式微调即可获取尚算可用的结果,极大提升了开发效率。

    不过,LLM的计算开销明显高于小模型。BERT中文基座一般1亿参数,可在普通GPU上较快运行推理并处理长批次文本。而GPT-4等模型参数在数百亿以上,每次调用费用不菲,且速度较慢,限制了其实时处理大量数据的能力。即使开源的7B或13B模型(如Qwen-7B、ChatGLM-6B)可以本地部署,其推理速度也不及小模型。为平衡性能与效率,实际应用中常采用两阶段方案:先用规则或小模型粗筛,再用LLM精抽取重点段落;或者只对模型不确定的部分调用LLM做增强。这样利用LLM强在复杂推理、弱在批处理的特点,达到优化组合。

    总的来说,BERT等早期方法在中医信息抽取中依然具有高精度、可控性和速度优势;而生成式LLM则提供了高泛化、低门槛和强推理的新视角。二者并非完全对立:事实上,一些最佳方案开始将LLM与传统模型结合,扬长避短。例如,用LLM生成伪标签数据辅助训练BERT模型,或用BERT结果作为LLM提示的参照进行纠错。这些融合思路有望进一步提升中医信息抽取的效果,并降低开发维护成本。在没有充足标注数据时,LLM的表现虽稍逊但可作为有效的起点;而在要求苛刻精度的场景,微调小模型仍是首选方案,之后可通过LLM校验补充以达到更高的全面性和智能性。

# 03

中医信息抽取的数据集、评测

    目前中医信息抽取领域有一些公开的数据集可用于模型训练和评测。其中一个常用数据集是由百度提供的中医电子病历NER数据集。该数据集包含6,574条中医电子病历句子,标注了11种实体类型,涵盖了中医诊断、证候、治疗、中药、方剂、临床表现等类别。例如其中将“柴胡达原饮治疗脾胃湿热型功能性消化不良随机对照试验”一句标注为处方名、证候、疾病等实体。训练集约5,259句,验证集657句,测试集658句,实体总数15,846个。每个字采用BIO标注格式。该数据集覆盖面广,已被多篇研究用来评测中医NER模型性能。

     CCKS也多次举办医疗信息抽取相关评测。例如CCKS2017提供了一批中文临床病例数据,用于疾病、症状等实体识别和关系抽取任务,成为学术研究中的标准测试集之一。在前文提及的比较研究中,研究者使用了CCKS2017的数据来评估ChatGPT、ChatGLM等LLM对医疗实体的抽取性能,并与传统模型结果对比。结果表明GPT-4在该数据上的零样本F1约0.78,而微调的模型可达0.87以上。这套数据对标了医疗NER的难度,在其中应用LLM具有代表性意义。

    针对中医药文献领域,Tong等人自行构建了一个TCM-COVID文献数据集。他们收集了389篇有关中医防治新冠的科研文章,并选取其中48篇进行人工标注,定义了6类实体(涉及中药方剂、中药成分、症状、靶点、研究方法等三大领域)。这个数据集较小但包含跨领域的实体类型,用来测试LLM在跨领域中医实体识别上的能力。虽然未公开大规模提供,但作为对比实验已在论文中报告结果(如上一节所述GPT-4与BERT模型的性能差异)。

    在中医药知识图谱方向,Zhang & Hao(2024)工作中涉及的数据来源较为多样。他们从中医文献、中药百科等收集数据,用LLM抽取知识。具体包括:爬取百度百科的中药材InfoBox作为结构化信息来源;以及若干公开中医疾病、方剂数据库等。由于这些数据大部分未公开成标准数据集格式,该工作更偏重构建流程而非提供可复现数据。不过,其附录中给出了知识图谱样例,例如“银翘散”的部分相关实体和关系图(如疾病“肺痈”与证候、方剂等的连接)。这些实例为评估模型提取关系的准确性提供了直观依据:可检查模型输出的图谱与人工梳理的专家知识是否一致。

    除了上述领域数据,中医专利、古籍也是信息抽取的数据来源之一。例如Fu等人(2021)构建了中医药专利NER数据集,用于识别专利文本中的中药名称、人群、应用领域等,并采用BiLSTM-CRF进行抽取。另外,一些研究利用古代医案和经方注释作为测试,例如CCKS2020曾有任务要求从《伤寒论》等古籍中抽取证候和方剂的对应关系。虽然这些数据集未大规模公开,但对应论文提供了抽取结果,可用来对比模型对文言文的处理能力。

    评测指标: 中医信息抽取主要采用与一般信息抽取相同的评测指标,即精确率(Precision)、召回率(Recall)和F1值。F1值是精确率和召回率的调和平均,是衡量模型综合性能的主要指标。通常以实体或关系为单位计算,即:

精确率 = 提取出的正确项数量 / 提取出的总项数量。反映模型输出的准确性。

召回率 = 提取出的正确项数量 / 参考答案中的总项数量。反映模型漏掉信息的情况。

F1 = 2 * 精确率 * 召回率 / (精确率 + 召回率)。当精确率和召回率权衡时,F1提供了平衡的评估。

    在NER任务中,精确率代表模型标出的实体中有多少是正确的,召回率代表标准答案的实体有多少被模型找出。例如Hou等的数据集上,其Dyn-Att模型达到Precision 80.26%、Recall 83.76%,对应F1=81.91%。这种水平表明多数标注实体都能被正确识别且误识别不多。在关系抽取(RE)任务中,精确率和召回率类似定义于正确三元组的抽取。由于关系抽取往往基于先识别实体,如果实体错了关系必错,因此RE的评测通常要求实体和关系都正确才算匹配。

    需要注意的是,不同研究有时采用严格匹配和松散匹配两种评测方式。严格匹配要求实体文本边界和类别都完全一致才能算正确,否则即使识别了同义词也视为错误;松散匹配(又称模糊匹配或部分分值)则在实体意思正确但表述略不同的情况下给予部分奖励。例如“发热”与“高热”在严格评测下算不同实体,但松散评测可能视为匹配。这两种评测会导致模型排名出现差异:如上文所叙述,Tong等的研究中,ChatGPT在松散评测下超过BERT模型,但在严格评测下略逊一筹。因此在报告结果时通常会指明采用何种评测准则。主流做法还是使用严格的F1,以推动模型提升精细准确度。

    综观近期文献,中医NER任务上有监督模型(如BERT-CRF系列)F1大多在80-90%区间。例如:Yan et al. (2021)报道BiLSTM-CRF基线约76.4%,而加入BERT后提高到81.2%Hou et al. (2024)的Dyn-Att Net模型达到81.9%;一些融合知识库的方法据称可超过85%甚至接近90%。生成式模型未经微调直接应用时,F1常见在60-80%区间(依赖任务难度)。通过少样本提示和一些技巧(如角色扮演、拆解任务),LLM的F1可逼近甚至超过80%。例如上文MDPI知识图谱构建研究中,SparkLLM在few-shot提示下NER F1=90.36%,已经达到当前最优水平。总的来说,在有高质量提示或经过指令微调后,LLM的抽取性能可以与传统模型相媲美。因此评测中需要区分模型是否有微调。如LLM微调后实际上已成为一个专用模型,其成绩也可进入90%高段位;而零样本LLM则更多用于资源不足场景下的参考,F1能到70%左右已相当可观。今后随着更LLM出现和更丰富的中医语料参与预训练,我们有望看到生成式方法在标准评测中进一步缩小与甚至超越传统方法的差距。

# 04

 实践教程:使用Qwen、 DeepSeek R1等模型进行中医药信息抽取

  本节将通过逐步教程演示如何调用开源LLM(以 Qwen 和DeepSeek R1 为例)进行中医信息抽取,包括实体识别和关系提取。我们将介绍本地调用模型和API调用两种方法,并包含具体代码示例、结果保存和解析的过程,帮助读者使用自己的数据集进行抽取实践。

4.1 本地调用模型

4.1.1 环境准备与模型获取

首先,确保已经安装必要的Python库,例如 Transformers(用于加载 HuggingFace 上的模型)以及PyTorch或TensorFlow作为后端。如果使用Qwen系列模型,需要Transformers版本>=4.37.0以支持其自定义架构。例如,可以通过pip安装最新版本:

```bashpip install transformers==4.38.0

  此外,如果计划调用DeepSeek R1模型,可以选择通过 HuggingFace 提供的蒸馏模型来使用。DeepSeek R1的原版模型参数规模很大(上百亿),而其团队已开源了基于Qwen和Llama的多种蒸馏版本,例如DeepSeek-R1-Distill-Qwen-7B/14B/32B等。这些模型体积相对较小,便于本地加载,并且支持直接使用Transformers。我们在此示范将使用Qwen2.5-7B-Instruct模型,它是阿里云通义千问的7亿参数版,可通过HuggingFace获取。

4.1.2 模型调用与文本抽取

  步骤1:加载模型和分词器。使用Transformers库的AutoTokenizer和AutoModelForCausalLM加载预训练模型和对应分词器。例如:

```pythonfrom transformers import AutoTokenizer, AutoModelForCausa大语言模型model_name =Qwen/Qwen2.5-7B-Instruct"  # Qwen/Qwen2.5-7B-Instruct 模型tokenizer =AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)model =AutoModelForCausa大语言模型.from_pretrained(model_name, device_map="auto", torch_dtype="auto", trust_remote_code=True)

  以上代码将自动下载Qwen2.5-7B-Instruct模型(需要约20GB显存运行)。如果改用DeepSeek R1蒸馏模型,只需将model_name改为如"deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"即可。注意:某些模型(如Qwen)在Transformers中属于自定义架构,因此需要trust_remote_code=True允许自定义代码执行。加载成功后,model对象即为一个可生成文本的语言模型。

  步骤2:准备提示(prompt)。 我们希望模型根据中医文本输出实体和关系信息,最好采用JSON结构便于解析。我们可以在提示中明确要求这一点。我们可以构造对话形式输入,包括system和user角色信息。例如:

```pythontext ="患者,男,45岁。主诉:咳嗽痰黄,午后发热,舌红苔黄腻,脉滑数。诊断:痰热郁肺。治则:清热化痰,宣肃肺气。处方:清金化痰汤,加减。"prompt = ("你是一位中医智能助手,请从以下病例文本中抽取关键信息,并按照JSON格式输出。\n""需要抽取:1)症状symptom,2)证候syndrome,3)治则treatment_principle,4)方剂prescription,以及它们之间的关系。\n""关系包括:症状-属于->证候,治则-对应->证候,方剂-用于->证候。\n\n"    f"病例文本:{text}\n\n""请按要求输出JSON:")

  在上述prompt中,我们以中文描述了任务要求,列出了需要的实体类型和关系类型,并给出了病例文本内容。这样模型就明白我们想要它提取哪些信息。为了减少模型产生不必要的自然语言解释,我们最后明确要求“按要求输出JSON”。对于不同模型,提示形式略有不同:

  对于ChatGPT或Qwen这类对话模型,通常需包含一个system消息设定角色(如上我们隐含设定为中医助手)和一个user消息提出指令。某些开源模型可能不需要system提示,但为了保险我们包含了任务说明。

  步骤3:生成模型输出。 调用模型的生成函数得到结果。为防止无限制生成,可以设置max_new_tokens限制输出长度,并将temperature设为较低值以提高确定性(在信息抽取场景我们希望结果稳定一致)。例如:

import json# 生成输出output = model.generate(**tokenizer(prompt, return_tensors=pt).to(model.device),                         max_new_tokens=256                        do_sample=False                        temperature=0.5)result_text = tokenizer.decode(output[0], skip_special_tokens=True)print(result_text)

  这里我们关闭采样(do_sample=False)并使用温度0.5,使模型倾向于按照指令格式输出,而非花样翻新。result_text即为模型生成的字符串。理想情况下,它应该是一个JSON结构,如:

```json{"symptom": ["咳嗽痰黄""午后发热""舌红苔黄腻""脉滑数"],"syndrome": ["痰热郁肺"],"treatment_principle": ["清热化痰""宣肃肺气"],"prescription": ["清金化痰汤加减"],"relations": [    {"symptom""咳嗽痰黄""syndrome""痰热郁肺""relation""belongs_to"},    {"symptom""午后发热""syndrome""痰热郁肺""relation""belongs_to"},    {"symptom""舌红苔黄腻""syndrome""痰热郁肺""relation""belongs_to"},    {"symptom""脉滑数""syndrome""痰热郁肺""relation""belongs_to"},    {"syndrome""痰热郁肺""treatment_principle""清热化痰""relation""treated_by"},    {"syndrome""痰热郁肺""treatment_principle""宣肃肺气""relation""treated_by"},    {"syndrome""痰热郁肺""prescription""清金化痰汤加减""relation""treated_by"}  ]}

(上面JSON仅为示例,实际模型输出可能略有差异,例如字段命名、数组结构等。)

  步骤4:解析和筛选结果。 得到JSON格式字符串后,可以使用Python的json库将其解析为数据结构,方便后续处理:

```pythontry:    data = json.loads(result_text)except json.JSONDecodeError as e:print("JSON解析失败:", e)# 可以在此添加修正策略,例如去除模型输出中的多余说明然后重试

  通常,若提示得当模型会严格输出JSON。但有时模型可能在JSON前后添加评论性文字或格式有细微错误。针对这种情况,可以:

调整提示:强调“只输出JSON,不要解释”。

后处理:比如用正则提取大括号内容或尝试多次生成取最像JSON的结果。

模型自检:如前述Spark模型用“自我验证”prompt,LLM可以在输出后验证格式再给出最终结果。

  一旦解析成功,我们即可得到一个字典对象data。接下来可以根据需要筛选信息。例如只关心某类实体时,可提取data["symptom"]列表;或者需要所有“证候-方剂”对时,可遍历data["relations"]中找relation == "treated_by"且包含prescription的项。我们也可以对结果进行简单统计,如实体数量、独立出现频次等,以辅助分析。

  步骤5:结果存储。 根据后续用途,将抽取的信息保存为文件。常用格式有:

JSON文件:直接将上面的字典列表保存,便于日后读取复现。

CSV文件:如果需要整理为表格形式,例如每条病例一行,每列对应某种实体或关系数量等。

  这里以JSON Lines格式保存每条记录的抽取结果:

```pythonimport jsonwithopen("extraction_results.jsonl""a", encoding="utf-8"as fout:    fout.write(json.dumps(data, ensure_ascii=False) + "\n")

  这样,每处理完一个文本,就将结果追加保存为一行JSON,方便对大型语料逐条处理。同时ensure_ascii=False确保中文正确保存。若需要CSV,则可用Python的csv或pandas库,将实体列表展平为多列(可能需要预先定义好固定的列,比如最多症状数等,不如JSON灵活)。

4.1.3 示例演示:完整流程

  下面我们结合上述步骤,给出一个完整的示例代码,将多个中医文本批量送入LLM抽取实体和关系,并将结果整理后保存为CSV。假设我们有若干中医病例文本存于列表cases中:

```pythoncases = [    "患者女,32岁。症见面色萎黄,失眠多梦,脉细。诊断:肝血不足。",    "患者男,54岁。咳嗽气喘,咽痒,舌苔薄白。证属风寒犯肺。方剂:三拗汤。"]```

  我们希望抽取每条中的症状、诊断/证候、方剂等信息。可以编写如下过程:

import pandas as pdresults = []for text in cases:    prompt = ("从以下中医病例中提取症状(symptom)、证候/诊断(syndrome)、方剂方名(prescription)。""输出JSON,格式:{symptom: [...], syndrome: [...], prescription: [...]}。\n"f"病例:{text}\nJSON:"    )    output = model.generate(**tokenizer(prompt, return_tensors=pt).to(model.device),                            max_new_tokens=128, do_sample=False, temperature=0)    res_text = tokenizer.decode(output[0], skip_special_tokens=True)try:        data = json.loads(res_text)except Exception as e:print("解析JSON失败,原始输出:", res_text)continue# 加入原始文本,便于对照    data["text"] = text      results.append(data)# 将结果转存为CSV(每条记录为一行,多值用逗号分隔)df = pd.DataFrame(results)df.to_csv("extraction_results.csv", index=False)

  在这个示例中,我们逐条构建prompt送入模型,然后解析结果为dict并收集到results列表。最后用pandas转换成DataFrame并导出CSV。其中,对于数组类型的字段,pandas会将列表直接存为字符串如"[失眠多梦, 面色萎黄, 脉细]"。这在Excel等表格软件中查看时需要进一步处理以分列。不过CSV主要供机器读取分析,用列表字符串也是可行的。读者也可以选择将每个实体占一列(如症状1、症状2…)但当实体数量不固定时这种方式不灵活。

  提示调优: 在实践过程中,可能需要根据模型输出情况不断调整提示。例如,如果发现模型经常输出解释文字,可以在prompt开头加入类似“注意:直接给出JSON结果,不要多余说明”。或者如果某些实体经常漏掉,可以考虑提供Few-Shot示例:即在prompt里先给一个范例输入和对应JSON输出,让模型照葫芦画瓢。Few-shot提示在大型模型中往往显著提升准确率。例如Zhang & Hao给Spark模型设计了匹配的示例模板,使其NER任务F1从88%提高到93%。在我们的例子中,也可以手工构造一个简单病例及其抽取JSON作为示例。

4.2 API调用

4.2.1 DeepSeek R1 API调用

  如果没有足够的资源本地运行模型,我们可以调取开发商提供的接口服务,这也是现如今最为广泛使用的方式,能够获得更好、更强大的模型。我们以DeepSeek为例,根据官方文档调用R1模型:

```python# Please install OpenAI SDK first: `pip3 install openai`from openai import OpenAIclient = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com")# API处输入自己申请的APIresponse = client.chat.completions.create(    model="deepseek-reasoner",    messages=[        {"role""system""content""你是一个中医智能助手,需要帮我抽取相关信息。"},        {"role""user""content": prompt},    ],    stream=False)print(response.choices[0].message.content)

  只需要将该段代码替换model.generate步骤即可。

  通过以上实践步骤,研究人员能够使用开源的LLM高效地对中医文本进行信息抽取。相较从零训练模型,这种方式充分利用了现有大型模型的语言理解和知识,能在短时间内得到可用结果。当然,在需要更高精准度时,也可以将这些结果再交由人工校对或者用于训练一个小模型,从而进一步提升抽取质量。

# 05

如何根据不同场景选择合适的中医药信息抽取方法

5.1 病例诊断书写的实体关系提取

案例背景: 中医临床病例记录通常包含患者基本信息、症状体征、舌脉、诊断(辨证分型)以及治疗方案(治法和方剂)等要素。这类文本结构较规整,用词也偏现代医疗术语。以下是一段模拟的中医门诊病历:

“患者李某,男,40岁。主诉:反复胃脘胀痛3月,加重1周。现症见胃脘胀满疼痛,嗳气频作,纳差,大便时溏时结。舌淡红,苔薄白,脉弦。中医诊断:肝胃不和(胃脘痛)。治法:疏肝理气,和胃止痛。处方:柴胡疏肝散加减。”

  在这个病例中,需要抽取的实体包括:

疾病/证候:“肝胃不和(胃脘痛)”

症状:“胃脘胀满疼痛”,“嗳气频作”,“纳差”,“大便时溏时结” 等

治法:“疏肝理气”,“和胃止痛”

方剂:“柴胡疏肝散加减”

以及关系:症状属于某证候,治法和方剂针对该证候等。

方法对比:

传统的做法可采用BERT-CRF序列标注模型,事先在大量中医病历上训练识别症状、证候、治法、方剂等。这类模型在相似文本上表现出色,能够精确划分出症状短语边界。例如本例中,“胃脘胀满疼痛”这样复杂的症状短语,BERT-CRF可以准确标注B-症状在“胃脘”上,I-症状标注在“胀满疼痛”上,不会错分。其F1往往可达85%以上,对于医院规范书写的病例,有监督模型几乎可以做到接近人工标注一致。关系提取可进一步训练一个关系分类模型,对于每对(证候, 症状)判定是否为“属于”关系等。这种两阶段方法在病例这种格式较规范的文本上非常可靠。缺点是需要标注数据支持;但中医医院通常有电子病历,已有一些机构构建了内部标注集,因此BERT等方法在此场景成熟度较高。

生成式LLM方法无需训练即可应用于单条病例抽取。如上一节教程所示,我们可以编写Prompt直接让LLM输出JSON。在案例文本上测试发现:GPT-4可以正确提取出主要症状和诊断,但对于隐含信息的提取有所不足。比如GPT-4可能直接输出“疾病: 肝胃不和(胃脘痛)”,“症状: 胃脘胀痛, 嗳气, 纳差, 大便异常”,能够涵盖大部分内容。不过,精细程度略逊,例如“胃脘胀满疼痛”可能被拆成两个症状“胃脘胀满”与“胃脘疼痛”,而人工标注通常视为一个整体症状。这种细粒度的一致性上,序列标注模型由于明确的BIO标注规范,反而更统一。而LLM有时会自由地拆分或合并症状。再比如“舌淡红,苔薄白,脉弦”这类舌脉象,LLM可能忽略或归类为症状,但在很多标注方案中舌象脉象是单独类别,在此我们未特别要求,LLM处理可能不一致。因此在结构化一致性上,专用模型更胜一筹。另一方面,LLM能自动识别别名关系:本例中“肝胃不和”后括号注明了西医病名“胃脘痛”,LLM可能输出这两个都作为诊断实体;而训练模型若标注规范只标中医证候,可能忽略括号内内容。所以LLM提供了额外信息整合的好处。

    性能评价: 

  对于病例类文本,在有标注数据的前提下,微调模型(BERT等)通常达到最高精度。实际医院应用倾向于这类方法,因为可以针对本院病历格式优化,输出结果直接用于电子病历结构化。LLM目前更多用作辅助,如在无模型时先用ChatGPT自动标注,再由人校对。值得注意的是,有研究尝试用ChatGPT标注一批病例数据,然后反过来训练一个小模型,结果比随机初始化训练要好,表明LLM可以用于数据标注扩充。在我们这个案例中,理想的方案可能是:用BERT-CRF抽取主要实体,LLM补充抽取一些隐含信息或提供校正,例如辨别出“胃脘痛”就是“肝胃不和”证的对应西医病名,可以存入知识库。

最佳方案推荐: 

  若场景是批量处理医院病例,建议首选领域微调模型(如基于RoBERTa的NER+关系模型),因为其稳定性高,能保证每条记录输出固定格式,误差率低。LLM可作为质控环节:对模型提取结果重新描述一遍或检查遗漏。例如让LLM读取BERT提取的症状列表,问“病例中还有没有别的症状没在列表?”。这种人机结合方案在目前能实现高效高质。

5.2 中药方剂文献的知识抽取

案例背景: 中医药方剂类文本(如《方剂学》教材、古代医方著作)通常记载方剂的组成、功效主治等信息。例如经典方剂条目:

银翘散:由连翘30g、银花30g、荆芥穗18g、淡豆豉15g、薄荷15g、牛蒡子18g、桔梗18g、甘草15g、芦根30g、生姜15g组成。功用:辛凉透表,清热解毒。主治:温病初起,发热微恶风寒,咽痛口渴。

    我们希望抽取方剂名称、药物组成、功效、主治病症等信息。这属于结构化信息抽取,类似知识图谱三元组。与病例不同的是,方剂文献多为固定描述格式,但可能用古汉语,且需要将组成药味逐一识别。

方法对比:

规则/模板方法在此非常有效。因为方剂条目往往格式统一,如“方名:…由…组成。功用:…。主治:…。” 可以用正则表达式硬匹配“由”与“组成”之间的内容作为药物列表,识别出连翘、银花等。这种方法准确度高(只要格式符合就100%抓取),但缺乏灵活性,对稍有不同的行文可能漏掉。此外需要维护大量规则,难以扩展到所有文本。

传统机器学习模型,如BiLSTM-CRF,也能胜任药名识别任务。但由于药名集合有限(常用中药约几百味),完全可以建立字典直接匹配。因此很多中医知识抽取会先用词典提高召回,再用模型确认。例如SoftLexicon模型将中医词典嵌入到NER中,F1提升明显。在方剂组成抽取中,字典和规则常结合,比如先切分出逗号分隔的药物串,再对每个词检查是否在中药词库中,不在的就交给模型判断是否药名错别字等。关系方面,方剂与功效、主治通常一一对应简单明了,可直接根据句子位置关联(如“功用”后面的短语都属于功效)。

LLM在这类知识抽取上表现出极高的准确率和丰富的输出。例如,让ChatGPT解析上述方剂描述,它不仅会找出所有药物,还可能补充每味药的剂量(如连翘30g)以及功效、主治。事实上,有工作(如中医知识图谱构建)已经用GPT类模型批量解析古籍方剂,构建了方剂-药物-功效-主治等三元组,取得了很高的准确率。Zhang & Hao的研究中,使用iFlytek Spark针对中药百科InfoBox进行信息抽取,Precision达到93%以上。在方剂场景下,LLM有几个优势:(1) 它对常见中药知识了然于心,预训练可能包含大量中药内容,所以识别药名对它来说轻而易举,连偏僻药材也能认出(例如“淡豆豉”不在高频词,但LLM仍可正确分类为药物)。(2) 对于古文表述,LLM的预训练语料覆盖典籍,使其阅读理解古汉语的能力强于一般仅训练现代文本的模型。例如“微恶风寒”这样的症状描述,LLM可以映射到现代医学“畏风怕冷,发烧轻微”。这使得LLM抽取出的“主治病症”信息可能比普通模型更加规范和全面。

性能评价:

    在该方剂示例上测试时,GPT-4输出结果几乎完美:能够列出方剂名“银翘散”,组成药物列表10味,功效“辛凉透表,清热解毒”,主治症状若干。而且它甚至可能补充解析“温病初起”相当于外感风热之类的疾病分类。不过,有时LLM可能超纲发挥,比如根据自身医学知识添上一些未明说的内容,需要加以约束。例如我们只想抽取明文出现的信息,就要在prompt强调“不推测额外内容”。总体而言,LLM在这个结构明确、领域闭合(中药名固定)的任务上,可以达到接近专家整理的效果。

最佳方案考虑: 

    如果目标是构建中药方剂知识库,一条可行路线是:先用LLM将所有方剂条目解析为结构化数据,再由人工或规则校验。这样速度快且准确。事实上,文献报道利用GPT-3.5解析本草纲目、千金方等古籍,自动生成数万知识三元组。相比之下,纯规则法虽然准确但费时费力,纯训练模型法受限于需要标注数据且古文理解难。所以LLM在中医古籍信息抽取中可谓“大显身手”。

    当然,为了确保质量,可以让多个模型交叉验证:比如ChatGPT和本地Qwen模型分别抽取一遍,结果做差异对比,人工只需查看有分歧的部分。这种人机协同可以极大提高效率。目前来看,在中药知识抽取场景,LLM结合轻量校验堪称最佳方案,兼顾了高召回和可靠性。尤其当知识库规模很大时,让LLM承担初步抽取可以节省大量人力。

5.3 讨论:不同场景下的方法选择

    通过上述两个案例可以看出,中医信息抽取任务多种多样,不存在放之四海而皆准的唯一最佳方法,需根据场景特点和资源条件选择合适方案:

当文本格式规范、标注数据充足时(如医院EMR系统内),首选训练专门模型(BERT-CRF等)。它们在已知领域表现稳定,易部署集成现有系统。而LLM可作为辅助工具用于难例解析或结果审核。

当缺乏标注数据,且需要快速覆盖新领域时,LLM提供了一条捷径。比如公共卫生紧急事件下的中医报道抽取、最新科研论文的信息采编等,用LLM零样本完成初步抽取,然后人工修正,比等待标注数据再训练模型更可取。随着对话式LLM接口日益普及,这种交互式抽取也更方便非程序员的领域专家使用。

对于结构高度固化的信息(如方剂组成、经典医案书写),模板和知识库结合的办法往往最高效。如果已有中药词典、症状 ontology 等,可充分利用先验知识提高准确率。而LLM则可以帮助应对模板之外的自由文本部分,或纠正字典无法覆盖的错误。例如古籍中避讳用字、异名,LLM能识别为常用名。最佳实践是将知识库约束与LLM灵活性结合。近期一些研究探索了让LLM调用外部知识(如通过工具使用词典)来完成抽取任务。这种方向有望将二者长处融合。

考虑运行成本和隐私: 部分医疗数据不能外传云端,这种情况下只能使用本地模型。本地部署7B-13B模型可以满足中等规模任务,但面对海量数据处理仍较慢。若对实时性要求高(如门诊实时抽取医嘱要点),小模型目前是更实际的选择。不过未来硬件发展和模型优化或许能使LLM实时应用成为可能。在成本允许下,LLM+知识蒸馏是折中方案:用少量病例让LLM产生高质量标注,然后训练一个小模型上线运行,这样兼顾了精度和速度。

  综上,我们正处于中医信息抽取方法从传统走向新范式的过渡期。早期的BiLSTM+CRF等方法提供了可靠的基线,BERT等预训练模型大幅提升了效果,而LLM进一步拓展了可能性边界,让零样本和端到端抽取成为现实。在近期研究中,多项成果显示经过精心设计,LLM的抽取性能可以比肩甚至超越经典方法。可以预见,随着更大规模的中医语料用于LLM微调,以及工具使用、函数调用等能力的加入,LLM在中医信息抽取中将发挥越来越中心的作用。未来的最佳方案可能是一个混合智能系统:LLM作为“大脑”统筹抽取和推理,小模型/规则作为“外设”执行具体标签预测和知识校验,两者配合达到高精度、高效率和高鲁棒性的统一。

# 06

结论

    本文系统调研了LLM在中医信息抽取(实体识别、关系抽取)中的应用现状,比较了其与BERT及传统方法的优劣,列举了公开数据集与评测指标,并通过实践教程和应用案例展示了如何使用Qwen、DeepSeek R1等模型通过本地或云端完成中医信息抽取任务。在当前技术条件下,生成式LLM为中医信息抽取带来了前所未有的灵活性和知识整合能力,但在精细度和一致性方面仍需要与传统方法相结合。科研与实践人员应根据任务需求选择最适合的方法,或融合多种手段,以构建准确、全面的中医知识抽取系统,推动中医药知识的现代化利用与传承。今后,随着更强大的模型出现和中医领域数据积累,我们有理由相信LLM将在中医信息抽取与知识图谱构建中取得突破性进展,为中医药科研和临床决策提供更有力的AI支持。

# 07

参考文献

①Comparative Analysis of Large Language Models in Chinese Medical Named Entity Recognition

②Utilizing Large Language Models for Named Entity Recognition in Traditional Chinese Medicine against COVID-19 Literature: Comparative Study

③TCMChat: A generative large language model for traditional Chinese medicine

④BianCang: A Traditional Chinese Medicine Large Language Model

⑤Research on a traditional Chinese medicine case-based question-answering system integrating large language models and knowledge graphs

⑥Traditional Chinese Medicine Knowledge Graph Construction Based on Large Language Models

⑦Enhancing traditional Chinese medical named entity recognition with Dyn-Att Net: a dynamic attention approac

⑧Entity recognition of Chinese medical text based on multi-head self-attention combined with BILSTM-CRF.