AI 文摘

RAGOnMedicalKG-医药领域KG+大模型RAG项目开源:兼看20240329大模型进展早报





作者: 老刘说NLP 来源: 老刘说NLP

今天是2024年3月30日,星期六,各位周末愉快,

今天北京天气出奇的好,大家可以出去走走。

我们来继续看看一些有趣的话题,回顾下昨日大模型与知识图谱进展早报,主要涉及到一些RAG2.0的实现思路以及Grok1.5发布的事情。‍‍‍‍‍‍‍‍‍‍‍

我们接下来看看将知识图谱与RAG进行结合的这个方向,我们在社区的分享以及公众号文章中已经多次说过。

例如,《再看有趣的大模型RAG问答优化策略:Wikichat七步走及KG-RAG实现范式》 (https://mp.weixin.qq.com/s/UsZy6TdnUaqQ3PtSq6F4yA);

又如,《基于知识图谱的大模型检索增强实现策略:Graph RAG实现基本原理及优化思路》 (https://mp.weixin.qq.com/s/ulhu7qj93d3PRWoUpNcCug);

又如,《再看知识图谱融合大模型RAG问答:用于多文档QA的知识图谱构图及prompt应用思路》 (https://mp.weixin.qq.com/s/WAeewL6pLg1PaMJa_jHdXg)

又如,《再看知识图谱增强大模型问答范式:LLM⊗KG范式下的知识图谱问答实现框架思想阅读》 (https://mp.weixin.qq.com/s/b5Tssaesm2mDKxwHy23n2w)

也有,《大模型、RAG与知识图谱三者如何融合?兼看20240225大模型进展早报及大模型信息抽取微调数据集IEPile》 (https://mp.weixin.qq.com/s/2pXPn9UfS4Nyx5txlHmaKA)

而纸上得来终觉浅,我们可以以实践的形式来看看这个事情,由于KGQA这个事情,本身是与领域强相关的,因此,我将前几年开源的知识图谱问答项目QABasedOnMedicalKnowledgeGraph,简单修改成了基于LLM-RAG的形式,当然,很粗糙,大家可以基于此做改造,已开源至我的github:https://github.com/liuhuanyong/RAGOnMedicalKG

供大家一起参考并思考。

一、RAGOnMedicalKG项目介绍

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

实际上,我们在之前的项目QABasedOnMedicalKnowledgeGraph

(https://github.com/liuhuanyong/QABasedOnMedicalKnowledgeGraph) 中已经开源过基于朴素KG实现方式的问答

本项目RAGOnMedicalKG :(https://github.com/liuhuanyong/RAGOnMedicalKG 将包括以下两部分的内容:

  1. 基于垂直网站数据的医药知识图谱构建

  2. 基于医药知识图谱的自动问答,基于LLM的方式

当然,其中涉及到知识图谱构建部分,用到的代码、用到的数据,可以从该项目中继承。

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,

三、医疗知识图谱构建

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

2、脚本目录

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

3、医药领域知识图谱规模

1)neo4j图数据库存储规模

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)知识图谱实体关系类型

实体关系类型中文含义关系数量举例

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万关系量级

四、基于LLM-RAG方式进行领域KG问答实现

其接本思想就包括三个步骤:

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  

总结

本项目完成了引入LLM-KG的方式进行医疗领域RAG的开源方案,核心思路在于实体识别、子图召回、意图分类,有很多优化空间。

不过,开源的意义是思路指引,而不是一味搬运、索取、坐享其成,大家一同建设好生态。

参考文献

1、https://arxiv.org/abs/2402.12869

2、https://arxiv.org/pdf/2403.18243

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具