首頁 >後端開發 >Python教學 >RAG、向量搜尋及其在 IRIS RAG 應用程式中如何在 IRIS 上實施的擴展說明

RAG、向量搜尋及其在 IRIS RAG 應用程式中如何在 IRIS 上實施的擴展說明

Susan Sarandon
Susan Sarandon原創
2024-12-04 13:16:15712瀏覽

An Expanded Explanation of RAG, Vector Search, and how it is implemented on IRIS in the IRIS RAG App

我收到了社群成員對我提交的 Python 2024 競賽的一些非常好的回饋。希望我可以轉寄到這裡:

您建造了一個超過純 IRIS 5 倍大小的容器

這需要時間

容器啟動也很慢但完成

可以依照描述存取後端

正在製作

前端反應

我無法理解要顯示的內容

這個解釋是給我以外的專家看的

提交內容在這裡:https://openexchange.intersystems.com/package/IRIS-RAG-App

我真的很感謝這個回饋,尤其是因為這是對有關該專案的文章的一個很好的提示。該項目包含相當全面的文檔,但它確實假設您熟悉向量嵌入、RAG 管道和 LLM 文本生成,以及 python 和某些流行的 python 庫,如 LLamaIndex。

這篇文章完全沒有使用AI 編寫,旨在嘗試解釋這些內容以及它們如何在這個專案中組合在一起以演示RAG IRIS 上的工作流程。

容器很大,因為建立向量嵌入所涉及的 python 套件所需的函式庫相依性非常大。透過更有選擇性的進口,規模可能會大幅縮小。 

最初建造容器確實需要時間,但是一旦完成,啟動它所需的時間就會更少。啟動時間肯定還可以改進。啟動花費如此多時間的主要原因是,entrypoint.sh 的更新假設自上次啟動以來可能對應用程式的任何部分進行了更改,包括資料庫遷移、CSS 配置、JavaScript 配置和Python後端程式碼,並且每次啟動時都會重新編譯整個專案。這是為了更容易開始在該專案上進行開發,否則每當進行更改時正確運行前端和後端建置可能會很棘手。這樣,如果您更改了專案中的任何程式碼,您只需要重新啟動容器,也許可以在後端恢復生產,您的變更就應該反映在應用程式的介面和操作中。

我相當確定後端的生產是將 http 請求傳遞到 Django 應用程序,並且對於此包中的互操作性至關重要。不過,我是 IRIS 平台的新手,對於製作還有更多需要了解。

接下來我想對向量嵌入、LLM 和 RAG 進行全面的解釋。其中第一個被發明的是向量嵌入。首先我們可以描述一個向量。在大多數情況下,向量是一個方向。這是一個指向太空某處的箭頭。更正式地說,向量是「具有方向和大小的量」。這可以以煙火為例,它沿著特定方向傳播並在空間中的特定點爆炸。假設每個煙火都是從同一個中心點(原點 [0,0,0])發射的,但它們都會飛出並在該原點周圍的雲中爆炸。從數學上講,您可以使用三坐標系 [x,y,z] 來描述每個煙火爆炸的位置,這將是煙火爆炸的「向量嵌入」。如果您拍攝了大量煙火表演影片並將所有煙火爆炸記錄為資料集,那麼您將建立一種煙火表演的向量嵌入資料庫或向量儲存。

您可以用有關煙火表演的資訊做什麼?如果我指出一個特定的煙火並詢問在整個表演中最接近同一點爆炸的煙火,您可以找到在太空中附近點爆炸的其他煙火。您只需找到最接近的,並且有數學可以做到這一點。

記住,我們只為每個煙火記錄了三個數字,即三維空間中的x、y 和z 座標,[0,0, 0]是地面上的煙火發射器。 

如果我還想知道與另一個特定煙火距離最近且時間最接近爆炸的煙火怎麼辦?要知道這一點,我們必須回顧煙火表演的影片片段並記錄每次爆炸的時間。現在我們有一個包含 4 個數字的 4 維向量:煙火爆炸的三維位置和爆炸時間。現在,透過為向量嵌入添加另一個維度,我們可以為煙火表演提供更具描述性的嵌入類型。

這如何轉換成機器學習?長話短說,透過處理大量文字數據,電腦科學家成功創建了嵌入模型,可以將一段文字(如短語、句子、段落甚至頁面)轉換為一個很長的系列代表理論高維空間中的點的數字。

不是 4 個數字,而是 300、700、甚至 1500 個。這些代表了一段文本可以「接近」或「接近」的 1500 種方式。距離另一個“遠”,或1500個維度的意義。對許多人來說,這是一個令人著迷的概念,我們有辦法創建以某種方式表示一段文字語義的數字。

使用數學,可以比較這些高維文本向量嵌入中的兩個,以找出它們彼此之間的相似或「接近」程度(如果它們是)由同一模型創建。 

這是此應用程式中發生的第一件事。使用者必須放入文件並為其命名,然後選擇嵌入類型。伺服器取得該文檔,將其分解為文字區塊,然後將每個區塊轉換為向量嵌入,並將該區塊保存為該文檔的專用表中的一行。每個文件都儲存在自己的專用表中,以允許不同文字嵌入模型建立的向量嵌入的長度可變。

一旦文件作為向量嵌入儲存在資料庫中,使用者就可以輸入查詢來「詢問」文件。該查詢有兩種使用方式。第一種方法是搜尋文件。我們不進行傳統的文字搜索,而是進行「向量搜尋」。該應用程式接受查詢,將其轉換為向量嵌入,然後查找文件中具有與查詢向量嵌入最相似的嵌入的部分。然後為每個文件部分產生 0 到 1 之間的相似度分數,並根據 top_k_similarity 和相似度閾值從向量資料庫中檢索多個部分。基本上,您可以詢問它要檢索多少個文件部分,以及它們必須與您的查詢有多相似才能有資格檢索。

這就是檢索增強一代中的檢索。下一步是生成。

一旦電腦科學家弄清楚如何將文字轉換為語意上重要的數字向量嵌入,下一步就是建立可以產生文字的模型。他們取得了巨大成功,現在我們有了 GPT-4、LLama3 和 Claude 3.5 等大型語言模型。這些法學碩士可以接受提示或查詢,並提供完成或答案,這是它認為最有可能從所呈現的提示文本繼續的文本。

LLM 必須接受大量文字資料的培訓,並且他們的回答或完成僅限於該培訓資料。當我們希望法學碩士提供的補全可能包含其訓練集中未包含的數據,或將其補全基於一組特定的知識時,一種方法是在提示中包含額外的上下文數據。基本上,如果我們想從法學碩士那裡得到關於未經培訓的問題的答案,我們必須在提示中提供資訊。

許多人發現自己處於這樣一種情況,他們希望 chatGPT 或本地 LLama 安裝可以根據自己的個人文件提供答案。在您的文件中搜尋該訊息,將其貼到提示中,然後輸入您的問題,這非常簡單,人們發現自己手動執行此操作。這就是它自己的檢索增強生成形式。 RAG 只是自動查找與用戶查詢相關的信息,並將其與查詢一起提供給法學碩士以獲得更準確或更有用的回應。

在此應用程式中,我們透過向量搜尋檢索的文件部分將與查詢一起傳送到所選的LLM,在介面中標記為模型,以提供答案的上下文。

在我為這個專案製作的影片範例中,我問「這部劇中的反派是誰?」以及文件《哈姆雷特》和《李爾王》,其中包含兩部莎士比亞戲劇的全部文本。 IRIS 資料庫已經有兩張表,一張是《哈姆雷特》,一張是《李爾王》。每個表都充滿了行向量嵌入,這些向量嵌入是透過將每個戲劇的文本分割成多個部分而創建的。這些嵌入是一長串數字,代表每個文件部分中含義的多個維度。 

伺服器使用生成向量嵌入的相同文字到向量模型將問題「誰是這部劇中的反派」轉換為數字向量尋找李爾王表中與其最相似的部分。是的,這些部分可能提到了惡棍這個詞,但也可能提到了其他惡棍,例如背叛、背叛和欺騙,即使沒有明確提到惡棍。這些文件部分將添加到查詢中,並作為提示一起發送給法學碩士,然後法學碩士根據提供的文檔部分回答問題。

這是針對每個文件單獨完成的,這就是為什麼查詢的答案會根據所查詢的文件而不同的原因。這就完成了首字母縮略詞,因為我們正在使用向量搜尋的力量來檢索相關上下文資訊來增強法學碩士答案的生成。

非常感謝任何花時間閱讀本文的人,我很樂意在以後的文章中擴展這些主題。隨時歡迎反饋。

以上是RAG、向量搜尋及其在 IRIS RAG 應用程式中如何在 IRIS 上實施的擴展說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn