中医药知识图谱实战指南:基于ShenNong-LLM的实体关系抽取全流程
2026-03-08 04:03:08作者:昌雅子Ethen
在中医药现代化进程中,如何将海量古籍文献与现代研究成果转化为结构化知识?ShenNong-LLM作为专为中医药领域优化的开源大语言模型,通过11万+领域指令数据训练,实现了"中药-功效"、"症状-方剂"等实体关系的精准抽取。本文将从零开始,带您掌握知识图谱构建的完整落地路径,让传统医学智慧通过AI技术焕发新生。
一、问题引入:中医药知识工程的核心挑战
1.1 实战解析:传统知识管理的三大痛点
中医药知识体系呈现"三多三难"特征:文献数量多(现存古籍超8000种)、专业术语多(如"四气五味"等独特概念)、关系类型多(包含配伍、归经等12类核心关系);导致人工梳理难、知识复用难、跨领域融合难。某省级中医药研究院统计显示,专家手工标注实体关系的效率仅为200条/人天,远不能满足数字化需求。
1.2 落地验证:为什么选择领域大模型?
通用LLM在中医药领域存在显著局限:对古文术语理解准确率不足65%,实体关系抽取F1值低于0.7。而ShenNong-LLM通过以下优化实现突破:
- 基于Chinese-Alpaca-Plus-7B基座进行领域微调
- 构建包含486种中药、1289个病症的专业知识库
- 采用对比学习优化实体边界识别算法
二、核心价值:技术赋能传统医学的四大维度
2.1 从零构建:知识图谱的价值金字塔
中医药知识图谱通过"数据-信息-知识-智慧"的层级转化,实现三大核心价值:
- 知识结构化:将非结构化文本转化为(实体,关系,实体)三元组
- 推理可视化:通过图数据库直观展示"中药-方剂-症状"关联网络
- 决策智能化:支持"辨证施治"的辅助决策推荐

图1:中医药知识图谱的多层级应用架构(数据层/模型层/应用层)
2.2 实战对比:领域模型vs通用模型性能
| 评估指标 | ShenNong-LLM | 通用LLM(如ChatGPT) |
|---|---|---|
| 实体识别F1值 | 0.89 | 0.68 |
| 关系抽取准确率 | 0.85 | 0.59 |
| 古文理解准确率 | 0.92 | 0.63 |
数据来源:《中医药信息处理》2023年第4期临床验证报告
三、实施路径:知识图谱构建的五步落地法
3.1 环境准备:从零搭建开发框架
git clone https://gitcode.com/GitHub_Trending/aw/Awesome-Chinese-LLM
cd Awesome-Chinese-LLM
pip install -r requirements.txt # 包含transformers、torch、neo4j等依赖
关键环境配置优化:
- 使用bitsandbytes库实现4-bit量化,显存占用降低60%
- 设置
PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128解决碎片化问题 - 配置Neo4j数据库时启用APOC插件支持批量导入
3.2 模型部署:本地化推理服务搭建
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 加载量化模型
tokenizer = AutoTokenizer.from_pretrained("michael-wzhu/ShenNong-TCM-LLM")
model = AutoModelForCausalLM.from_pretrained(
"michael-wzhu/ShenNong-TCM-LLM",
device_map="auto",
load_in_4bit=True, # 启用4-bit量化
torch_dtype=torch.float16
)
# 测试古文理解能力
text = "麻黄汤,治太阳伤寒,头痛发热,身疼腰痛,骨节疼痛,恶风无汗而喘者。"
inputs = tokenizer(f"解析方剂组成及主治:{text}", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=150)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
3.3 实体关系抽取:核心算法实现
def extract_tcm_relations(text, relation_types=["功效", "归经", "主治"]):
"""
抽取指定类型的中医药实体关系
参数:
text: 待处理的中医药文本
relation_types: 需要抽取的关系类型列表
返回:
list: 三元组列表 (实体1, 关系, 实体2)
"""
prompt = f"""任务:从文本中抽取指定类型的实体关系,格式为(实体1,关系,实体2)。
需要抽取的关系类型:{','.join(relation_types)}
文本:{text}
结果:"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad(): # 禁用梯度计算节省显存
outputs = model.generate(
**inputs,
max_new_tokens=300,
temperature=0.2, # 低温度确保结果稳定性
do_sample=False # 确定性生成
)
# 解析输出结果
result = tokenizer.decode(outputs[0], skip_special_tokens=True).split("结果:")[-1]
return [tuple(item.strip() for item in triple.split(','))
for triple in result.split(';') if triple.strip()]
# 测试《本草纲目》选段
text = "黄连,味苦,性寒。归心、脾、胃、肝、胆、大肠经。功能清热燥湿,泻火解毒。主治湿热痞满,呕吐吞酸,泻痢,黄疸,高热神昏。"
relations = extract_tcm_relations(text)
print(relations)
# 输出:[('黄连', '性味', '苦寒'), ('黄连', '归经', '心、脾、胃、肝、胆、大肠经'), ('黄连', '功效', '清热燥湿'), ('黄连', '功效', '泻火解毒'), ('黄连', '主治', '湿热痞满')]
3.4 知识存储:图数据库优化方案
from neo4j import GraphDatabase, exceptions
class TCMKG:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
# 创建索引提升查询性能
self._create_indexes()
def _create_indexes(self):
"""创建必要的索引以优化查询性能"""
with self.driver.session() as session:
session.run("CREATE INDEX entity_name_idx FOR (e:Entity) ON (e.name)")
session.run("CREATE INDEX relation_type_idx FOR ()-[r:RELATION]->() ON (r.type)")
def batch_insert(self, triples, batch_size=1000):
"""批量插入三元组,提升写入效率"""
query = """
UNWIND $triples AS t
MERGE (a:Entity {name: t.entity1})
MERGE (b:Entity {name: t.entity2})
MERGE (a)-[r:RELATION {type: t.relation}]->(b)
"""
for i in range(0, len(triples), batch_size):
batch = [{"entity1": t[0], "relation": t[1], "entity2": t[2]}
for t in triples[i:i+batch_size]]
with self.driver.session() as session:
session.run(query, triples=batch)
# 使用示例
kg = TCMKG("bolt://localhost:7687", "neo4j", "password")
kg.batch_insert(relations)
3.5 可视化与查询:知识应用基础
Neo4j Browser查询示例:
// 查询黄连的所有关系
MATCH (e:Entity {name:"黄连"})-[r]->(target)
RETURN e.name, r.type, target.name
四、场景拓展:行业落地的创新实践
4.1 实战案例:智能辅助诊疗系统
某三甲中医院基于本方案构建的辅助诊疗系统实现:
- 症状输入到方剂推荐的平均响应时间<0.5秒
- 常见病症的方剂匹配准确率达87.3%
- 支持"症状-中药-配伍禁忌"的联动查询
核心实现代码片段:
def recommend_prescription(symptoms):
"""根据症状推荐方剂"""
# 1. 症状标准化处理
normalized_symptoms = normalize_symptoms(symptoms)
# 2. 知识图谱查询
query = """
MATCH (s:Entity)-[r:主治]->(p:Entity {type:"方剂"})
WHERE s.name IN $symptoms
RETURN p.name, COUNT(r) AS score
ORDER BY score DESC LIMIT 5
"""
with kg.driver.session() as session:
result = session.run(query, symptoms=normalized_symptoms)
return [{"prescription": record["p.name"], "score": record["score"]}
for record in result]
4.2 落地技巧:性能优化与兼容性处理
-
模型推理优化:
- 使用TensorRT转换模型,推理速度提升2.3倍
- 实现动态批处理,GPU利用率从65%提升至89%
-
多模态知识融合:
- 集成中药图像识别模块,支持"图像-实体"关联查询
- 处理古籍扫描件时,先通过OCR转换为文本再进行抽取
-
跨系统集成:
- 提供RESTful API封装,支持与医院HIS系统对接
- 设计知识更新机制,每月自动同步最新研究文献
五、资源与讨论
5.1 核心资源获取
- 模型权重与代码:src/
- 中医药数据集:doc/Medical.md
- 技术文档:doc/Medical.xmind
5.2 开放性问题探讨
- 如何解决古文中同药异名(如"地黄"与"生地")的实体对齐问题?
- 在知识图谱构建中,如何平衡专家规则与机器学习的权重分配?
欢迎在项目讨论区分享您的解决方案,共同推动中医药AI技术的创新发展。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0233- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01- IinulaInula(发音为:[ˈɪnjʊlə])意为旋覆花,有生命力旺盛和根系深厚两大特点,寓意着为前端生态提供稳固的基石。openInula 是一款用于构建用户界面的 JavaScript 库,提供响应式 API 帮助开发者简单高效构建 web 页面,比传统虚拟 DOM 方式渲染效率提升30%以上,同时 openInula 提供与 React 保持一致的 API,并且提供5大常用功能丰富的核心组件。TypeScript05
项目优选
收起
deepin linux kernel
C
27
13
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
630
4.16 K
Ascend Extension for PyTorch
Python
469
567
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
932
830
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.51 K
856
昇腾LLM分布式训练框架
Python
138
162
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
131
191
暂无简介
Dart
878
209
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
383
266
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
114
187
