大语言模型Prompt工程之使用GPT4生成图数据库Cypher

  • 大语言模型Prompt工程之使用GPT4生成图数据库Cypher

Here’s the table of contents:

大语言模型Prompt工程之使用GPT4生成图数据库Cypher

使用GPT4测试了生成Cypher的能力,没想到大型语言模型(LLM,Large Language Model)效果能好成这样,非常惊艳!

之前的文章中介绍了,使图数据库快速搭建一个可配置图谱问答系统的功能。其中Cypher的解析、组合生成和意图识别等能力是依赖于规则的配置,基于配置模块可以灵活实现问答系统的运转。

  1. 基于知识图谱的问答机器人
  2. 图谱问答:案例快速开始指南
  3. 图谱问答:自定义组装问答系统进阶指南

基于规则的方法,最大的缺点是泛化能力比较差,带来的问题是后续维护会有不小的工作量。但是在某些模型不能很好解决的场景下,基于规则的方法还是可以发挥不小的价值。模型+规则可以让系统运行的更加高效和准确(LLM Prompt工程涉及规则的方法)。为了让系统生成Cypher的能力更强,本文尝试了GPT4的能力。

通过测试发现,设计合适的Prompt工程以后,GPT4生成Cypher非常棒,简单查询和复杂查询都可以自动生成且不存在语法错误(没有发现)。

Prompt中会传入一些样例问题和Cypher,模型通过样例问题和Cypher就能学会该类的问题和Cypher模式,并应用在同类不同参数的查询上(其中一些参数模型也能推理后自动生成)。所以需要提前生成和设计一些问答对的数据,并保存形成Prompt库进行动态调用。当一个提问不存在类似的Example时,模型不会生成Cypher或生成一个不存在的Cypher(图数据库中模式不存在不会影响最终结果,因为结果为空),这类可以视为图谱回答不了的问题。下面可以看一下,一些LLM Generate Cypher | 使用大语言模型生成Cypher测试结果:

  • Prompt函数定义

examples()中定义了样例问答对,ask为传入的问题。

def prompt(ask):return f"""您是一名助手,能够根据示例Cypher查询生成Cypher查询。示例Cypher查询有:\n {examples()} \n除了Cypher查询之外,不要回复任何解释或任何其他信息。您永远不要为你的不准确回复感到抱歉,并严格根据提供的cypher示例生成cypher语句。不要提供任何无法从Cypher示例中推断出的Cypher语句。当由于缺少对话上下文而无法推断密码语句时,通知用户,并说明缺少的上下文是什么。现在请为这个查询生成Cypher:# {ask}"""
  • Cypher生成结果

以下是一些测试结果已经在数据集上测试过没有问题,作者也尝试过其它数据集的生成效果,结果也都很不错。

  • 样例数据
# GPT-4 Test Result:
# QA:你好(正确生成)
# RE:请提供您希望查询的信息,以便我为您生成相应的Cypher查询语句。如果可以,请提供与示例Cypher查询相似的信息和要求。# QA:最近半导体上涨的原因是什么?(正确生成)
# RE:您好,根据提供的Cypher示例,我无法为您生成关于 "最近半导体上涨的原因是什么" 的Cypher查询。请提供与您需求相关的Cypher查询示例以便我为您提供有效的查询语句。# QA:海南有哪些上市公司?(正确生成)
# RE:
#   MATCH p0=(n0:股票)-[r0:地域]->(n1:地域) WHERE n1.value='海南'
#   RETURN DISTINCT n0 AS n4 LIMIT 10# QA:电气设备行业有多少家上市公司?(正确生成)
# RE:
#   MATCH p0=(n0:股票)-[r0:所属行业]->(n1:行业)
#   WHERE n1.value='电气设备'
#   RETURN COUNT(DISTINCT n0) AS n4# QA:水泥行业博士学历的男性高管有多少位?(正确生成)
# RE:
#   MATCH
#       p0=(n1:行业)<-[r0:所属行业]-(n0:股票)<-[r1:任职于]-(n2:高管)-[r2:性别]->(n3:性别)-[r4:别名]->(n5:性别_别名),
#       p1=(n2)-[r3:学历]->(n4:学历)
#   WHERE n1.value='水泥' AND n5.value='男性' AND n4.value='博士'
#   RETURN COUNT(DISTINCT n2) AS n3# QA:在北京由硕士学历的女性高管任职的上市公司,都属于哪些行业?
# RE:
#   MATCH
#       p1=(n1:地域)<-[:地域]-(n2:股票)<-[:任职于]-(n3:高管)-[:性别]->(n4:性别),
#       p2=(n3)-[:学历]->(n5:学历),
#       p3=(n2)-[:所属行业]->(n6:行业)
#   WHERE n1.value='北京' AND n5.value='硕士' AND n4.value='F'
#   RETURN DISTINCT n6.value AS hy
  • 完整代码
# Reference:https://medium.com/neo4j/context-aware-knowledge-graph-chatbot-with-gpt-4-and-neo4j-d3a99e8ae21e
import requests# 使用HTTP封装的GPT-4接口,请根据具体接口情况替换
def gpt4(msg):# 设置请求头headers = {"Content-type": "application/json"}url = 'http://localhost:8080/cgpt-api/gpt4_question'data = {"ask_str": msg,}response = requests.post(url, json=data, headers=headers)return response.json()['data']['content']# 从下面graph-qabot-demo可配置知识图谱问答项目中获取原始样例查询,然后将ID(ID为配置系统为Cypher生成)替换为具体的字段属性过滤,生成examples
# https://github.com/ongdb-contrib/graph-qabot
# https://github.com/ongdb-contrib/graph-qabot-demo
def examples():return '''# 火力发电行业博士学历的男性高管有多少位?MATCH p0=(n1:行业)<-[r0:所属行业]-(n0:股票)<-[r1:任职于]-(n2:高管)-[r2:性别]->(n3:性别)-[r4:别名]->(n5:性别_别名),p1=(n2)-[r3:学历]->(n4:学历) WHERE n1.value='火力发电' AND n5.value='男性' AND n4.value='博士'RETURN COUNT(DISTINCT n2) AS n3# 山西都有哪些上市公司?MATCH p0=(n0:股票)-[r0:地域]->(n1:地域) WHERE n1.value='山西' RETURN DISTINCT n0 AS n4 LIMIT 10# 富奥股份的高管都是什么学历?MATCH p0=(n1:股票名称)<-[r0:股票名称]-(n0:股票)<-[r1:任职于]-(n2:高管)-[r2:学历]->(n3:学历) WHERE n1.value='富奥股份'RETURN DISTINCT n3 AS n2 LIMIT 10# 中国宝安属于什么行业?MATCH p0=(n1:股票名称)<-[r0:股票名称]-(n0:股票)-[r1:所属行业]->(n2:行业) WHERE n1.value='中国宝安'RETURN DISTINCT n2 AS n5 LIMIT 10# 建筑工程行业有多少家上市公司?MATCH p0=(n0:股票)-[r0:所属行业]->(n1:行业) WHERE n1.value='建筑工程'RETURN COUNT(DISTINCT n0) AS n4# 刘卫国是哪个公司的高管?MATCH p0=(n0:股票)<-[r0:任职于]-(n1:高管) WHERE n1.value='刘卫国'RETURN DISTINCT n0 AS n4 LIMIT 10# 美丽生态上市时间是什么时候?MATCH p0=(n1:股票名称)<-[r0:股票名称]-(n0:股票)-[r1:上市日期]->(n2:上市日期) WHERE n1.value='美丽生态'RETURN DISTINCT n2 AS n1 LIMIT 10# 山西的上市公司有多少家?MATCH p0=(n0:股票)-[r0:地域]->(n1:地域) WHERE n1.value='山西'RETURN COUNT(DISTINCT n0) AS n4# 博士学历的高管都有哪些?MATCH p0=(n0:高管)-[r0:学历]->(n1:学历) WHERE n1.value='博士' RETURN DISTINCT n0 AS n3 LIMIT 10# 上市公司是博士学历的高管有多少个?MATCH p0=(n0:高管)-[r0:学历]->(n1:学历) WHERE n1.value='博士'RETURN COUNT(DISTINCT n0) AS n3# 刘卫国是什么学历?MATCH p0=(n0:高管)-[r0:学历]->(n1:学历) WHERE n0.value='刘卫国'RETURN DISTINCT n1 AS n2 LIMIT 10# 富奥股份的男性高管有多少个?MATCH p0=(n1:股票名称)<-[r0:股票名称]-(n0:股票)<-[r1:任职于]-(n2:高管)-[r2:性别]->(n3:性别)-[r3:别名]->(n4:性别_别名) WHERE n1.value='富奥股份' AND n4.value='男性'RETURN COUNT(DISTINCT n2) AS n3# 同在火力发电行业的上市公司有哪些?MATCH p0=(n0:股票)-[r0:所属行业]->(n1:行业) WHERE n1.value='火力发电' RETURN DISTINCT n0 AS n4 LIMIT 10# 同在火力发电行业的上市公司有多少家?MATCH p0=(n0:股票)-[r0:所属行业]->(n1:行业) WHERE n1.value='火力发电'RETURN COUNT(DISTINCT n0) AS n4# 大悦城和荣盛发展是同一个行业嘛?MATCH p0=(n1:股票名称)<-[r0:股票名称]-(n0:股票)-[r1:所属行业]->(n2:行业) WHERE n1.value IN ['大悦城','荣盛发展']RETURN DISTINCT n2 AS n5 LIMIT 10# 同在河北的上市公司有哪些?MATCH p0=(n0:股票)-[r0:地域]->(n1:地域) WHERE n1.value='河北' RETURN DISTINCT n0 AS n4 LIMIT 10# 神州高铁是什么时候上市的?MATCH p0=(n1:股票名称)<-[r0:股票名称]-(n0:股票)-[r1:上市日期]->(n2:上市日期) WHERE n1.value='神州高铁' RETURN DISTINCT n2 AS n1 LIMIT 10# 火力发电行业男性高管有多少个?MATCH p0=(n1:行业)<-[r0:所属行业]-(n0:股票)<-[r1:任职于]-(n2:高管)-[r2:性别]->(n3:性别)-[r3:别名]->(n4:性别_别名) WHERE n1.value='火力发电' AND n4.value='男性'RETURN COUNT(DISTINCT n2) AS n3# 2023年三月六日上市的股票代码?MATCH p0=(n0:股票)-[r0:上市日期]->(n1:上市日期) WHERE (n1.value>=20230306 AND n1.value<=20230306) RETURN DISTINCT n0 AS n4 LIMIT 10# 2023年三月六日上市的股票有哪些?MATCH p0=(n0:股票)-[r0:上市日期]->(n1:上市日期) WHERE (n1.value>=20230306 AND n1.value<=20230306) RETURN DISTINCT n0 AS n4 LIMIT 10# 2023年三月六日上市的股票有多少个?MATCH p0=(n0:股票)-[r0:上市日期]->(n1:上市日期) WHERE (n1.value>=20230306 AND n1.value<=20230306) RETURN COUNT(DISTINCT n0) AS n4# 胡永乐是什么性别?MATCH p0=(n0:高管)-[r0:性别]->(n1:性别) WHERE n0.value='胡永乐' RETURN DISTINCT n1 AS n7 LIMIT 10# 在山东由硕士学历的男性高管任职的上市公司,都属于哪些行业?MATCH p1=(n1:`地域`)<-[:`地域`]-(n2:`股票`)<-[:`任职于`]-(n3:`高管`)-[:`性别`]->(n4:`性别`),p2=(n3)-[:`学历`]->(n5:学历),p3=(n2)-[:`所属行业`]->(n6:行业)WHERE n1.value='山东' AND n5.value='硕士' AND n4.value='M'RETURN DISTINCT n6.value AS hy'''def prompt(ask):return f"""您是一名助手,能够根据示例Cypher查询生成Cypher查询。示例Cypher查询有:\n {examples()} \n除了Cypher查询之外,不要回复任何解释或任何其他信息。您永远不要为你的不准确回复感到抱歉,并严格根据提供的cypher示例生成cypher语句。不要提供任何无法从Cypher示例中推断出的Cypher语句。当由于缺少对话上下文而无法推断密码语句时,通知用户,并说明缺少的上下文是什么。现在请为这个查询生成Cypher:# {ask}"""if __name__ == '__main__':# 输入问题ask = '在北京由硕士学历的女性高管任职的上市公司,都属于哪些行业?'print(gpt4(prompt(ask)))# GPT-4 Test Result:
# QA:你好(正确生成)
# RE:请提供您希望查询的信息,以便我为您生成相应的Cypher查询语句。如果可以,请提供与示例Cypher查询相似的信息和要求。# QA:最近半导体上涨的原因是什么?(正确生成)
# RE:您好,根据提供的Cypher示例,我无法为您生成关于 "最近半导体上涨的原因是什么" 的Cypher查询。请提供与您需求相关的Cypher查询示例以便我为您提供有效的查询语句。# QA:海南有哪些上市公司?(正确生成)
# RE:
#   MATCH p0=(n0:股票)-[r0:地域]->(n1:地域) WHERE n1.value='海南'
#   RETURN DISTINCT n0 AS n4 LIMIT 10# QA:电气设备行业有多少家上市公司?(正确生成)
# RE:
#   MATCH p0=(n0:股票)-[r0:所属行业]->(n1:行业)
#   WHERE n1.value='电气设备'
#   RETURN COUNT(DISTINCT n0) AS n4# QA:水泥行业博士学历的男性高管有多少位?(正确生成)
# RE:
#   MATCH
#       p0=(n1:行业)<-[r0:所属行业]-(n0:股票)<-[r1:任职于]-(n2:高管)-[r2:性别]->(n3:性别)-[r4:别名]->(n5:性别_别名),
#       p1=(n2)-[r3:学历]->(n4:学历)
#   WHERE n1.value='水泥' AND n5.value='男性' AND n4.value='博士'
#   RETURN COUNT(DISTINCT n2) AS n3# QA:在北京由硕士学历的女性高管任职的上市公司,都属于哪些行业?
# RE:
#   MATCH
#       p1=(n1:地域)<-[:地域]-(n2:股票)<-[:任职于]-(n3:高管)-[:性别]->(n4:性别),
#       p2=(n3)-[:学历]->(n5:学历),
#       p3=(n2)-[:所属行业]->(n6:行业)
#   WHERE n1.value='北京' AND n5.value='硕士' AND n4.value='F'
#   RETURN DISTINCT n6.value AS hy

大语言模型Prompt工程之使用GPT4生成图数据库Cypher相关推荐

  1. 大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher

    大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher 大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher Here's the table of contents: ...

  2. 如何创建高效的Prompt和ChatGPT等大语言模型AI对话

    大语言模型,如OpenAI的GPT-4,是一种基于深度学习技术的自然语言处理工具,它可以理解自然语言并为用户提供有价值的回答.然而,要从大语言模型中获得高质量的回答,你需要学会如何高效地提问.本文将从 ...

  3. Prompt工程:AI2.0时代打开大模型能力的金钥匙

    如果说互联网时代是一个人配一个电脑,AI新时代,或将是一个AI大模型配一个人. ChatGPT显然已经成为一场比赛,但事实上,ChatGPT.文心一言.Midjourney等AIGC产品仅仅是拉开了A ...

  4. 用LangChain构建大语言模型应用

    用LangChain构建大语言模型应用 自 ChatGPT 发布以来,大型语言模型 (LLM) 广受欢迎.尽管您可能没有足够的资金和计算资源从头开始训练自己的大语言模型,但您仍然可以使用预训练的大语言 ...

  5. ChatGPT的朋友们:大语言模型经典论文一次读到吐

    作者 | 菜人卷 整理 | NewBeeNLP https://zhuanlan.zhihu.com/p/620360553 大家好,这里是 NewBeeNLP. 要说2023刷屏最多的词条,Chat ...

  6. 谷歌FLAN-T5作者亲讲:5400亿参数,1800个任务,如何实现大语言模型“自我改进”...

    2021年,谷歌的研究者们提出了FLAN大模型,其基于Instruction Tuning的方式,极大地提升了大语言模型的理解能力.同时,各种Prompting方法的涌现预示着针对大模型的下游微调将成 ...

  7. 大语言模型: 新的摩尔定律?

    来自:Hugging Face 进NLP群->加入NLP交流群 译者按: 最近一段时间,ChatGPT 作为一个现象级应用迅速蹿红,也带动了对其背后的大语言模型 (LLM) 的讨论,这些讨论甚至 ...

  8. 【自然语言处理】【chatGPT系列】大语言模型可以自我改进

    大语言模型可以自我改进 <Large Language Models Can Self-Improve> 论文地址:https://arxiv.org/pdf/2210.11610.pdf ...

  9. 一文读懂“大语言模型”

    1.背景 本文基于谷歌云的官方视频:<Introduction to Large Language Models> ,使用 ChatGPT4 整理而成,希望对大家入门大语言模型有帮助. 本 ...

最新文章

  1. Python3 MySQL 数据库连接 - PyMySQL 驱动
  2. 牛客java面试题总结版(三)
  3. C# SharpMap 学习总结
  4. App相互唤醒的几种方式
  5. linux下带.d的文件夹,linux – 如何在shell脚本中包含目录中的所有文件(在本例中为/etc/init.d/iptables)...
  6. 如何构建和部署 SAP Commerce Cloud 项目
  7. java slf4j_SLF4J 使用手册
  8. 树莓派SSH 连接不上:socket error Event:32 Error:10053
  9. threadlocal get为空_面试常见知识点:ThreadLocal
  10. Servlet Filter
  11. 【英语学习】【WOTD】grift 释义/词源/示例
  12. python处理文本
  13. 比较LANG和NLS_LANG在Linux中的作用
  14. mpi并行 写同一文件_并行计算调度策略的笔记(001)
  15. 组态王的日历时间控件脚本
  16. 什么是常量,常量的类型有哪些?
  17. 【一名合格前端工程师的自检清单】--自检答案
  18. 一年365天,把1.0作为每天的能力值基础,每天原地踏步 则能力值为1.0,如果每天努力一点点则能力值提高1%,每天再努力一点则能力值提高2%,那一年后,这3种行为收获的成果相差多少呢?
  19. 基于django+mysql的教师教学质量评价系统源代码,教学评价系统源码
  20. 秒杀抢红包的思考和总结

热门文章

  1. 微信小程序IOS IphoneX上边框显示不全
  2. mysql 创建外键
  3. 对当前的学习生活工作的反思和总结
  4. TF31002问题解决办法
  5. thinkphp6+webuploader实现大文件(视频)分片上传/本地保存或上传OSS
  6. 【新闻】德国法院:苹果新闻稿误导消费者iPhone并未解禁
  7. leetcode 5-最长回文子串(中心扩展算法)
  8. 装修时不需要拆换的地板,橱柜要做好保护
  9. 录音有杂音怎么提取人声,分享三个方法给大家!
  10. 贝叶斯分类器算法原理