基于 NebulaGraph 与大语言模型构建中医药鼻炎知识图谱
背景与目标
在构建中医药领域的知识图谱过程中,面临着提高知识抽取效率和降低人力成本的双重挑战。传统的人工标注方式耗时耗力,难以应对海量的临床医案数据。为了解决这些问题,本文探索了利用大语言模型(LLM)技术进行自动化知识抽取的方法,并结合高性能图数据库 NebulaGraph 构建结构化的知识网络。
本文以国医大师干祖望治疗鼻炎的临床医案为例,详细介绍从非结构化文本到结构化知识图谱的完整构建流程,旨在挖掘名医用药规律,助力中医药领域的数字化创新。
数据来源与预处理
数据概况
本文选取的数据源于真实的临床鼻炎患者医案,共计 1081 份详尽的临床记录。这些宝贵的医案涵盖了患者的多项基础信息,包括姓名、工作场所、性别、年龄、确诊时间、疾病类型、症状细节、诊断结果、舌象与脉象的观察、治疗记录、处方内容以及用药指导等。
隐私保护与清洗
在数据进入处理流程前,所有涉及患者个人隐私的信息(如真实姓名、联系方式等)均已进行脱敏处理,仅保留诊疗相关的医学特征数据,确保符合数据安全规范。
知识图谱构建流程
Step 1:本体层设计与模式定义
在构建图谱之前,首先需要定义本体层(Schema Layer),明确节点类型和边关系。针对中医鼻炎诊疗场景,我们设计了以下核心实体与关系:
-
顶点类型 (Vertices):
Patient (患者):包含年龄、性别等属性。
Disease (疾病):如鼻炎、过敏性鼻炎等。
Symptom (症状):如鼻塞、流涕、喷嚏等。
Herb (中药):如蝉蜕、防风、甘草等。
Prescription (方剂):具体的处方名称或组合。
-
边类型 (Edges):
Has_Symptom (患症):连接患者与症状。
Treats (治疗):连接医生/方剂与疾病。
Contains_Herb (含药):连接方剂与中药。
Has_Dosage (剂量):连接中药与具体用量。
Step 2:定义抽取目标
根据定义的本体构建的知识图谱模式层设定抽取目标。关键信息包括疾病、相关疾病、症状、检查、舌象、脉象、配伍等。针对每种抽取目标类型,需制定相应的抽取规则,确保三元组生成的规范性。
Step 3:自动抽取知识
采用'示范案例 + 关系列表'的提示模板引导大语言模型对医案数据进行自动化抽取,生成三元组。以下是具体的 Prompt 设计示例:
假如你是一个中医的关系抽取大语言模型,对鼻炎患者的症状和相关疾病进行关系抽取。
抽取医案示范:'鼻炎近来密帘三天,病症当然发作,涕多,涕难擤。头痛。鼻塞。鼻粘膜水肿,有分泌物。舌薄苔,脉浮紧。桑叶6g,薄荷6g,桔梗6g,石菖蒲6g,路路通10g,荆芥6g,白芷6g,苍耳子10g,金荞麦10g,蔓荆子10g。'。
输出格式为 [('鼻炎','症状','涕多'),('鼻炎','症状','头痛'),('鼻炎','检查','鼻粘膜水肿'),('鼻炎','舌象','舌薄苔'),('鼻炎','脉象','脉浮紧'),('鼻炎','配伍','石菖蒲6g')...]。
学习上述抽取格式,抽取下列病案,以三元组格式输出。给定的句子为:'***'。给定关系列表:['症状', '相关疾病', '配伍', '舌象', '检查', '脉象'],请给出关系列表中的关系。如果不存在则输出:无。
Step 4:清洗抽取结果
利用正则表达式对自动化抽取生成的三元组数据进行清洗。主要步骤包括:
- 去除错误、冗余、不相关和不完整的三元组。
- 统一实体名称,例如将'金荞麦'、'金荞麦 10g'进行标准化处理。
- 确保数据的准确性和可靠性,为入库做准备。
Step 5:存储三元组至 NebulaGraph
将最终获取到的三元组数据存储到 NebulaGraph 数据库中。在写入知识图谱的过程中,为了保证图谱的合理性,采取以下策略:
- 分解存储:直接将疾病和中药抽取成对应的三元组,在写入时进一步分解。例如将
('鼻炎','配伍','金荞麦 10g') 分解为 ('鼻炎','配伍','金荞麦') 和 ('金荞麦','剂量','10g')。
- 属性联合抽取:将中药实体及属性联合抽取,确保药物与其用量的关联准确无误。
利用 NebulaGraph 构建知识图谱详解
为什么选择 NebulaGraph?
NebulaGraph 作为一款高性能、用户友好的图数据库,以其出色的特性和广泛的应用场景,为研究者提供了一种全新的方式来探索和分析数据。其核心优势包括:
- 高性能:支持亿级点边的毫秒级查询,适合大规模医案数据分析。
- 灵活扩展:动态 Schema 设计,便于适应中医领域不断变化的知识体系。
- 强大的查询语言 nGQL:内置图查询语言,支持复杂的图算法和路径查询。
实现伪代码逻辑
llm_client = init_llm()
db_conn = connect_nebula_graph()
for i in range(num_cases):
case_text = preprocess_data(cases[i])
prompt = build_prompt(case_text, relation_list)
triples = llm_client.generate(prompt)
clean_triples = regex_clean(triples)
patient_id = create_node(db_conn, 'Patient', {'id': cases[i].patient_id})
disease_id = create_node(db_conn, 'Disease', {'name': '鼻炎'})
for triple in clean_triples:
if triple.relation == '配伍':
if has_dosage_unit(triple.object):
herb, dosage = extract_herb_and_dosage(triple.object)
add_edge(db_conn, disease_id, '配伍', herb_id)
add_edge(db_conn, herb_id, '剂量', dosage)
else:
add_edge(db_conn, disease_id, '配伍', triple.object)
实验与评估
实验设置
本文以前期准备的 353 条医案作为基础样本,并利用大语言模型进行知识抽取实验。为了评价各个模型的知识抽取性能,采用其他大语言模型进行数据标注,然后采取人工校对的方式,对标注结果进行验证和修正。
对比模型与指标
- 基准模型:Bert-BiLSTM-CRF 模型(用于实体关系联合抽取)。
- 大语言模型:GLM3、GLM4、ChatGPT4。
- 评估指标:F1 分数、准确率(Precision)、召回率(Recall)。
实验结果表明,大语言模型在复杂语义理解和长尾实体抽取上表现优于传统深度学习模型,特别是在处理中医专业术语和非结构化描述方面具有显著优势。
知识图谱应用分析
利用构建的知识图谱,可以深入分析挖掘国医大师治疗鼻炎的用药规律。以下是具体的查询与分析示例。
查询高频用药
我们需要查询具有特定症状(如喷嚏)的患者,再获取其治疗方剂,根据配伍中的用药频次进行排序,获取前 10 味药。
nGQL 查询语句:
MATCH (v:患者)-[:患者症状]->()-[:具体症状]->(v1)
WHERE id(v1) == '喷嚏'
MATCH (v:患者)-[:治疗方剂]-(v3)-[e2:配伍]->(v4)
RETURN v4, count(v4) as cnt
ORDER BY cnt DESC
LIMIT 10;
查询结果分析:
上述语句查询具有喷嚏症状的患者,再获取患者的治疗方剂,根据配伍中的用药频次进行排序。结果显示,用药前 10 味分别为:蝉蜕、防风、墨旱莲、甘草、地龙、黑豆衣、诃子、白术、茜草、黄芪。
这一结果揭示了在治疗此类鼻炎症状时,祛风止痒、益气固表类药物的高频使用趋势,为临床用药提供了数据支持。
总结与展望
本文展示了如何利用大语言模型自动化抽取非结构化医案数据,并结合 NebulaGraph 构建中医药知识图谱。通过实验验证,该方法能有效提高知识抽取效率,降低人力成本。未来工作将集中在:
- 多模态融合:结合舌象图片、脉象波形等多模态数据丰富图谱维度。
- 推理增强:利用图谱推理能力辅助新药研发和老方新用分析。
- 交互优化:开发更友好的前端界面,方便医生直接查询和验证图谱结论。
通过技术手段赋能中医药传承与创新,知识图谱将在智慧医疗领域发挥更大的价值。