ChatGPT结合知识图谱构建医疗问答应用 (二) - 构建问答流程

news2024/9/23 7:17:51

一、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 json


class 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:疾病,存储着各种疾病的基础信息\n
        department:科室,疾病所对应的科室\n
        symptom:疾病的症状\n
        cureWay:疾病的治疗方式\n
        check:疾病的检查项目\n
        drug:疾病的用药\n
        crowd:疾病易感染人群\n
        food:食物,包括宜吃和忌吃食物\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
        --------------\n
        disease: {name:疾病名称,desc:疾病简介,prevent:预防措施,cause:疾病病因,get_prob:发病率,get_way:传染性,cure_lasttime:治疗周期,cured_prob:治愈概率,cost_money:大概花费}\n
        department: {name:科室名称}\n
        symptom: {name:疾病症状}\n
        cureWay: {name:治疗方式}\n
        check: {name:检查项目}\n
        drug: {name:药物名称}\n
        crowd: {name:感染人群}\n
        food: {name:食物}\n
        --------------
        根据以上背景结合用户输入的问题,生成 OpenCypher 图谱检索语句,可以精准检索到相关的知识信息作为背景。\n
        注意: 仅使用上述提供的实体、关系、属性信息,不要使用额外未提供的内容。实体与实体之间的关系仅使用背景给出的关系\n
        """
        self.prompt = self.prompt + self.format_instructions
        self.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.content
        res = 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 PromptTemplate

class GCLLM():

    def __init__(self):
        # prompt 模版
        self.template = """
        你是一个知识图谱方面的专家,图谱中的基本信息如下:\n
        --------------
        disease:疾病实体,存储着各种疾病的基础信息\n
        department:科室,疾病所对应的科室\n
        symptom:疾病的症状\n
        cureWay:疾病的治疗方式\n
        check:疾病的检查项目\n
        drug:疾病的用药\n
        crowd:疾病易感染人群\n
        food:食物,存吃包括宜吃和忌吃食物\n
        --------------\n
        上一步你生成的 OpenCypher 语句为:
        --------------\n
        {OpenCypher}
        --------------\n
        OpenCypher 语句查询的结果如下:
        --------------\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 os


class 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 = 7474
    kg_user = "neo4j"
    kg_password = "123456"
    qa = QA(kg_host, kg_port, kg_user, kg_password)

    while True:
        questions = input("请输入问题: \n ")
        if questions == "q":
            break
        res = qa.run(questions)
        print("========问题回答结果==========")
        print(res)

三、效果测试

1. 鼻炎的症状有哪些

在这里插入图片描述

2. 鼻炎的治疗周期多久

在这里插入图片描述

3. 鼻炎不适合吃什么东西

在这里插入图片描述

3. 和鼻炎有类似症状的病有哪些

在这里插入图片描述

4. 鼻炎应该检查哪些项目

在这里插入图片描述

四、总结

上面基于医疗的知识图谱大致实现了问答的过程,可以感觉出加入ChatGPT后实现的流程非常简单,但上述流程也还有需要优化的地方,例如用户输入疾病错别字的情况如果 ChatGPT 没有更正有可能导致检索为空,还有就是有些疾病可能有多个名称但名称不在图谱中导致检索失败等等,后面可以考虑加入语义相似度的检索。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-jQuery - Tabs组件函数

窗口小部件选项卡函数可与JqueryUI中的窗口小部件一起使用。选项卡用于在分成逻辑部分的内容之间交换。 Tabs - 语法 $( "#tabs" ).tabs(); Tabs - 示例 以下是显示Tab用法的简单示例- <!doctype html> <html lang"en"><head><m…

选择排序算法

选择排序 算法说明与代码实现&#xff1a; 以下是使用Go语言实现的选择排序算法示例代码&#xff1a; package mainimport "fmt"func selectionSort(arr []int) {n : len(arr)for i : 0; i < n-1; i {minIndex : ifor j : i 1; j < n; j {if arr[j] < a…

一篇关于预测“未来”的教程:运行在 Intel AIxBoard™ 开发板上的 TDengine

英特尔数字化开发套件 AIxBoard 是一款 AI 架构的人工智能嵌入式开发板&#xff0c;体积小巧功能强大&#xff0c;可以在时序数据预测、图像分类、目标检测分割和语音处理等应用中并行运行多个神经网络。作为一款面向专业创客、开发者的功能强大的小型计算机&#xff0c;借助开…

牛客网Verilog刷题——VL48

牛客网Verilog刷题——VL48 题目答案 题目 在data_en为高期间&#xff0c;data_in将保持不变&#xff0c;data_en为高至少保持3个B时钟周期。表明&#xff0c;当data_en为高时&#xff0c;可将数据进行同步。本题中data_in端数据变化频率很低&#xff0c;相邻两个数据间的变化&…

字符串性能优化

String 对象作为 Java 语言中重要的数据类型&#xff0c;是内存中占据空间最大的一个对象。高效地 使用字符串&#xff0c;可以提升系统的整体性能。 来一到题来引出这个话题 通过三种不同的方式创建了三个对象&#xff0c;再依次两两匹配&#xff0c;每组被匹配的两个对象是否…

Eclipse使用Ctrl键导致程序卡死的解决方案

在Eclipse中&#xff0c;经常可以使用Ctrl鼠标单击&#xff0c;可以直接将编辑界面引导到相关的方法&#xff0c;属性&#xff0c;或者类。 这个功能确实非常好用&#xff0c;但是由于复制粘贴的功能快捷键也是Ctrl&#xff0c;以致我在快速进行操作的时候&#xff0c;Eclipse…

tinkerCAD案例:27. Build a Mobile Amplifier 构建移动放大器(2)

tinkerCAD案例&#xff1a;27. Build a Mobile Amplifier 构建移动放大器(2) 原文 step 1 Lesson Overview: 课程概述&#xff1a; Now we’re going to adapt the shape to your device! 现在&#xff0c;我们将根据您的设备调整形状&#xff01; step 2 o create an in…

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

浏览器安装selenium IDE插件并进行网页测试记录

Chrome开发者工具插件,谷歌浏览器开发者工具插件推荐下载_安装_教程-扩展迷 去官网直接搜索下载需要的插件就可。 插件下载安装-Chrome-扩展迷 下载好后解压&#xff1a; 打开Chrome谷歌浏览器&#xff1a; 设置>拓展程序>打开"开发者模式”>将下载好的seleni…

【多模态】21、BARON | 通过引入大量 regions 来提升模型开放词汇目标检测能力(CVPR2021)

文章目录 一、背景二、方法2.1 主要过程2.2 Forming Bag of Regions2.3 Representing Bag of Regions2.4 Aligning bag of regions 三、效果 论文&#xff1a;Aligning Bag of Regions for Open-Vocabulary Object Detection 代码&#xff1a;https://github.com/wusize/ovdet…

SciencePub学术 | 人工智能类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 人工智能类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 人工智能类重点SCIE&EI 【期刊简介】IF&#xff1a;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区&#xff1b; 【出版社…

画架构图工具-haydn

Haydn解决方案数字化平台_海顿解决方案工具链-华为云 下图为haydn架构图示例 Haydn解决方案数字化平台_海顿解决方案工具链-华为云 1、vpc是一个很重要的元素&#xff0c;有网络隔离的作用。 2、OBS、CES、CTS&#xff0c;不需要画到vpc里面。 3、不在区域内的资源&#xf…

Panda 编译时原子化 CSS-in-JS 框架的跨平台方案

Panda 编译时原子化 CSS-in-JS 框架的跨平台方案 Panda 编译时原子化 CSS-in-JS 框架的跨平台方案 对编译时原子化CSS框架的思考编译时 CSS-in-JS 方案对比 LinariaPandacss总结 weapp-pandacss 介绍快速开始 pandacss 安装和配置 0. 安装和初始化 pandacss1. 配置 postcss2. …

Hbase pe 压测 OOM问题解决

说明&#xff1a;本人使用CDH虚拟机搭建了Hbase集群&#xff0c;但是在压测的时发现线程多个的时候直接回OOM,记录一下 执行命令 hbase pe --nomapred --oneContrue --tablerw_test_1 --rows1000 --valueSize100 --compressSNAPPY --presplit10 --autoFlushtrue randomWrite …

SDXL 1.0 介绍和优缺点总结

2023年7月26日:Stability. AI 发布SDXL 1.0&#xff0c;这是对其生成模型的又一次重大更新&#xff0c;带来了突破性的变化。 SDXL 1.0包括两种不同的模型: sdxml -base-1.0:生成1024 x 1024图像的基本文本到图像模型。基本模型使用OpenCLIP-ViT/G和CLIP-ViT/L进行文本编码。…

详解c++继承与多继承

目录 &#x1f684;什么是继承&#x1f689;继承的概念&#x1f683;继承的定义 &#x1f687;继承基类成员访问方式的变化&#x1f686;基类和派生类对象赋值转换&#x1f690;继承时的作用域&#x1f697;派生类的默认成员函数&#x1f693;继承、友元、静态成员&#x1f69a…

运维级影像归档与通信系统(PACS)源码

运维级医院PACS系统源码&#xff0c;带演示&#xff0c;带使用手册和操作说明书 &#xff0c;带三维重建与还原功能&#xff0c;开发环境&#xff1a;VC MSSQL。 一、影像归档与通信系统&#xff08;PACS&#xff09;概述 PACS影像归档与通信系统”( Picture Archiving and C…

小型双轮差速底盘灭火功能的实现

1. 功能说明 灭火机器人是一种特殊的机器人&#xff0c;专门用于进行火灾扑救和灭火任务。它们通常具备以下功能和特点&#xff1a; ① 火灾侦测&#xff1a;灭火机器人配备了各种传感器和探测设备&#xff0c;可以检测烟雾、温度升高等火灾迹象。 ② 火灾扑救&#xff1a;灭火…

cadence virtuoso layout MOS串联线在layout中合并(merge)掉

如图&#xff0c;net10合并掉 解决办法&#xff1a; shiftE&#xff0c;取消勾选Abut server&#xff0c;save

第六章应用层

1.应用层概述 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件、远程登录、文件传输、新闻组) 20世纪90年代将因特网带入千家万户的万维网www 当今流行的即时通信…