中医药知识图谱实战指南:基于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技术的创新发展。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust060
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Hy3-previewHy3 preview 是由腾讯混元团队研发的2950亿参数混合专家(Mixture-of-Experts, MoE)模型,包含210亿激活参数和38亿MTP层参数。Hy3 preview是在我们重构的基础设施上训练的首款模型,也是目前发布的性能最强的模型。该模型在复杂推理、指令遵循、上下文学习、代码生成及智能体任务等方面均实现了显著提升。Python00
项目优选
收起
暂无描述
Dockerfile
686
4.43 K
Ascend Extension for PyTorch
Python
536
656
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
342
60
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
403
314
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
952
910
Oohos_react_native
React Native鸿蒙化仓库
C++
336
385
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.58 K
920
暂无简介
Dart
933
232
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
135
216
昇腾LLM分布式训练框架
Python
145
171
