c语言自学免费网站,福安城乡建设与规划局网站,在iis搭建网站,定制杯子一、ChatGPT结合知识图谱
上篇文章对医疗数据集进行了整理#xff0c;并写入了知识图谱中#xff0c;本篇文章将结合 ChatGPT 构建基于知识图谱的问答应用。
下面是上篇文章的地址#xff1a; ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱 这里实现问答的流程…一、ChatGPT结合知识图谱
上篇文章对医疗数据集进行了整理并写入了知识图谱中本篇文章将结合 ChatGPT 构建基于知识图谱的问答应用。
下面是上篇文章的地址 ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱 这里实现问答的流程如下所示 二、问答流程构建
opencypher_llm.py 根据问题理解生成 opencypher 语句
import os
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import jsonclass OpenCypherLLM():def __init__(self):# 输出格式化self.response_schemas [ResponseSchema(nameopenCypher, description生成的 OpenCypher 检索语句)]self.output_parser StructuredOutputParser.from_response_schemas(self.response_schemas)self.format_instructions self.output_parser.get_format_instructions()# prompt 模版self.prompt 你是一个知识图谱方面的专家, 现有一个医疗相关的知识图谱,图谱中的实体解释如下\n--------------disease疾病,存储着各种疾病的基础信息\ndepartment科室疾病所对应的科室\nsymptom疾病的症状\ncureWay疾病的治疗方式\ncheck疾病的检查项目\ndrug疾病的用药\ncrowd疾病易感染人群\nfood食物包括宜吃和忌吃食物\n--------------\n实体与实体之间的关系如下,每个关系都可以是双向的,v表示实体、e表示关系\n--------------\n疾病科室关系(v:disease)-[e:diseaseDepartmentRelations]-(v:department);疾病症状关系(v:disease)-[e:diseaseSymptomRelation]-(v:symptom);疾病治疗关系(v:disease)-[e:diseaseCureWayRelation]-(v:cureWay);疾病检查项目关系(v:disease)-[e:diseaseCheckRelation]-(v:check);疾病用药关系(v:disease)-[e:diseaseDrugRelation]-(v:drug);疾病易感染人群关系(v:disease)-[e:diseaseCrowdRelation]-(v:crowd);疾病宜吃食物关系(v:disease)-[e:diseaseSuitableFoodRelation]-(v:food);疾病忌吃食物关系(v:disease)-[e:diseaseTabooFoodRelation]-(v:food);疾病并发症关系(v:disease)-[e:diseaseDiseaseRelation]-(v:disease);--------------\n实体中的主要属性信息如下\n--------------\ndisease: {name:疾病名称,desc:疾病简介,prevent:预防措施,cause:疾病病因,get_prob:发病率,get_way:传染性,cure_lasttime:治疗周期,cured_prob:治愈概率,cost_money:大概花费}\ndepartment: {name:科室名称}\nsymptom: {name:疾病症状}\ncureWay: {name:治疗方式}\ncheck: {name:检查项目}\ndrug: {name:药物名称}\ncrowd: {name:感染人群}\nfood: {name:食物}\n--------------根据以上背景结合用户输入的问题生成 OpenCypher 图谱检索语句可以精准检索到相关的知识信息作为背景。\n注意: 仅使用上述提供的实体、关系、属性信息不要使用额外未提供的内容。实体与实体之间的关系仅使用背景给出的关系\nself.prompt self.prompt self.format_instructionsself.chat ChatOpenAI(temperature1, model_namegpt-3.5-turbo)def run(self, questions):res self.chat([SystemMessage(contentself.prompt),HumanMessage(content用户输入问题 questions)])res res.contentres res.replace(json, ).replace(, )res json.loads(res)return res[openCypher]
gc_llm.py 根据检索结果总结答案
import os
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain import PromptTemplateclass GCLLM():def __init__(self):# prompt 模版self.template 你是一个知识图谱方面的专家,图谱中的基本信息如下\n--------------disease疾病实体,存储着各种疾病的基础信息\ndepartment科室疾病所对应的科室\nsymptom疾病的症状\ncureWay疾病的治疗方式\ncheck疾病的检查项目\ndrug疾病的用药\ncrowd疾病易感染人群\nfood食物存吃包括宜吃和忌吃食物\n--------------\n上一步你生成的 OpenCypher 语句为--------------\n{OpenCypher}--------------\nOpenCypher 语句查询的结果如下--------------\n{content}--------------\n结合上述背景并回答用户问题如果提供的背景和用户问题没有相关性则回答 “这个问题我还不知道怎么回答”注意最后直接回复用户问题即可不要添加 根据查询结果 等类似的修饰词self.prompt PromptTemplate(input_variables[OpenCypher, content],templateself.template,)self.chat ChatOpenAI(temperature1, model_namegpt-3.5-turbo)def run(self, OpenCypher, content, questions):res self.chat([SystemMessage(contentself.prompt.format(OpenCypherOpenCypher, contentcontent)),HumanMessage(content用户输入问题 questions)])return res.content
过程整合
from py2neo import Graph
from opencypher_llm import OpenCypherLLM
from gc_llm import GCLLM
import osclass QA():def __init__(self, kg_host, kg_port, kg_user, kg_password):self.graph Graph(hostkg_host,http_portkg_port,userkg_user,passwordkg_password)self.openCypherLLM OpenCypherLLM()self.gcLLM GCLLM()def execOpenCypher(self, cql):if limit not in cql and LIMIT not in cql:cql cql LIMIT 10 res self.graph.run(cql)list []for record in res:list.append(str(record))if len(list) 0:return return \n.join(list)def run(self, questions):if not questions or questions :return 输入问题为空无法做出回答# 生成检索语句openCypher self.openCypherLLM.run(questions)if not openCypher or openCypher :return 这个问题我还不知道怎么回答print(生成的CQL)print(openCypher)# 执行检索res self.execOpenCypher(openCypher)print(查询图谱结果)print(res)if not res or res :return 这个问题我还不知道怎么回答return self.gcLLM.run(openCypher, res, questions)if __name__ __main__:kg_host 127.0.0.1kg_port 7474kg_user neo4jkg_password 123456qa QA(kg_host, kg_port, kg_user, kg_password)while True:questions input(请输入问题: \n )if questions q:breakres qa.run(questions)print(问题回答结果)print(res)三、效果测试
1. 鼻炎的症状有哪些 2. 鼻炎的治疗周期多久 3. 鼻炎不适合吃什么东西 3. 和鼻炎有类似症状的病有哪些 4. 鼻炎应该检查哪些项目 四、总结
上面基于医疗的知识图谱大致实现了问答的过程可以感觉出加入ChatGPT后实现的流程非常简单但上述流程也还有需要优化的地方例如用户输入疾病错别字的情况如果 ChatGPT 没有更正有可能导致检索为空还有就是有些疾病可能有多个名称但名称不在图谱中导致检索失败等等后面可以考虑加入语义相似度的检索。