RAG 是什麼? Embedding? Embedding Model?

Charleskanp
8 min readFeb 21, 2024

--

檢索增強生成Retrieval Augmented Generation(RAG),你最近是否被這個流行語所淹沒而不知所措? 你不是孤獨的。 相信我,這絕對不是一個相對直觀的名字。

就連創造這個詞的作者 Patrick Lewis也說過 :“I apologized for the unflattering acronym. ”

我撰寫這篇文章的目的是為了把自己在這個「流行」的大海中收集到的知識做整理學習,在這篇文章中,你會對RAG有所了解,而為了更好地理解RAG,我同時也會對Embedding 及 Embedding Model進行一些淺說明。

RAG的命名?

首先,讓我們先忘記Retrieval Augmented,只談論一下有關Generation的部分,在RAG中,這通常是指Large Language Model(LLM),它生成文字以回應用戶的查詢,最佳例子是聞名的ChatGPT。而這些LLM 都是Generative AI的一種形式,Generation這個詞亦指Generative AI的未來世代。

GPT變笨了?

不知道你有沒有曾經聽過ChatGPT變笨了的一些用戶反映,這有很多原因,但其中之一可能是由於LLM的挑戰。我想告訴你一個軼事來幫助我說明這點。

最近我有個朋友很沉迷觀星,有一天他突然問我:「你知道太陽系有多少個行星嗎?」我回答:「我小時候學過,是9個。」但現在這個回答有些問題,第一,我只根據記憶來回答,沒有任何證據支持;第二,我的回答是過時的。

這跟LLM有什麼關係?

同樣,對沒有持續學習能力的LLM來說,模型在訓練後凍結,但輸入分佈卻不斷漂移,如果模型不能適應變化,而使用者的期待不斷提高,在用戶的角度來看就是變笨了。當然,實際GPT變笨有很多原因,這可能只是其中之一。

在與LLM的互動中,這兩種行為經常被視為挑戰:

1. 沒有來源(No source)

2. 數據過時(Out of date)

那麼假如我拿出手機,然後去NASA這樣有權威性的網站查詢會怎麼樣?那我就可以說:「好吧,我知道是8個,NASA網站有寫冥王星已經降級成矮行星。」現在我的答案建立在更可信的基礎上,我沒有產生知識的幻覺,這就是RAG。

查詢資料再回答就是RAG?

檢索增強生成(RAG)是一種架構解決方案,目的是為了解決LLM面臨的挑戰。原本用戶向LLM提出問題,LLM直接給予回應,但由於LLM的局限性,只能反映訓練後的答案,它會自信地回答用戶每一個問題,即使答案實際上可能是錯誤的。但現在,在RAG框架裡面,我們會有一個資料儲存,裡面存放我們希望LLM搜索的內容,指示LLM在產生回答前先搜索相關內容,把用戶的問題結合起來,給出有證據支持的答案。

那麼,希望現在你能看到RAG是如何解決LLM的一些挑戰﹐比如說,在未來太陽系發現新的行星,太陽系的行星又變回9個。我們只需要更新資料儲存,由於LLM現在被指示在資料儲存中檢索後再生成回答,因此它會給出:「太陽系的行星是9個。」並且可以標明來源自哪裡,這使得LLM不太可能會產生知識的幻覺,因為如果從資料儲存中檢索不到,你可以指示LLM回答:「不知道。」而不是編造答案。

那麼它在技術上是如何運作的?

實際上,在探討RAG之前,有些術語需要事先了解: Embedding及Embedding Model,明白這兩個術語對理解RAG的技術慨念至關重要。

Embedding是什麼?

“Embedding是指高維離散的特徵映射到相對低維的連續向量空間中的表示方式。”

不明白?不用擔心,我在第一次接觸時也以為是魔法咒語。讓我們簡單一點!

“Embedding 是一種將原始數據轉換成一種特別的數據格式,以便 AI 或機器學習演算法能夠處理這些數據。它通常用於類別或文字數據,將這些數據轉換為一個密集的浮點數向量,並加入了距離的慨念。”

對AI或機器學習演算法來說,原始數據例如文字、影片、圖片等,這些資料並沒有相似性或距離的慨念。例如「手機」與「蘋果」,對於現代人類來說,會知道「蘋果」在語意上是會聯想到「手機」,Embedding在這當中加入距離來表達了它們之間的關聯性,距離愈近相關性愈高。這使得資料維度大幅減少,而且節省了很多儲存空間。

而與之相對應的是One-hot Encoding,是一種相對暴力處理類別數據的方法,它將每個類別轉換為一個獨熱向量,這個向量的長度等於類別的數量,其中一個元素為1,表示當前類別,其餘為0。雖然這種方法直觀且易於理解,但當類別數量非常大時,由於One-hot Encoding會有很多沒有意義的0,因此資料維度會變得非常龐大。

Embedding 和 One-hot Encoding 其實都是原始數據表示問題的解決方案。One-Hot Encoding可以對任何分類特徵進行向量化的通用方法,建立和更新向量化既簡單又快速。然而,這種速度和簡單性也透過為每個類別創建一個新維度而導致「維度詛咒」; Embedding則需要大量資料,無論是資料總量或單一樣本的重複出現次數,以及訓練時間長。結果是一個具有固定、任意維數的稠密向量。如果您有足夠的訓練資料、足夠的訓練時間,並且能夠應用更複雜的訓練演算法(例如,word2vec 或 GloVe),Embedding 一定是你更好的選擇。

Embedding Model 是什麼?

“Embedding Model 指的是那些特別設計來學習如何將原始數據(如文字、圖片或其他類別數據)轉換成密集向量(即Embedding)的模型。這個過程涉及到學習數據的底層結構和特徵,從而能夠將這些原始數據表示為一種更適合於機器學習模型處理的形式。”

簡單來說Embedding Model就是把原始數據轉換成 Embedding 的過程。這些模型通過學習如何將原始數據映射到一個緊湊、信息豐富的向量空間中,從而使得數據之間的關係更加明顯,且更容易被後續的機器學習或深度學習模型利用。這個過程不僅提高了資料處理的效率,也增強了模型對複雜資料模式的理解能力。

RAG的技術慨念

https://docs.nvidia.com/ai-enterprise/workflows-generative-ai/0.1.0/technical-brief.html#document-ingestion-and-retrieval

RAG主要分為2個部分,檢索和生成,而大致步驟分為4個:

1. 文檔攝取

首先從各種資料來源(如文件存儲庫、資料庫或 API)攝取文檔。這些文檔原始數據包含了模型可能需要回答問題的知識。這一步驟涉及將大量的文檔數據轉換為模型可處理的格式,並且可能包括將文檔內容透過Embedding Model預先轉換成Embeddings。

2. 問題處理

當用戶提出一個查詢(query)時,該查詢通過Embedding Model 轉換成一個向量(即embedded query)。這一過程類似於先前提到的將原始數據轉換為Embedding的步驟。

3. 相關文檔檢索

接著,這個問題的Embedding會被用來在一個預先建立的向量數據庫(Vector DB)中尋找最相關的文檔嵌入向量(document embeddings)。這個向量數據庫包含了步驟 1 中的文檔嵌入向量(document embeddings)。通常,這一檢索過程會利用向量相似度計算(如k-NN, ANN等算法)來找出與問題嵌入向量(embedded query)最接近的文檔嵌入向量。

4. 回答生成

找到一個或多個最相關的文檔後,這些文檔的內容會被送到一個生成模型(如大型語言模型,LLM)中。這個模型結合了原始查詢和檢索到的文檔內容來生成一個回答。在這一步驟中,模型不僅考慮了用戶的原始問題,也利用了檢索到的文檔作為生成回答的背景知識。

RAG面臨的挑戰?

儘管RAG看起來很強大,解決了LLM的缺點,但它也帶來了一些新的挑戰,例如在大規模資料檢索的場景,隨著資料量的增加,快速且準確地從大型文件庫中檢索相關資訊成為一個挑戰。 需要高效的檢索演算法(如ANN)來確保回應時間可接受,特別是在實際業務應用場景中;另一方面,亦帶來隱私和安全資訊外洩的風險,例如在處理敏感或私人資料時,需要確保你的RAG框架在檢索和產生過程不會洩漏資料。

這就是為什麼很多人,以至全球都在嘗試解決這些問題,研究不同的新解決方案努力改進檢索器,確保提供又快又優質的數據給LLM,同時也需要改進LLM在生成答案時如何給予用戶更好的回應及不會洩漏資料。

參考

--

--