乐趣区

关于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)工具,它们能够帮咱们做很多正当的形象,从而防止从头去实现很多通用的脚手架代码:

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

而且,这些编排工具还内置了很多工程办法的最佳实际。这样,咱们经常调用一个办法就能够用到最新、最好用的大语言模型钻研论文的办法了,比方 FLARE、Guidence。

为此,我在 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 只是一个开始,请大家关注咱们后续的文章,展示更多常识图谱、图数据库为大语言模型生态带来的改革。

相干浏览

  • 对于 LLM 和图、图数据库的那些事
  • LLM:常识图谱的另类实际
  • 图技术在 LLM 下的利用:常识图谱驱动的大语言模型 Llama Index
  • 利用 ChatGLM 构建常识图谱

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

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

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

退出移动版