Text2Cypher:大语言模型驱动的图查询生成

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本文的主题是我们认为这个 LLM+ 领域最唾手可得、最容易摘取的果实,Text2Cypher:自然语言生成图查询。输入自然语言,生成相对应的图查询语句,甚至可以直接返回该语句执行结果。

话接上文《图技术在 LLM 下的应用:知识图谱驱动的大语言模型 Llama Index》 同大家简单介绍过 LLM 和图、知识图谱相关的结合,现在我来和大家分享下最新的成果。毕竟,从 GPT-3 开始展现出超出预期的“理解能力“开始,我一直在做 Graph + LLM 技术组合、互补的研究、探索和分享,截止到现在 NebulaGraph 已经在 LlamaIndex 与 Langchain 项目做出了不少领先的贡献。

是时候,来给你展示展示我的劳动成果了。本文的主题是我们认为这个 LLM+ 领域最唾手可得、最容易摘取的果实,Text2Cypher:自然语言生成图查询。

Text2Cypher

顾名思义,Text2Cypher 做的就是把自然语言的文本转换成 Cypher 查询语句的这件事儿。和另一个大家可能已经比较熟悉的场景 Text2SQL:文本转换 SQL 在形式上没有什么区别。而本质上,大多数知识图谱、图数据库的应用都是在图上按照人类意愿进行查询,我们在图数据库上构造方便的可视化工具、封装方便的 API 的工作都是为这个目标服务的。

一直以来,阻碍图数据库、知识图谱被更广泛应用的主要因素可能就是图数据库的查询门槛了。那么,在没有大语言模型的时候,我们是怎么做的呢?

传统的 Text2Cypher

文本到查询这个领域,在大语言模型之前就一直存在这样的需求,一直是知识图谱最常见的应用之一,比如 KBQA(基于知识库的问答系统)的系统内部本质上就是 Text2Cypher。

这里以我之前写的项目 Siwi(发音:/ˈsɪwi/,一个基于篮球运动员数据集的问答应用)为例。

先来了解一下它的后端架构:

┌─────────────┬───────────────────────────────────┐
│      Speech │  Frontend                         │
│  ┌──────────▼──────────┐ Siwi, /ˈsɪwi/          │
│  │ Web_Speech_API      │ A PoC of Dialog System │
│  │ Vue.JS              │ With Graph Database    │
│  │                     │ Backed Knowledge Graph │
│  └──────────┬──────────┘                        │
│             │  Sentence  Backend                │
│┌────────────┼────────────────────────────┐      │
││ ┌──────────▼──────────┐                 │      │
││ │ Web API, Flask      │ ./app/          │      │
││ └──────────┬──────────┘                 │      │
││            │  Sentence  ./bot/          │      │
││ ┌──────────▼──────────┐                 │      │
││ │ Intent Matching,    │ ./bot/classifier│      │
││ │ Symentic Processing │                 │      │
││ └──────────┬──────────┘                 │      │
││            │  Intent, Enties            │      │
││ ┌──────────▼──────────┐                 │      │
││ │ Intent Actor        │ ./bot/actions   │      │
│└─┴──────────┬──────────┴─────────────────┘      │
│             │  Graph Query                      │
│  ┌──────────▼──────────┐                        │
│  │ Graph Database      │  NebulaGraph           │
│  └─────────────────────┘                        │
└─────────────────────────────────────────────────┘

当一个问题语句发送过来之后,它首先要做意图识别(Intent)、实体识别(Entity),然后再利用 NLP 模型或者代码把相应的意图和实体构造成知识图谱的查询语句,最终查询图数据库,并根据返回结果构造答案。

可以想象,让程序能够:

  • 从自然语言中理解意图:对应到哪一类支持回答的问题
  • 找出实体:问题中涉及到的主要个体
  • 从意图和实体构造查询语句

这不可能是一个容易的开发工作,一个真正能够落地的实现,其训练的模型或者实现的规则代码,所需考虑的边界条件可能非常多。

三行代码搞定 Text2Cypher

而在“后大语言模型”时代,这种从前需要专门训练或者写规则的“智能”应用场景成了通用模型 + 提示工程(Prompt Engineering)就能完成的任务。

注:提示工程(prompt)是指通过自然语言描述,让生成模型、语言模型完成“智能”任务的方法。

事实上,在 GPT-3 刚发布之后,我就开始利用它帮助我写很多非常复杂的 Cypher 查询语句了,我发现它可以写很多非常复杂的模式匹配、多步条件那种之前我需要一点点调试,半天才能写出来的语句。通常在它的答案之上,我只需要稍微修改就可以了,而且往往我还能从它的答案里知道我之前没了解到的 Cypher 语法盲区。

后来,在今年二月份的时候,我就试着实现了一个基于 GPT-3 (因为那时候还没有 GPT-3.5)的项目:ngql-GPT代码仓库)。

图 1:Demo 图

它的工作原理非常简单,和 Text2SQL 没有区别。大语言模型已经通过公共领域学习了 Cypher 的语法表达,我们在提出任务的时候,只需要让 LLM 知道我们要查询的图的 Schema 作为上下文就可以了。

所以,基本上 prompt 就是:

你是一位 NebulaGraph Cypher 专家,请根据给定的图 Schema 和问题,写出查询语句。
schema 如下:
---
{schema}
---
问题如下:
---
{question}
---
下面写出查询语句:

然而,真实世界的 prompt 往往还需要增加额外的要求:

  • 只返回语句,不用给出解释,不用道歉
  • 强调不要写超出 schema 之外的点、边类型

感兴趣的同学,可以参考我在 LlamaIndex 的 KnowlegeGraph Query Engine 中的实现

在真实场景中,我们想快速学习、构建大语言模型应用的时候,常常会用到 LangChain 或者 LlamaIndex 这样的编排(Orchestrator)工具,它们可以帮我们做很多合理的抽象,从而避免从头去实现很多通用的脚手架代码:

  • 和不同语言模型交互
  • 和不同向量数据库交互
  • 数据分割

而且,这些编排工具还内置了很多工程方法的最佳实践。这样,我们常常调用一个方法就可以用到最新、最好用的大语言模型研究论文的方法了,比如 FLAREGuidence

为此,我在 LlamaIndex 和 LangChain 中都贡献了可以方便进行 NebulaGraph 上 Text2Cypher 的工具,真正做到 3 行代码,Text2Cypher。

NebulaGraph 上的 Text2Cypher

在 LlamaIndex 的 KnowledgeQueryEngine 和 LangChain 的 NebulaGraphQAChain 中:NebulaGraph 图数据库的 Schema 获取、Cypher 语句生成的 prompt、各种 LLM 的调用、结果的处理、衔接,我们可以全都不用关心,开箱即用!

使用 LlamaIndex

用 LlamaIndex,我们只需要:

  • 创建一个 NebulaGraphStore 实例
  • 创建一个 KnowledgeQueryEngine

就可以直接进行问答了,是不是超级简单?具体的过程,可以参考文档:https://gpt-index.readthedocs.io/en/latest/examples/query_engine/knowledge_graph_query_engine.html

from llama_index.query_engine import KnowledgeGraphQueryEngine
from llama_index.storage.storage_context import StorageContext
from llama_index.graph_stores import NebulaGraphStore

graph_store = NebulaGraphStore(
  space_name=space_name, edge_types=edge_types, rel_prop_names=rel_prop_names, tags=tags)
storage_context = StorageContext.from_defaults(graph_store=graph_store)

nl2kg_query_engine = KnowledgeGraphQueryEngine(
    storage_context=storage_context,
    service_context=service_context,
    llm=llm,
    verbose=True,
)
# 问答
response = nl2kg_query_engine.query(
    "Tell me about Peter Quill?",
)
# 只生成语句
graph_query = nl2kg_query_engine.generate_query(
    "Tell me about Peter Quill?",
)

使用 LangChain

类似的,在 Langchain 里,我们只需要:

  • 创建一个 NebulaGraph实例
  • 创建一个 NebulaGraphQAChain 实例

就可以直接提问了。还是一样,具体过程参考文档:https://python.langchain.com/docs/modules/chains/additional/graph_nebula_qa

from langchain.chat_models import ChatOpenAI
from langchain.chains import NebulaGraphQAChain
from langchain.graphs import NebulaGraph

graph = NebulaGraph(
    space=space_name,
    username="root",
    password="nebula",
    address="127.0.0.1",
    port=9669,
    session_pool_size=30,
)

chain = NebulaGraphQAChain.from_llm(
    llm, graph=graph, verbose=True
)

chain.run(
    "Tell me about Peter Quill?",
)

Demo

如果你对 Text2Cypher 感兴趣,可以去 Demo 地址:https://www.siwei.io/demos/text2cypher/ 体验下。

这个 Demo 展示了如何利用 LLM 从不同类型的信息源(以维基百科为例)中抽取知识三元组,并存储到图数据库 NebulaGraph 中。

本 Demo 中,我们先抽取了维基百科中关于《银河护卫队3》的信息,再利用 LLM 生成的知识三元组,构建了一个图谱。跟着,利用 Cypher 查询图谱,最后利用 LlamaIndex 和 LangChain 中的 Text2Cypher,实现了自然语言查询图谱的功能。

当然,你可以点击其他标签亲自试玩图谱的可视化、Cypher 查询、自然语言查询(Text2Cypher)等功能。

这里可以下载 完整的 Jupyter Notebook。

结论

有了 LLM,知识图谱、NebulaGraph 图数据库中的的数据中进行 Text2Cypher 从来没有这么简单过。

一个具有更强人机、机器接入的知识图谱可以代表了全新的时代,我们可能不需要从前那样高额成本去实现图库之上的后端服务,也不再需要培训才能让领域专家从图中获取重要的洞察了。

利用 LlamaIndex 或者 LangChain 中的生态集成,我们可以几乎没有开发成本地几行代码把自己的应用、图数据智能化。

然而,Text2Cypher 只是一个开始,请大家关注我们后续的文章,展现更多知识图谱、图数据库为大语言模型生态带来的变革。

相关阅读


谢谢你读完本文 (///▽///)

如果你想尝鲜图数据库 NebulaGraph,记得去 GitHub 下载、使用、(^з^)-☆ star 它 -> GitHub;和其他的 NebulaGraph 用户一起交流图数据库技术和应用技能,留下「你的名片」一起玩耍呀~

2023 年 NebulaGraph 技术社区年度征文活动正在进行中,来这里领取华为 Meta 60 Pro、Switch 游戏机、小米扫地机器人等等礼品哟~ 活动链接:https://discuss.nebula-graph.com.cn/t/topic/13970

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础第一篇(SQL通用语法与分类)
MySQL数据库基础第一篇(SQL通用语法与分类)
|
3月前
|
SQL 数据库 索引
SQL语言入门:如何表达你的数据需求
在数据库的世界里,SQL(Structured Query Language)是一种至关重要的语言,它允许用户与数据库进行交互,执行数据的查询、更新、插入和删除等操作
|
5月前
|
SQL 人工智能 关系型数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 文档模型中Schema的灵活性
【6月更文挑战第8天】网状模型是层次模型的扩展,允许节点有多重父节点,但导航复杂,需要预知数据库结构。关系模型将数据组织为元组和关系,强调声明式查询,解耦查询语句与执行路径,简化了访问并通过查询优化器提高效率。文档型数据库适合树形结构数据,提供弱模式灵活性,但在Join支持和访问局部性上不如关系型。关系型数据库通过外键和Join处理多对多关系,适合高度关联数据。文档型数据库的模式灵活性体现在schema-on-read,写入时不校验,读取时解析,牺牲性能换取灵活性。适用于不同类型或结构变化的数据场景。
49 0
|
6月前
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
72 2
|
6月前
|
设计模式 虚拟化 开发者
利用SwiftUI构建动态列表的高级技巧
【4月更文挑战第14天】 在本文中,我们将深入探讨如何运用SwiftUI框架实现一个具有高度交互性和动态性的列表视图。我们将透过具体实例,展示如何结合SwiftUI的声明式语法与先进的设计模式,来优化列表的性能和用户体验。文中将涵盖数据绑定、动画过渡、以及状态管理的实用技巧,并讨论如何通过这些技术提升应用的响应性和可扩展性。
|
SQL 关系型数据库 数据库
关系数据库SQL语言简介
一、关系数据库SQL语言简介 SQL(Structured Query Language)是关系型数据库管理系统(RDBMS)中最常用的语言。它是一种标准化的语言,用于存储、操作和查询数据。SQL语言具有以下特点: 1. 数据操作语言(DML):用于对数据库中的数据进行增、删、改等操作,包括INSERT、UPDATE、DELETE等命令。 2. 数据定义语言(DDL):用于定义数据库的结构,包括表、字段、索引、视图等,包括CREATE、ALTER、DROP等命令。 3. 数据查询语言(DQL):用于查询数据库中的数据,包括SELECT、FROM、WHERE等命令。 4. 数据控制语言(DCL)
269 0
|
6月前
|
存储 JSON 程序员
C#实现数据导出任一Word图表的通用呈现方法及一些体会
C#实现数据导出任一Word图表的通用呈现方法及一些体会
|
uml C++
VS工具使用——代码生成函数关系图
小引: 在上篇文章《VS工具使用——代码图》中,我向大家介绍了我对工具“代码图”的发现和认识。真是感觉当自己的眼睛不再被蒙蔽的时候,会发现整个世界的美好。所以,这次要向大家介绍我对VS中的另一个容易被忽视的工具—— 自动生成代码关系依赖图的理解。
586 0
|
存储 编译器 C#
【C#基础】C# 基础语法解析
编程语言 C# 基础语法的介绍 。
102 0
【C#基础】C# 基础语法解析
SQL通用语言之五项进阶操作
引入 何为进阶?当我们跳出了原有限制进行更新、自定义化更强的操作时就是进阶的开始。 本期我们就将进行几个原有限制的跳出—— join连接:跳出单个数据表的限制 SubQuery子查询:跳出单层逻辑的限制 常用函数:跳出工具的单一性限制 groupby分组 having过滤分组
SQL通用语言之五项进阶操作