首页
/ 基于ShenNong-LLM的中医药知识图谱构建实践:从实体关系抽取到智能应用

基于ShenNong-LLM的中医药知识图谱构建实践:从实体关系抽取到智能应用

2026-03-08 04:49:02作者:董宙帆

在数字化时代,中医药领域面临着海量文献知识难以有效整合的挑战。如何将分散在古籍、论文中的中医药知识转化为结构化的知识图谱,实现高效检索与智能应用?本文将以知识图谱构建为核心,详细介绍使用ShenNong-LLM模型进行实体关系抽取的全流程,为中医药现代化提供技术支持。

核心价值:为何选择ShenNong-LLM构建知识图谱?

知识图谱构建的关键在于准确提取实体与关系,传统方法依赖人工标注,效率低下。ShenNong-LLM作为专为中医药领域优化的大语言模型,具备三大核心优势:首先,它能精准理解"四气五味"、"君臣佐使"等专业术语;其次,在中医药实体识别任务上F1值达0.89,远超通用模型;最后,7B参数规模支持单机GPU部署,满足私有化需求。这些特性使其成为中医药知识图谱构建的理想工具。

技术方案:知识图谱构建的完整流程

环境配置与模型加载

如何快速搭建知识图谱构建环境?首先克隆项目仓库并安装依赖:

git clone https://gitcode.com/GitHub_Trending/aw/Awesome-Chinese-LLM
cd Awesome-Chinese-LLM
pip install -r requirements.txt

加载ShenNong-LLM模型的代码如下:

from transformers import AutoTokenizer, AutoModelForCausalLM

def load_shennong_model(model_path="michael-wzhu/ShenNong-TCM-LLM"):
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    model = AutoModelForCausalLM.from_pretrained(
        model_path,
        device_map="auto",
        load_in_4bit=True  # 启用4-bit量化,降低显存占用
    )
    return tokenizer, model

tokenizer, model = load_shennong_model()

实体关系抽取实现

实体关系抽取是知识图谱构建的核心环节。以下是改进后的抽取函数,支持多种关系类型:

def extract_entities_relations(text, relation_types=["性味", "归经", "功效", "主治"]):
    relation_prompt = ", ".join(relation_types)
    prompt = f"""任务:从文本中提取指定类型的实体关系,格式为(实体1, 关系, 实体2)
可用关系类型:{relation_prompt}
文本:{text}
结果:"""
    
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    outputs = model.generate(
        **inputs,
        max_new_tokens=300,
        temperature=0.2,
        top_p=0.95
    )
    
    result = tokenizer.decode(outputs[0], skip_special_tokens=True)
    # 解析结果为三元组列表
    triples = []
    for item in result.split("), ("):
        item = item.strip("()")
        if "," in item:
            triples.append(tuple(map(str.strip, item.split(","))))
    return triples

# 测试案例
text = "黄芪,味甘,性微温,归脾、肺经,具有补气升阳、固表止汗、利水消肿之功效,主治气虚乏力、食少便溏。"
relations = extract_entities_relations(text)
print(relations)

知识图谱存储与可视化

如何将抽取的关系数据有效存储?使用Neo4j数据库的示例代码如下:

from neo4j import GraphDatabase

class TCMKG:
    def __init__(self, uri, user, password):
        self.driver = GraphDatabase.driver(uri, auth=(user, password))
        self.create_constraints()
    
    def create_constraints(self):
        with self.driver.session() as session:
            session.run("CREATE CONSTRAINT IF NOT EXISTS FOR (e:Entity) REQUIRE e.name IS UNIQUE")
    
    def insert_triple(self, entity1, relation, entity2):
        with self.driver.session() as session:
            session.run("""
                MERGE (a:Entity {name: $e1})
                MERGE (b:Entity {name: $e2})
                MERGE (a)-[r:RELATION {type: $rel}]->(b)
                RETURN a, r, b
            """, e1=entity1, rel=relation, e2=entity2)

# 使用示例
kg = TCMKG("bolt://localhost:7687", "neo4j", "password")
for triple in relations:
    kg.insert_triple(*triple)

中医药知识图谱架构 图:中医药知识图谱的三层架构(数据层/模型层/应用层),展示了医学类大模型的应用生态

实战案例:构建中药配伍知识图谱

如何将理论应用于实际场景?以《本草纲目》部分内容为例,构建中药配伍知识图谱:

  1. 数据采集:爬取《本草纲目》在线文本,提取中药条目
  2. 实体识别:使用ShenNong-LLM识别中药、病症、功效等实体
  3. 关系抽取:提取"配伍"、"禁忌"、"炮制"等关系
  4. 图谱构建:导入Neo4j并进行可视化展示

中药知识图谱关系网络 图:基于LLM构建的中药知识图谱关系网络,展示了不同中药之间的关联关系

常见问题解决

在知识图谱构建过程中,可能会遇到以下问题:

  1. 模型推理速度慢:解决方案:启用模型量化(如4-bit/8-bit),使用更小的模型变体,或采用批量处理方式
  2. 实体识别准确率低:解决方案:增加领域特定训练数据,调整prompt模板,使用实体链接技术
  3. 关系抽取结果重复:解决方案:在存储前进行去重处理,设置关系置信度阈值
  4. 图谱规模过大:解决方案:采用分层次存储策略,实现增量更新机制
  5. 中文古籍处理困难:解决方案:结合OCR技术预处理扫描版古籍,使用古汉语分词工具

资源整合

资源类型 描述 路径
模型文件 ShenNong-LLM中医药大模型 model/ShenNong-TCM-LLM
数据集 中医药领域指令数据集 doc/Medical.md
技术文档 知识图谱构建指南 docs/kg_construction.md
代码示例 实体关系抽取脚本 examples/relation_extraction.py
社区支持 项目讨论区 community/discussions

通过本文介绍的方法,您可以快速构建中医药知识图谱,为智能诊疗、药物研发等领域提供强有力的知识支撑。随着技术的不断发展,知识图谱与LLM的结合将为中医药现代化带来更多可能性。建议结合实际需求,持续优化模型和算法,推动中医药知识的传承与创新。

登录后查看全文
热门项目推荐
相关项目推荐