电竞比分网-中国电竞赛事及体育赛事平台

分享

知識圖譜驅動的大語言模型 Llama Index

 奧莉芙小異 2023-11-25 發(fā)布于江西

圖片

  • LLM 應用的范式

  • Llama Index:數據與 LLM 之間的接口

    • 上下文學習

    • 嵌入(Embedding)

    • Llama Index

  • 文檔分割和嵌入的問題

  • 知識圖譜

  • 嵌入和知識圖譜的結合

  • Llama Index 中的知識圖譜進展

LLM 如火如荼地發(fā)展了大半年,各類大模型和相關框架也逐步成型,可被大家應用到業(yè)務實際中。在這個過程中,我們可能會遇到一類問題是:現有的哪些數據,如何更好地與 LLM 對接上。像是大家都在用的知識圖譜,現在的圖譜該如何借助大模型,發(fā)揮更大的價值呢?

在本文,我便會和大家分享下如何利用知識圖譜構建更好的 In-context Learning 大語言模型應用。

此文最初以英文撰寫的,而后我麻煩 ChatGPT 幫我翻譯成了中文。下面是翻譯的 prompt:

“In this thread, you are a Chinese Tech blogger to help translate my blog in markdown from English into Chinese, the blog style is clear, fun yet professional. I will paste chapters in markdown to you and you will send back the translated and polished version.”

圖片
LLM 應用的范式

作為認知智能的一大突破,LLM 已經改變了許多行業(yè),以一種我們沒有預料到的方式進行自動化、加速和啟用。我們每天都會看到新的 LLN 應用被創(chuàng)建出來,我們仍然在探索如何利用這種魔力的新方法和用例。

將 LLM 引入流程的最典型模式之一,是要求 LLM 根據專有的/特定領域的知識理解事物。目前,我們可以向 LLM 添加兩種范式以獲取這些知識:微調——fine-tune 和 上下文學習—— in-context learning

微調是指對 LLM 模型進行附加訓練,以增加額外的知識;而上下文學習是在查詢提示中添加一些額外的知識。

據觀察,目前由于上下文學習比微調更簡單,所以上下文學習比微調更受歡迎,在這篇論文中講述了這一現象:https:///abs/2305.16938

下面,我來分享 NebulaGraph 在上下文學習方法方面所做的工作。

圖片
Llama Index:數據與 LLM 之間的接口

圖片
圖片
上下文學習

上下文學習的基本思想是使用現有的 LLM(未更新)來處理特定知識數據集的特殊任務。

例如,要構建一個可以回答關于某個人的任何問題,甚至扮演一個人的數字化化身的應用程序,我們可以將上下文學習應用于一本自傳書籍和 LLM。在實踐中,應用程序將使用用戶的問題和從書中'搜索'到的一些信息構建提示,然后查詢 LLM 來獲取答案。

┌───────┐         ┌─────────────────┐         ┌─────────┐
│       │         │ Docs/Knowledge  │         │         │
│       │         └─────────────────┘         │         │
│ User  │─────────────────────────────────────?   LLM   │
│       │                                     │         │
│       │                                     │         │
└───────┘                                     └─────────┘

在這種搜索方法中,實現從文檔/知識(上述示例中的那本書)中獲取與特定任務相關信息的最有效方式之一是利用嵌入(Embedding)。

圖片
圖片
嵌入(Embedding)

嵌入通常指的是將現實世界的事物映射到多維空間中的向量的方法。例如,我們可以將圖像映射到一個(64 x 64)維度的空間中,如果映射足夠好,兩個圖像之間的距離可以反映它們的相似性。

嵌入的另一個例子是 word2vec 算法,它將每個單詞都映射到一個向量中。例如,如果嵌入足夠好,我們可以對它們進行加法和減法操作,可能會得到以下結果:

vec(apple) + vec(pie) ≈ vec('apple apie'),或者向量測量值 vec(apple) + vec(pie) - vec('apple apie') 趨近于 0:

|vec(apple) + vec(pie) - vec('apple apie')| ≈ 0

類似地,'pear' 應該比 'dinosaur' 更接近 'apple':|vec(apple) - vec(pear)| < |vec(apple) - vec(dinosaur)|

有了這個基礎,理論上我們可以搜索與給定問題更相關的書籍片段。基本過程如下:

  • 將書籍分割為小片段,為每個片段創(chuàng)建嵌入并存儲它們

  • 當有一個問題時,計算問題的嵌入

  • 通過計算距離找到與書籍片段最相似的前 K 個嵌入

  • 使用問題和書籍片段構建提示

  • 使用提示查詢 LLM

                  ┌────┬────┬────┬────┐                  
                 │ 1  │ 2  │ 3  │ 4  │                  
                 ├────┴────┴────┴────┤                  
                 │  Docs/Knowledge   │                  
┌───────┐         │        ...        │       ┌─────────┐
│       │         ├────┬────┬────┬────┤       │         │
│       │         │ 95 │ 96 │    │    │       │         │
│       │         └────┴────┴────┴────┘       │         │
│ User  │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─?   LLM   │
│       │                                     │         │
│       │                                     │         │
└───────┘    ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐  └─────────┘
   │          ┌──────────────────────────┐        ▲    
   └────────┼?│  Tell me ....., please   │├───────┘    
              └──────────────────────────┘              
            │ ┌────┐ ┌────┐               │            
              │ 3  │ │ 96 │                            
            │ └────┘ └────┘               │            
             ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
圖片
圖片
Llama Index

Llama Index 是一個開源工具包,它能幫助我們以最佳實踐去做 in-context learning:

  • 它提供了各種數據加載器,以統(tǒng)一格式序列化文檔/知識,例如 PDF、維基百科、Notion、Twitter 等等,這樣我們可以無需自行處理預處理、將數據分割為片段等操作。

  • 它還可以幫助我們創(chuàng)建嵌入(以及其他形式的索引),并以一行代碼的方式在內存中或向量數據庫中存儲嵌入。

  • 它內置了提示和其他工程實現,因此我們無需從頭開始創(chuàng)建和研究,例如,《用 4 行代碼在現有數據上創(chuàng)建一個聊天機器人》。

圖片
文檔分割和嵌入的問題

嵌入和向量搜索在許多情況下效果良好,但在某些情況下仍存在挑戰(zhàn),比如:丟失全局上下文/跨節(jié)點上下文。

想象一下,當查詢'請告訴我關于作者和 foo 的事情',在這本書中,假設編號為 1、3、6、19-25、30-44 和 96-99 的分段都涉及到 foo 這個主題。那么,在這種情況下,簡單地搜索與書籍片段相關的前 K 個嵌入可能效果不盡人意,因為這時候只考慮與之最相關的幾個片段(比如 K = 3),會丟失了許多上下文信息。

┌────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │
├────┴────┴────┴────┤
│  Docs/Knowledge   │
│        ...        │
├────┬────┬────┬────┤
│ 95 │ 96 │    │    │
└────┴────┴────┴────┘

而解決、緩解這個問題的方法,在 Llama Index 工具的語境下,可以創(chuàng)建組合索引和綜合索引。

其中,向量存儲(VectorStore)只是其中的一部分。除此之外,我們可以定義一個摘要索引、樹形索引等,以將不同類型的問題路由到不同的索引,從而避免在需要全局上下文時錯失它。

然而,借助知識圖譜,我們可以采取更有意思的方法:

圖片
知識圖譜

知識圖譜這個術語最初由谷歌在 2012 年 5 月提出,作為其增強搜索結果,向用戶提供更多上下文信息的一部分實踐。知識圖譜旨在理解實體之間的關系,并直接提供查詢的答案,而不僅僅返回相關網頁的列表。

知識圖譜是一種以圖結構形式組織和連接信息的方式,其中節(jié)點表示實體,邊表示實體之間的關系。圖結構允許用戶高效地存儲、檢索和分析數據。

它的結構如下圖所示:

圖片

現在問題就來了,上面說過知識圖譜能幫忙搞定文檔分割和嵌入的問題。那么,知識圖譜到底能怎么幫到我們呢?

圖片
嵌入和知識圖譜的結合

這里的基本實現思想是,作為信息的精煉格式,知識圖譜可切割的數據顆粒度比我們人工的分割的更細、更小。將知識圖譜的小顆粒數據與原先人工處理的大塊數據相結合,我們可以更好地搜索需要全局/跨節(jié)點上下文的查詢。

下面來做個題:請看下面的圖示,假設提問同 x 有關,所有數據片段中有 20 個與 x 高度相關?,F在,除了獲取主要上下文的前 3 個文檔片段(比如編號為 1、2 和 96 的文檔片段),我們還從知識圖譜中對 x 進行兩次跳轉查詢,那么完整的上下文將包括:

  • 問題:'Tell me things about the author and x'

  • 來自文檔片段編號 1、2 和 96 的原始文檔。在 Llama Index 中,它們被稱為節(jié)點 1、節(jié)點 2 和節(jié)點 96。

  • 包含 'x' 的知識圖譜中的 10 個三元組,通過對 x 進行兩層深度的圖遍歷得到:

    • x -> y(來自節(jié)點 1)

    • x -> a(來自節(jié)點 2)

    • x -> m(來自節(jié)點 4)

    • x <- b-> c(來自節(jié)點 95)

    • x -> d(來自節(jié)點 96)

    • n -> x(來自節(jié)點 98)

    • x <- z <- i(來自節(jié)點 1 和節(jié)點 3)

    • x <- z <- b(來自節(jié)點 1 和節(jié)點 95)

顯然,那些(可能很寶貴的)涉及到主題 x 的精煉信息來自于其他節(jié)點以及跨節(jié)點的信息,都因為我們引入知識圖譜,而能夠被包含在 prompt 中,用于進行上下文學習,從而克服了前面提到的問題。

┌──────────────────┬──────────────────┬──────────────────┬──────────────────┐
│ .─.       .─.    │  .─.       .─.   │            .─.   │  .─.       .─.   │
│( x )─────? y )   │ ( x )─────? a )  │           ( j )  │ ( m )?────( x )  │
│ `▲'       `─'    │  `─'       `─'   │            `─'   │  `─'       `─'   │
│  │     1         │        2         │        3    │    │        4         │
│ .─.              │                  │            .▼.   │                  │
│( z )?────────────┼──────────────────┼───────────( i )─┐│                  │
│ `?────┐          │                  │            `─'  ││                  │
├───────┼──────────┴──────────────────┴─────────────────┼┴──────────────────┤
│       │                      Docs/Knowledge           │                   │
│       │                            ...                │                   │
│       │                                               │                   │
├───────┼──────────┬──────────────────┬─────────────────┼┬──────────────────┤
│  .─.  └──────.   │  .─.             │                 ││  .─.             │
│ ( x ?─────( b )  │ ( x )            │                 └┼?( n )            │
│  `─'       `─'   │  `─'             │                  │  `─'             │
│        95   │    │   │    96        │                  │   │    98        │
│            .▼.   │  .▼.             │                  │   ▼              │
│           ( c )  │ ( d )            │                  │  .─.             │
│            `─'   │  `─'             │                  │ ( x )            │
└──────────────────┴──────────────────┴──────────────────┴──`─'─────────────┘

圖片
Llama Index 中的知識圖譜進展

最初,William F.H.將知識圖譜的抽象概念引入了 Llama Index,其中知識圖譜中的三元組與關鍵詞相關聯,并存儲在內存中的文檔中,隨后Logan Markewich還增加了每個三元組的嵌入。

最近的幾周中,我一直在與 Llama Index 社區(qū)合作,致力于將 'GraphStore' 存儲上下文引入 Llama Index,從而引入了知識圖譜的外部存儲。首個知識圖譜的外部存儲是對接開源分布式圖數據庫 NebulaGraph,目前在我的努力下已經實現了。

在實現過程中,還引入了遍歷圖的多個跳數選項以及在前 K 個節(jié)點中收集更多關鍵實體的選項,用于在知識圖譜中搜索以獲得更多全局上下文。上面提到的這些變更還在陸續(xù)完善中。

在大模型中引入 GraphStore 后,還可以從現有的知識圖譜中進行上下文學習,并與其他索引結合使用,這也非常有前景。因為知識圖譜被認為具有比其他結構化數據更高的信息密度。

本文作為開篇,講述了一些知識圖譜和 LLM 的關系。在后續(xù)的文章中,將會偏向實操同大家分享具體的知識圖譜和 LLM 的應用實踐。

圖片
END

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多