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(name="openCypher", 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注意: 仅使用上述提供的实体、关系、属性信息,不要使用额外未提供的内容。实体与实体之间的关系仅使用背景给出的关系\n"""self.prompt = self.prompt + self.format_instructionsself.chat = ChatOpenAI(temperature=1, model_name="gpt-3.5-turbo")def run(self, questions):res = self.chat([SystemMessage(content=self.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"],template=self.template,)self.chat = ChatOpenAI(temperature=1, model_name="gpt-3.5-turbo")def run(self, OpenCypher, content, questions):res = self.chat([SystemMessage(content=self.prompt.format(OpenCypher=OpenCypher, content=content)),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(host=kg_host,http_port=kg_port,user=kg_user,password=kg_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.1"kg_port = 7474kg_user = "neo4j"kg_password = "123456"qa = 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 没有更正有可能导致检索为空,还有就是有些疾病可能有多个名称但名称不在图谱中导致检索失败等等,后面可以考虑加入语义相似度的检索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/75602.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备忘录模式——撤销功能的实现

1、简介 1.1、概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。当前很多软件都提供了撤销(Undo)操作&#xf…

Spring AOP

1.什么是 Spring AOP? AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的集中处理。⽐如⽤户登录权限的效验,没学 AOP 之前,我们所有需要判断⽤户登…

ClickHouse(七):Clickhouse数据类型-2

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

openlayers渲染rgb三波段cog时达到类似rgba的效果(去掉黑底)

图是arcgis渲染成rgb的,由于没有透明度波段,底下是黑的。 为了能在前端显示透明效果,之前是用python处理数据,给它加个透明度波段 后来研究了一下ol的样式表达式,可以直接在前端去掉黑底 样式设置代码如下 const s…

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中,IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据,而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题,数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…

云原生势不可挡,如何跳离云原生深水区?

云原生是云计算领域一大热词,伴随云原生概念而来的是数字产业迎来井喷、数字变革来临、数字化得以破局以及新一波的技术红利等等。云原生即“云”原生,顾名思义是让“应用”最大程度地利用云的能力,发挥云价值的最佳路径。具体来说&#xff0…

Eureka增加账号密码认证登录

一、业务背景 注册中心Eureka在微服务开发中经常使用到,用来管理发布的微服务,供前端或者外部调用。但是如果放到生产环境,我们直接通过URL访问的话,这显然是不安全的。 所以需要给注册中心加上登录认证。 通过账号和密码认证进行…

【机器学习】西瓜书习题3.5Python编程实现线性判别分析,并给出西瓜数据集 3.0α上的结果

参考代码 结合自己的理解,添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt导入数据,进行数据处理和特征工程 得到数据集 D { ( x i , y i ) } i 1 m , y i ∈ { 0 ,…

小程序商品如何设置限购

限购是一种常用的小程序商品销售策略,可以帮助商家提高销售额、控制库存和增加用户的购买欲望。那么,小程序产品怎么设置限购呢?下面将为您详细介绍。 1. 设置限购数量 可以设置最低购买数量来鼓励用户批量购买或满足特定的销售需求。例如&…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:FFmpe…

沙箱逃逸复现

当this指向window 原理 1.this直接指向window,拿到window的tostring的constructor来利用构造函数拿到process 是对象且指向沙箱外部,才可以利用 const vm require(vm); const script const process this.toString.constructor(return process)() pr…

OpenCL编程指南-9.1命令、队列、事件

概述 命令队列是OpenCL的核心。平台定义了一个上下文,其中包含一个或多个计算设备。每个计算设备可以有一个或多个命令队列。提交到这些队列的命令将完成OpenCL程序的具体工作。 在一个简单的OpenCL程序中,提交到一个命令队列的命令会按顺序执行。一个…

面试热题100(二叉树的右视图)

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 树这类问题用的最多的就是递归,因为树具有天然的递归结构: 我们来分析一下题目,给定一棵树根结…

vue拖拽改变宽度

1.封装组件ResizeBox.vue <template><div ref"resize" class"resize"><div ref"resizeHandle" class"handle-resize" /><slot /></div> </template> <script> export default {name: Resi…

Python入门自学进阶-Web框架——38、redis、rabbitmq、git

缓存数据库redis&#xff1a; NoSQL&#xff08;Not only SQL&#xff09;泛指非关系型的数据库。为了解决大规模数据集合多重数据类的挑战。 NoSQL数据库的四大分类&#xff1a; 键值&#xff08;Key-Value&#xff09;存储数据库列存储数据库文档型数据库图形&#xff08;…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

【暑期每日一练】 day14

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 …

品牌活动 | 阿里云云原生技术实践营:大模型+CloudOS,实现企业智能化

近日&#xff0c;由阿里云举办的“云原生技术实践营-应用和容器实践专场”在广州顺利开展。行云创新CEO马洪喜作为受邀嘉宾之一&#xff0c;参加了本次活动&#xff0c;分享了主题为“API大语言模型&#xff0c;以非侵入式实现企业业务智能化变革”的演讲&#xff0c;向参会者展…

Java正则校验密码至少包含:字母数字特殊符号中的2种

一、语法 字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c; n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ &#xff0c;\\( 匹配 (。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还会与"\n…

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…