LLM 應(yīng)用的范式
Llama Index:數(shù)據(jù)與 LLM 之間的接口
上下文學(xué)習(xí)
嵌入(Embedding)
Llama Index
文檔分割和嵌入的問題
知識圖譜
嵌入和知識圖譜的結(jié)合
Llama Index 中的知識圖譜進(jìn)展
LLM 如火如荼地發(fā)展了大半年,各類大模型和相關(guān)框架也逐步成型,可被大家應(yīng)用到業(yè)務(wù)實際中。在這個過程中,我們可能會遇到一類問題是:現(xiàn)有的哪些數(shù)據(jù),如何更好地與 LLM 對接上。像是大家都在用的知識圖譜,現(xiàn)在的圖譜該如何借助大模型,發(fā)揮更大的價值呢?
在本文,我便會和大家分享下如何利用知識圖譜構(gòu)建更好的 In-context Learning 大語言模型應(yīng)用。
此文最初以英文撰寫的,而后我麻煩 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.”
作為認(rèn)知智能的一大突破,LLM 已經(jīng)改變了許多行業(yè),以一種我們沒有預(yù)料到的方式進(jìn)行自動化、加速和啟用。我們每天都會看到新的 LLN 應(yīng)用被創(chuàng)建出來,我們?nèi)匀辉谔剿魅绾卫眠@種魔力的新方法和用例。
將 LLM 引入流程的最典型模式之一,是要求 LLM 根據(jù)專有的/特定領(lǐng)域的知識理解事物。目前,我們可以向 LLM 添加兩種范式以獲取這些知識:微調(diào)——fine-tune 和 上下文學(xué)習(xí)—— in-context learning。
微調(diào)是指對 LLM 模型進(jìn)行附加訓(xùn)練,以增加額外的知識;而上下文學(xué)習(xí)是在查詢提示中添加一些額外的知識。
據(jù)觀察,目前由于上下文學(xué)習(xí)比微調(diào)更簡單,所以上下文學(xué)習(xí)比微調(diào)更受歡迎,在這篇論文中講述了這一現(xiàn)象:https://arxiv.org/abs/2305.16938。
下面,我來分享 NebulaGraph 在上下文學(xué)習(xí)方法方面所做的工作。
上下文學(xué)習(xí)的基本思想是使用現(xiàn)有的 LLM(未更新)來處理特定知識數(shù)據(jù)集的特殊任務(wù)。
例如,要構(gòu)建一個可以回答關(guān)于某個人的任何問題,甚至扮演一個人的數(shù)字化化身的應(yīng)用程序,我們可以將上下文學(xué)習(xí)應(yīng)用于一本自傳書籍和 LLM。在實踐中,應(yīng)用程序?qū)⑹褂糜脩舻膯栴}和從書中'搜索'到的一些信息構(gòu)建提示,然后查詢 LLM 來獲取答案。
┌───────┐ ┌─────────────────┐ ┌─────────┐
│ │ │ Docs/Knowledge │ │ │
│ │ └─────────────────┘ │ │
│ User │─────────────────────────────────────? LLM │
│ │ │ │
│ │ │ │
└───────┘ └─────────┘
在這種搜索方法中,實現(xiàn)從文檔/知識(上述示例中的那本書)中獲取與特定任務(wù)相關(guān)信息的最有效方式之一是利用嵌入(Embedding)。
嵌入通常指的是將現(xiàn)實世界的事物映射到多維空間中的向量的方法。例如,我們可以將圖像映射到一個(64 x 64)維度的空間中,如果映射足夠好,兩個圖像之間的距離可以反映它們的相似性。
嵌入的另一個例子是 word2vec 算法,它將每個單詞都映射到一個向量中。例如,如果嵌入足夠好,我們可以對它們進(jìn)行加法和減法操作,可能會得到以下結(jié)果:
vec(apple) + vec(pie) ≈ vec('apple apie'),或者向量測量值 vec(apple) + vec(pie) - vec('apple apie') 趨近于 0:
|vec(apple) + vec(pie) - vec('apple apie')| ≈ 0
類似地,'pear' 應(yīng)該比 'dinosaur' 更接近 'apple':|vec(apple) - vec(pear)| < |vec(apple) - vec(dinosaur)|
有了這個基礎(chǔ),理論上我們可以搜索與給定問題更相關(guān)的書籍片段?;具^程如下:
將書籍分割為小片段,為每個片段創(chuàng)建嵌入并存儲它們
當(dāng)有一個問題時,計算問題的嵌入
通過計算距離找到與書籍片段最相似的前 K 個嵌入
使用問題和書籍片段構(gòu)建提示
使用提示查詢 LLM
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┴────┴────┴────┤
│ Docs/Knowledge │
┌───────┐ │ ... │ ┌─────────┐
│ │ ├────┬────┬────┬────┤ │ │
│ │ │ 95 │ 96 │ │ │ │ │
│ │ └────┴────┴────┴────┘ │ │
│ User │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─? LLM │
│ │ │ │
│ │ │ │
└───────┘ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ └─────────┘
│ ┌──────────────────────────┐ ▲
└────────┼?│ Tell me ....., please │├───────┘
└──────────────────────────┘
│ ┌────┐ ┌────┐ │
│ 3 │ │ 96 │
│ └────┘ └────┘ │
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
Llama Index 是一個開源工具包,它能幫助我們以最佳實踐去做 in-context learning:
它提供了各種數(shù)據(jù)加載器,以統(tǒng)一格式序列化文檔/知識,例如 PDF、維基百科、Notion、Twitter 等等,這樣我們可以無需自行處理預(yù)處理、將數(shù)據(jù)分割為片段等操作。
它還可以幫助我們創(chuàng)建嵌入(以及其他形式的索引),并以一行代碼的方式在內(nèi)存中或向量數(shù)據(jù)庫中存儲嵌入。
它內(nèi)置了提示和其他工程實現(xiàn),因此我們無需從頭開始創(chuàng)建和研究,例如,《用 4 行代碼在現(xiàn)有數(shù)據(jù)上創(chuàng)建一個聊天機(jī)器人》。
嵌入和向量搜索在許多情況下效果良好,但在某些情況下仍存在挑戰(zhàn),比如:丟失全局上下文/跨節(jié)點上下文。
想象一下,當(dāng)查詢'請告訴我關(guān)于作者和 foo 的事情',在這本書中,假設(shè)編號為 1、3、6、19-25、30-44 和 96-99 的分段都涉及到 foo 這個主題。那么,在這種情況下,簡單地搜索與書籍片段相關(guān)的前 K 個嵌入可能效果不盡人意,因為這時候只考慮與之最相關(guān)的幾個片段(比如 K = 3),會丟失了許多上下文信息。
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┴────┴────┴────┤
│ Docs/Knowledge │
│ ... │
├────┬────┬────┬────┤
│ 95 │ 96 │ │ │
└────┴────┴────┴────┘
而解決、緩解這個問題的方法,在 Llama Index 工具的語境下,可以創(chuàng)建組合索引和綜合索引。
其中,向量存儲(VectorStore)只是其中的一部分。除此之外,我們可以定義一個摘要索引、樹形索引等,以將不同類型的問題路由到不同的索引,從而避免在需要全局上下文時錯失它。
然而,借助知識圖譜,我們可以采取更有意思的方法:
知識圖譜這個術(shù)語最初由谷歌在 2012 年 5 月提出,作為其增強(qiáng)搜索結(jié)果,向用戶提供更多上下文信息的一部分實踐。知識圖譜旨在理解實體之間的關(guān)系,并直接提供查詢的答案,而不僅僅返回相關(guān)網(wǎng)頁的列表。
知識圖譜是一種以圖結(jié)構(gòu)形式組織和連接信息的方式,其中節(jié)點表示實體,邊表示實體之間的關(guān)系。圖結(jié)構(gòu)允許用戶高效地存儲、檢索和分析數(shù)據(jù)。
它的結(jié)構(gòu)如下圖所示:
現(xiàn)在問題就來了,上面說過知識圖譜能幫忙搞定文檔分割和嵌入的問題。那么,知識圖譜到底能怎么幫到我們呢?
這里的基本實現(xiàn)思想是,作為信息的精煉格式,知識圖譜可切割的數(shù)據(jù)顆粒度比我們?nèi)斯さ姆指畹母?xì)、更小。將知識圖譜的小顆粒數(shù)據(jù)與原先人工處理的大塊數(shù)據(jù)相結(jié)合,我們可以更好地搜索需要全局/跨節(jié)點上下文的查詢。
下面來做個題:請看下面的圖示,假設(shè)提問同 x 有關(guān),所有數(shù)據(jù)片段中有 20 個與 x 高度相關(guān)?,F(xiàn)在,除了獲取主要上下文的前 3 個文檔片段(比如編號為 1、2 和 96 的文檔片段),我們還從知識圖譜中對 x 進(jìn)行兩次跳轉(zhuǎn)查詢,那么完整的上下文將包括:
問題:'Tell me things about the author and x'
來自文檔片段編號 1、2 和 96 的原始文檔。在 Llama Index 中,它們被稱為節(jié)點 1、節(jié)點 2 和節(jié)點 96。
包含 'x' 的知識圖譜中的 10 個三元組,通過對 x 進(jìn)行兩層深度的圖遍歷得到:
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 中,用于進(jìn)行上下文學(xué)習(xí),從而克服了前面提到的問題。
┌──────────────────┬──────────────────┬──────────────────┬──────────────────┐
│ .─. .─. │ .─. .─. │ .─. │ .─. .─. │
│( 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 ) │
└──────────────────┴──────────────────┴──────────────────┴──`─'─────────────┘
最初,William F.H.將知識圖譜的抽象概念引入了 Llama Index,其中知識圖譜中的三元組與關(guān)鍵詞相關(guān)聯(lián),并存儲在內(nèi)存中的文檔中,隨后Logan Markewich還增加了每個三元組的嵌入。
最近的幾周中,我一直在與 Llama Index 社區(qū)合作,致力于將 'GraphStore' 存儲上下文引入 Llama Index,從而引入了知識圖譜的外部存儲。首個知識圖譜的外部存儲是對接開源分布式圖數(shù)據(jù)庫 NebulaGraph,目前在我的努力下已經(jīng)實現(xiàn)了。
在實現(xiàn)過程中,還引入了遍歷圖的多個跳數(shù)選項以及在前 K 個節(jié)點中收集更多關(guān)鍵實體的選項,用于在知識圖譜中搜索以獲得更多全局上下文。上面提到的這些變更還在陸續(xù)完善中。
在大模型中引入 GraphStore 后,還可以從現(xiàn)有的知識圖譜中進(jìn)行上下文學(xué)習(xí),并與其他索引結(jié)合使用,這也非常有前景。因為知識圖譜被認(rèn)為具有比其他結(jié)構(gòu)化數(shù)據(jù)更高的信息密度。
本文作為開篇,講述了一些知識圖譜和 LLM 的關(guān)系。在后續(xù)的文章中,將會偏向?qū)嵅偻蠹曳窒砭唧w的知識圖譜和 LLM 的應(yīng)用實踐。
聯(lián)系客服