liuhuanyong / RAGOnMedicalKG

RAGOnMedicalKG,将大模型RAG与KG结合,完成demo级问答,旨在给出基础的思路。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LLMRAGOnMedicaKG

self-implement of disease centered Medical graph from zero to full and sever as question answering base. 从无到有搭建一个以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱,结合LLM完成自动问答与分析服务。

一、项目介绍

目前知识图谱在各个领域全面开花,如教育、医疗、司法、金融等。本项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类规模为4.4万的知识实体,11类规模约30万实体关系的知识图谱。 本项目将包括以下两部分的内容:

  1. 基于垂直网站数据的医药知识图谱构建
  2. 基于医药知识图谱的自动问答,基于LLM的方式

实际上,我们在之前的项目 (https://github.com/liuhuanyong/QABasedOnMedicalKnowledgeGraph) 中已经开源过基于朴素KG实现方式的问答,其中涉及到知识图谱构建部分,用到的代码、用到的数据,可以从该项目中继承。

二、项目运行方式

1、配置要求:要求配置neo4j数据库及相应的python依赖包。neo4j数据库用户名密码记住,并修改相应文件。
2、知识图谱数据导入:python build_medicalgraph.py,导入的数据较多,估计需要几个小时。
3、该项目依赖qwen-7b-chat作为底层llm模型,可以执行python qianwen7b_server.py搭建服务
4、配置服务地址: model = ModelAPI(MODEL_URL="http://你的IP/generate")
5、开始执行问答:python chat_with_llm.py,

三、医疗知识图谱构建

3.1 业务驱动的知识图谱构建框架

image

3.2 脚本目录

prepare_data/datasoider.py:网络资讯采集脚本
prepare_data/datasoider.py:网络资讯采集脚本
prepare_data/max_cut.py:基于词典的最大向前/向后切分脚本
build_medicalgraph.py:知识图谱入库脚本

3.3 医药领域知识图谱规模

1.3.1 neo4j图数据库存储规模 image

3.3.2 知识图谱实体类型

实体类型 中文含义 实体数量 举例
Check 诊断检查项目 3,353 支气管造影;关节镜检查
Department 医疗科目 54 整形美容科;烧伤科
Disease 疾病 8,807 血栓闭塞性脉管炎;胸降主动脉动脉瘤
Drug 药品 3,828 京万红痔疮膏;布林佐胺滴眼液
Food 食物 4,870 番茄冲菜牛肉丸汤;竹笋炖羊肉
Producer 在售药品 17,201 通药制药青霉素V钾片;青阳醋酸地塞米松片
Symptom 疾病症状 5,998 乳腺组织肥厚;脑实质深部出血
Total 总计 44,111 约4.4万实体量级

3.3.3 知识图谱实体关系类型

实体关系类型 中文含义 关系数量 举例
belongs_to 属于 8,844 <妇科,属于,妇产科>
common_drug 疾病常用药品 14,649 <阳强,常用,甲磺酸酚妥拉明分散片>
do_eat 疾病宜吃食物 22,238 <胸椎骨折,宜吃,黑鱼>
drugs_of 药品在售药品 17,315 <青霉素V钾片,在售,通药制药青霉素V钾片>
need_check 疾病所需检查 39,422 <单侧肺气肿,所需检查,支气管造影>
no_eat 疾病忌吃食物 22,247 <唇病,忌吃,杏仁>
recommand_drug 疾病推荐药品 59,467 <混合痔,推荐用药,京万红痔疮膏>
recommand_eat 疾病推荐食谱 40,221 <鞘膜积液,推荐食谱,番茄冲菜牛肉丸汤>
has_symptom 疾病症状 5,998 <早期乳腺癌,疾病症状,乳腺组织肥厚>
acompany_with 疾病并发疾病 12,029 <下肢交通静脉瓣膜关闭不全,并发疾病,血栓闭塞性脉管炎>
Total 总计 294,149 约30万关系量级

四、基于医疗知识图谱的自动问答

基本**:

step1: linking entity,针对问题进行实体识别,本项目采用基于ac自动机通过加载图谱词表进行匹配获得;

step2:recall kg facts,通过上一步得到的多个实体,通过prompt的方式提示llm进行实体的意图识别,然后转换成cypher语句进行查询,并过滤兼枝,得到子图路径;

step3:generate answer,通过召回好的子图,拼接prompt,使用llm完成问答;

def chat(self, query):
    print("step1: linking entity.....")
    entity_dict = self.entity_linking(query)
    depth = 1
    facts = list()
    answer = ""
    default = "抱歉,我在知识库中没有找到对应的实体,无法回答。"
    if not entity_dict:
        print("no entity founded...finished...")
        return default
    print("step2:recall kg facts....")
    for entity_name, types in entity_dict.items():
        for entity_type in types:
            rels = self.link_entity_rel(query, entity_name, entity_type)
            entity_triples = self.recall_facts(rels, entity_type, entity_name, depth)
            facts += entity_triples
    fact_prompt = self.format_prompt(query, facts)
    print("step3:generate answer...")
    answer = model.chat(query=fact_prompt, history=[])
    return answer

总结

1、本文完成了引入LLM-KG的方式进行医疗领域RAG的开源方案;
2、核心思路在于实体识别、子图召回、意图分类,有很多优化空间;
3、开源的意义是思路指引,而不是一味搬运、索取、坐享其成,大家一同建设好生态;

About

RAGOnMedicalKG,将大模型RAG与KG结合,完成demo级问答,旨在给出基础的思路。


Languages

Language:Python 100.0%