Text2Cypher:大語言模型驅動的圖查詢生成

發表於2023-09-19

話接上文 《圖技術在 LLM 下的應用:知識圖譜驅動的大語言模型 Llama Index》 同大家簡單介紹過 LLM 和圖、知識圖譜相關的結合,現在我來和大家分享下zui新的成果。畢竟,從 GPT-3 開始展現出超出預期的 “理解能力 “開始,我一直在做 Graph + LLM 技術組合、互補的研究、探索和分享,截止到現在 NebulaGraph 已經在 LlamaIndex 與 Langchain 專案做出了不少領先的貢獻。

是時候,來給你展示展示我的勞動成果了。本文的主題是我們認為這個 LLM+ 領域zui唾手可得、zui容易摘取的果實,Text2Cypher:自然語言生成圖查詢。

Text2Cypher

顧名思義,Text2Cypher 做的就是把自然語言的文字轉換成 Cypher 查詢語句的這件事兒。和另一個大家可能已經比較熟悉的場景 Text2SQL:文字轉換 SQL 在形式上沒有什麼區別。而本質上,大多數知識圖譜、圖資料庫的應用都是在圖上按照人類意願進行查詢,我們在圖資料庫上構造方便的視覺化工具、封裝方便的 API 的工作都是為這個目標服務的。

一直以來,阻礙圖資料庫、知識圖譜被更廣泛應用的主要因素可能就是圖資料庫的查詢門檻了。那麼,在沒有大語言模型的時候,我們是怎麼做的呢?

傳統的 Text2Cypher

文字到查詢這個領域,在大語言模型之前就一直存在這樣的需求,一直是知識圖譜zui常見的應用之一,比如 KBQA(基於知識庫的問答系統)的系統內部本質上就是 Text2Cypher。

這裡以我之前寫的專案  (發音:/ˈ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 模型或者程式碼把相應的意圖和實體構造成知識圖譜的查詢語句,zui終查詢圖資料庫,並根據返回結果構造答案。

可以想象,讓程式能夠:

  • 從自然語言中理解意圖:對應到哪一類支援回答的問題
  • 找出實體:問題中涉及到的主要個體
  • 從意圖和實體構造查詢語句

這不可能是一個容易的開發工作,一個真正能夠落地的實現,其訓練的模型或者實現的規則程式碼,所需考慮的邊界條件可能非常多。

三行程式碼搞定 Text2Cypher

而在 “後大語言模型” 時代,這種從前需要專門訓練或者寫規則的 “智慧” 應用場景成了通用模型 + 提示工程(Prompt Engineering)就能完成的任務。

注:提示工程(prompt)是指透過自然語言描述,讓生成模型、語言模型完成 “智慧” 任務的方法。

事實上,在 GPT-3 剛釋出之後,我就開始利用它幫助我寫很多非常複雜的 Cypher 查詢語句了,我發現它可以寫很多非常複雜的模式匹配、多步條件那種之前我需要一點點除錯,半天才能寫出來的語句。通常在它的答案之上,我只需要稍微修改就可以了,而且往往我還能從它的答案裡知道我之前沒了解到的 Cypher 語法盲區。

後來,在今年二月份的時候,我就試著實現了一個基於 GPT-3 (因為那時候還沒有 GPT-3.5)的專案: ( )。

圖 1:Demo 圖

它的工作原理非常簡單,和 Text2SQL 沒有區別。大語言模型已經透過公共領域學習了 Cypher 的語法表達,我們在提出任務的時候,只需要讓 LLM 知道我們要查詢的圖的 Schema 作為上下文就可以了。

所以,基本上 prompt 就是:

你是一位 NebulaGraph Cypher 專家,請根據給定的圖 Schema 和問題,寫出查詢語句。schema 如下:---{schema}---問題如下:---{question}---下面寫出查詢語句:

然而,真實世界的 prompt 往往還需要增加額外的要求:

  • 只返回語句,不用給出解釋,不用道歉
  • 強調不要寫超出 schema 之外的點、邊型別

感興趣的同學,可以參考我在 LlamaIndex 的  。

在真實場景中,我們想快速學習、構建大語言模型應用的時候,常常會用到 LangChain 或者 LlamaIndex 這樣的編排(Orchestrator)工具,它們可以幫我們做很多合理的抽象,從而避免從頭去實現很多通用的腳手架程式碼:

  • 和不同語言模型互動
  • 和不同向量資料庫互動
  • 資料分割

而且,這些編排工具還內建了很多工程方法的zui佳實踐。這樣,我們常常呼叫一個方法就可以用到zui新、zui好用的大語言模型研究論文的方法了,比如  、 。

為此,我在 LlamaIndex 和 LangChain 中都貢獻了可以方便進行 NebulaGraph 上 Text2Cypher 的工具,真正做到 3 行程式碼,Text2Cypher。

NebulaGraph 上的 Text2Cypher

在 LlamaIndex 的  KnowledgeQueryEngine 和 LangChain 的  NebulaGraphQAChain 中:NebulaGraph 圖資料庫的 Schema 獲取、Cypher 語句生成的 prompt、各種 LLM 的呼叫、結果的處理、銜接,我們可以全都不用關心,開箱即用!

使用 LlamaIndex

用 LlamaIndex,我們只需要:

  • 建立一個  NebulaGraphStore 例項
  • 建立一個  KnowledgeQueryEngine

就可以直接進行問答了,是不是超級簡單?具體的過程,可以參考文件:

from llama_index.query_engine import KnowledgeGraphQueryEnginefrom llama_index.storage.storage_context import StorageContextfrom llama_index.graph_stores import NebulaGraphStoregraph_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 例項

就可以直接提問了。還是一樣,具體過程參考文件:

from langchain.chat_models import ChatOpenAIfrom langchain.chains import NebulaGraphQAChainfrom langchain.graphs import NebulaGraphgraph = 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 地址:  體驗下。

這個 Demo 展示瞭如何利用 LLM 從不同型別的資訊源(以維基百科為例)中抽取知識三元組,並儲存到圖資料庫 NebulaGraph 中。

本 Demo 中,我們先抽取了維基百科中關於《銀河護衛隊 3》的資訊,再利用 LLM 生成的知識三元組,構建了一個圖譜。跟著,利用 Cypher 查詢圖譜,zui後利用 LlamaIndex 和 LangChain 中的 Text2Cypher,實現了自然語言查詢圖譜的功能。

當然,你可以點選其他標籤親自試玩圖譜的視覺化、Cypher 查詢、自然語言查詢(Text2Cypher)等功能。

這裡可以  完整的 Jupyter Notebook。

結論

有了 LLM,知識圖譜、NebulaGraph 圖資料庫中的的資料中進行 Text2Cypher 從來沒有這麼簡單過。

一個具有更強人機、機器接入的知識圖譜可以代表了全新的時代,我們可能不需要從前那樣高額成本去實現相簿之上的後端服務,也不再需要培訓才能讓領域專家從圖中獲取重要的洞察了。

利用 LlamaIndex 或者 LangChain 中的生態整合,我們可以幾乎沒有開發成本地幾行程式碼把自己的應用、圖資料智慧化。

然而,Text2Cypher 只是一個開始,請大家關注我們後續的文章,展現更多知識圖譜、圖資料庫為大語言模型生態帶來的變革。

相關閱讀


謝謝你讀完本文 (///▽///)

如果你想嚐鮮圖資料庫 NebulaGraph,記得去 GitHub 下載、使用、(^з^)-☆ star 它 ->  ;和其他的 NebulaGraph 使用者一起交流圖資料庫技術和應用技能,留下 「你的名片」一起玩耍呀~

2023 年 NebulaGraph 技術社群年度徵文活動正在進行中,來這裡領取華為 Meta 60 Pro、Switch 遊戲機、小米掃地機器人等等禮品喲~活動連結: https://discuss.nebula-graph.com.cn/t/topic/13970


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952037/viewspace-2984558/,如需轉載,請註明出處,否則將追究法律責任。

相關文章