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) 将包括以下两部分的内容:
-
基于垂直网站数据的医药知识图谱构建
-
基于医药知识图谱的自动问答,基于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