self-implement of disease centered Medical graph from zero to full and sever as question answering base. 从无到有搭建一个以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱,结合LLM完成自动问答与分析服务。
目前知识图谱在各个领域全面开花,如教育、医疗、司法、金融等。本项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类规模为4.4万的知识实体,11类规模约30万实体关系的知识图谱。 本项目将包括以下两部分的内容:
- 基于垂直网站数据的医药知识图谱构建
- 基于医药知识图谱的自动问答,基于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,
prepare_data/datasoider.py:网络资讯采集脚本
prepare_data/datasoider.py:网络资讯采集脚本
prepare_data/max_cut.py:基于词典的最大向前/向后切分脚本
build_medicalgraph.py:知识图谱入库脚本
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、开源的意义是思路指引,而不是一味搬运、索取、坐享其成,大家一同建设好生态;