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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章