LlamaIndex是一個(gè)專注于檢索增強(qiáng)生成(RAG)的工具,可以協(xié)助您豐富大模型的數(shù)據(jù)提示。本文將用實(shí)例向您展示和介紹。
眾所周知,GPT(General Pretrained Transformer)為我們描述了一套通過各種矩陣乘法,實(shí)現(xiàn)輸入、轉(zhuǎn)換和輸出的循環(huán)。其中的單詞(實(shí)際上是文本、聲音或圖像的令牌)會被轉(zhuǎn)換為具有足夠維度的矢量,從而表達(dá)內(nèi)在意義。如下圖所示,為了確保被傳入的上下文是可以計(jì)算的,我們需要注意其臨近的動詞,并通過更多的矩陣乘法塊,來移動向量,進(jìn)而更接近其上下文的真正含義(例如,“黑洞”就不僅僅是一個(gè)黑暗的洞穴的含義)。
不過,GPT產(chǎn)品的瓶頸在于:其對于下一個(gè)詞的猜測,頂多只能和輸入文本語料庫的水平相當(dāng)。而如果我們需要向ChatGPT詢問那些它尚未學(xué)習(xí)過的文本時(shí),鑒于輸入窗口的限制,我們無法將大量文本一次性塞入查詢中。而此時(shí),我們就需要用RAG來對提示進(jìn)行“豐富”。
如果您使用過矢量數(shù)據(jù)庫,那么一定聽說過RAG,它是檢索增強(qiáng)生成(Retrieval Augmented Generation)的縮寫,是一種在無需重新訓(xùn)練的情況下,將新數(shù)據(jù)引入大語言模型(LLM)的方法。而LlamaIndex(https://docs.llamaindex.ai/en/stable/)則是一個(gè)專注于檢索的工具,可被用來協(xié)助您“豐富”數(shù)據(jù)的提示。
開始使用LlamaIndex
如果您想直接上手LlamaIndex,其快速的開始鏈接--https://docs.llamaindex.ai/en/stable/getting_started/installation/,給出了“5行代碼”入手法。
在Mac上,我選擇使用Visual Studio Code來安裝并運(yùn)行Python 3。為此,我會打開一個(gè)Warp終端,并輸入如下命令:
>brew install python3
完成后,我們可以通過如下截圖予以確認(rèn):
接著,我會在該空文件夾中啟動Visual Studio 。在安裝了Python擴(kuò)展后,我使用Python來創(chuàng)建環(huán)境,即:從命令面板(Palette)中創(chuàng)建了一個(gè)特定于項(xiàng)目的虛擬環(huán)境。然后,我選擇了Venv,并最后確認(rèn)了自己正在使用的是剛剛安裝好的Python:
根據(jù)LlamaIndex的說明,我們需要在Visual Studio Code的虛擬環(huán)境中,使用pip安裝lama-index包(注意,是在活動終端而非Warp中):
下面,我需要向環(huán)境出示自己的OpenAI密鑰。鑒于在IDE下運(yùn)行的虛擬環(huán)境的特性,我們將其粘貼在Visual Studio Code運(yùn)行項(xiàng)目所制作的launch.json文件中,是最安全的(當(dāng)然,您可能需要創(chuàng)建一個(gè)OpenAI帳戶。):
..
"configurations":
[
{
"name": "Python Debugger: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"env":
{
"OPENAI_API_KEY": "XXXX"
}
}
]
..
按照LlamaIndex開始教程中的建議,我從鏈接--https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt下載并放置了一個(gè)名為data的文件夾,其中包含了一本冗長的傳記。
在Visual Studio代碼中,我創(chuàng)建了一個(gè)starter.py文件,其內(nèi)容如下:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
可見,就算您對Python并無深入的了解,也能依靠llama_index軟件包構(gòu)建出大部分代碼。下面展示的是它對于查詢的回復(fù):
為了確認(rèn)我確實(shí)調(diào)用了OpenAI,以下便是我?guī)艋顒拥慕y(tǒng)計(jì)數(shù)據(jù):
那么,這段代碼到底能做什么呢?它會將新的文本嵌入到矢量存儲中,并通過調(diào)用VectorStoreIndex以便在查詢時(shí)提供檢索,并在調(diào)用進(jìn)入GPT-3.5之前,以英語形式添加到上下文的窗口中。這便是我在前文中提到的對提示進(jìn)行“豐富”的實(shí)踐。
通過添加兩行日志代碼,我既能夠提取大量密集的REST調(diào)用,也可以從llama_index包中提取如下實(shí)用的提示:
DEBUG:llama_index.core.indices.utils:> Top 2 nodes:
> [Node 167d0eb4-7dba-4b93-85ec-3f5779b32daa] [Similarity score: 0.819982]
"What I Worked On February 2021 Before college the two main things
I worked on, outside of school..."
> [Node ee847bc2-d56a-4c26-afd7-c4bee9a3d116] [Similarity score: 0.811733]
"I remember taking the boys to the coast on a sunny day in 2015 and
figuring out how to deal with ..."
據(jù)此,我們可以了解到其后臺發(fā)生的調(diào)用與變化了。
在完成之前,我會在data文件夾中添加另一個(gè)文檔:莎士比亞的《十四行詩》。雖然我無法保障LLM已經(jīng)有所“知曉”,但是顯然這一堆詩并不會構(gòu)成具有實(shí)際意義的敘事。
據(jù)此,我將使用一個(gè)故意模糊的問題,來運(yùn)行如下額外的查詢:
..
response = query_engine.query("Who is Blessed?")
print(response)
就此,我得到的簡短回答是:
Adonis is Blessed.
是不是非常有趣?在后臺,llama_index包“捕獲”的是這十四行詩中提到Adonis的如下區(qū)域:
“你是被祝福的,你的價(jià)值給了你機(jī)會,你必須勝利,雖然缺乏希望。你的本質(zhì)是什么?你是由什么構(gòu)成的?既然每個(gè)人都有自己的影子,而你也有自己的那個(gè)。不過,每個(gè)影子都能借來指代Adonis和其贗品,也就是去模仿你。在Helen的臉頰上,所有美麗的藝術(shù),就像你在希臘的輪胎上涂上了新的顏色。雖說是春天,但一年后仍會腐朽。一個(gè)是你美麗的影子,另一個(gè)則是你的慷慨,你是我們所知道的每一個(gè)幸福的該有的形狀。”
就像我們之前看到的日志節(jié)點(diǎn)那樣,我也截獲到了如下節(jié)點(diǎn)信息:
DEBUG:llama_index.core.indices.utils:> Top 2 nodes:
> [Node 38e29f53-3656-4b55-ab6b-08acf898f122] [Similarity score: 0.766188]
"Blessed are you whose worthiness gives scope, Being had to triumph,
being lacked to hope. What i..."
> [Node 16d55fda-34ac-42cf-9b08-66d2c6944302] [Similarity score: 0.730936]
"And other strains of woe, which now seem woe, Compared with loss of thee,
will not seem so. Some..."
可見,其中大部分出自十四行詩的第53節(jié)?!癰lessed”一詞確實(shí)出現(xiàn)在“Adonis”的附近。
當(dāng)然,對于表現(xiàn)足夠好的LlamaIndex來說,這些都不是問題。我剛剛使用了構(gòu)建管道的第一步,LlamaIndex后續(xù)會為您提供更多的、以這類方式處理文檔的解釋。
小結(jié)
目前,雖然我們?nèi)匀蝗狈σ环N全面的語言來描述模型內(nèi)部發(fā)生的事情,但是通過LlamaIndex使用的RAG不乏一種可靠的途徑。它既可以增強(qiáng)針對特定領(lǐng)域信息的大語言模型,也可以確保處理結(jié)果的可驗(yàn)證性。而這一切都旨在減少錯誤應(yīng)答的可能,而這正是當(dāng)前困擾人工智能的典型問題。
譯者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗(yàn)。
原文標(biāo)題:A Developer’s Guide to Getting Started with LlamaIndex,作者:David Eastman
鏈接:https://thenewstack.io/a-developers-guide-to-getting-started-with-llamaindex/。