RAG 技術的核心在於結合檢索引擎與生成式 AI 模型,提升自然語言處理任務的效能。不同於傳統生成式 AI 模型依賴大量訓練資料,RAG 技術透過即時檢索相關資訊來增強模型的生成能力。這涉及資料的可靠性、儲存方式、檢索效率以及生成模型的選擇。資料的收集、處理、儲存與檢索流程至關重要,其中向量儲存技術如 Deep Lake、Pinecone 和 Chroma 可將資料轉換為向量,便於運算和快速存取。生成器則負責處理使用者輸入、增強輸入、提示工程以及最終的生成和輸出,提示工程的優劣直接影響生成模型的效果。評估器透過數學指標和人工回饋來評估模型效能,人工回饋在最佳化模型和提升使用者滿意度方面扮演關鍵角色。訓練器則負責初始預訓練模型和模型的微調,確保模型持續學習和進化。
RAG 生態系統的四大核心領域
在建立 RAG(檢索增強生成)生態系統時,我們會遇到多種技術框架,但最終都歸結為以下四個核心領域及其相關問題:
- 資料:資料來源是否可靠?是否足夠?是否存在版權、隱私和安全問題?
- 儲存:資料在處理前後將如何儲存?需要儲存的資料量有多大?
- 檢索:如何檢索正確的資料以增強使用者的輸入,使其足以滿足生成模型的需求?哪種 RAG 框架適合特定的專案?
- 生成:選擇哪種生成式 AI 模型來配合所選的 RAG 框架?
資料、儲存和生成領域在很大程度上取決於所選擇的 RAG 框架型別。在做出選擇之前,我們需要評估所實施生態系統中引數知識和非引數知識的比例。圖 1.3 代表了 RAG 框架的核心組成部分,不論實作的 RAG 型別如何:
圖 1.3:生成式 RAG 生態系統
- 檢索器(D)負責資料收集、處理、儲存和檢索
- 生成器(G)負責輸入增強、提示工程和生成
- 評估器(E)負責數學指標、人工評估和回饋
- 訓練器(T)負責初始預訓練模型和模型的微調
這四個元件各自依賴其生態系統,共同構成整體的 RAG 驅動生成式 AI 管道。我們將在後續章節中參考 D、G、E 和 T 這些領域。讓我們從檢索器開始。
檢索器(D)
檢索器是 RAG 生態系統中負責收集、處理、儲存和檢索資料的元件。RAG 生態系統的起點是資料擷取過程,第一步是收集資料。
收集(D1)
在當今世界,AI 資料就像我們的媒體播放清單一樣多樣化。可以是部落格文章中的一段文字,也可以是表情包,甚至是透過耳機串流的最新熱門歌曲。這些檔案本身具有各種形狀和大小。可以是包含各種詳細資訊的 PDF 檔案、網頁、直接了當的純文字檔案、組織良好的 JSON 檔案、吸引人的 MP3 曲調、MP4 格式的影片,或是 PNG 和 JPG 格式的圖片。
處理(D2)
在多模態資料處理的資料收集階段(D1),可以從網站中使用網頁擷取技術或其他資訊來源擷取各種型別的資料。這些資料物件隨後被轉換以建立統一的特徵表示。例如,資料可以被分塊(分解成較小的部分)、嵌入(轉換成向量)和索引,以提高可搜尋性和檢索效率。
儲存(D3)
在這個管道階段,我們已經從網際網路收集並開始處理大量多樣化的資料——影片、圖片、文字等。現在,我們該如何處理這些資料使其變得有用?
這就是 Deep Lake、Pinecone 和 Chroma 等向量儲存的作用。可以把它們想像成超級智慧的圖書館,不僅儲存資料,還將資料轉換成數學實體(向量),實作強大的運算。這些向量儲存還可以應用各種索引方法和其他技術來實作快速存取。
檢索查詢(D4)
檢索過程由使用者輸入或自動化輸入(G1)觸發。為了快速檢索資料,我們將其轉換成合適的格式後載入向量儲存和資料集中。然後,結合關鍵字搜尋、智慧嵌入和索引技術,可以高效地檢索資料。例如,餘弦相似度(Cosine Similarity)可以找到密切相關的專案,確保搜尋結果不僅快速,而且高度相關。
一旦檢索到資料,我們就可以增強輸入。
生成器(G)
在 RAG 生態系統中,輸入和檢索之間的界限變得模糊,如圖 1.3 所示。使用者輸入(G1),無論是自動化還是人工,都與檢索查詢(D4)互動,以在將輸入傳送到生成模型之前增強輸入。
輸入(G1)
輸入可以是一批自動化任務(例如處理電子郵件),也可以是透過使用者介面(UI)的人工提示。這種靈活性使您能夠無縫地將 AI 整合到各種專業環境中,提高各個行業的生產力。
增強輸入與人工回饋(G2)
可以將人工回饋(HF)新增到輸入中,如評估器(E)部分的人工回饋(E2)所述。人工回饋將使 RAG 生態系統具有相當的適應性,並提供對資料檢索和生成式 AI 輸入的完全控制。在本章的「在 Python 中建立混合自適應 RAG」部分,我們將建立具有人工回饋的增強輸入。
提示工程(G3)
檢索器(D)和生成器(G)都嚴重依賴提示工程,以準備生成式 AI 模型需要處理的標準和增強訊息。提示工程將檢索器的輸出和使用者輸入結合在一起。
生成和輸出(G4)
生成式 AI 模型的選擇取決於專案的目標。Llama、Gemini、GPT 等模型可以滿足各種需求。然而,提示必須符合每個模型的規格。像 LangChain 這樣的框架,透過提供適應性的介面和工具,幫助簡化各種 AI 模型到應用程式的整合。
評估器(E)
我們經常依靠數學指標來評估生成式 AI 模型的效能。然而,這些指標只能給我們部分資訊。重要的是要記住,AI 效能的最終測試取決於人工評估。
指標(E1)
與任何 AI 系統一樣,模型無法在沒有數學指標的情況下進行評估,例如餘弦相似度。這些指標確保檢索到的資料是相關且準確的。透過量化資料點之間的關係和相關性,它們為評估模型的效能和可靠性提供了堅實的基礎。
人工回饋(E2)
graph LR A[開始] --> B[資料收集] B --> C[資料處理] C --> D[資料儲存] D --> E[檢索查詢] E --> F[輸入增強] F --> G[生成與輸出] G --> H[評估與回饋] H --> I[結束]
圖表翻譯: 此圖表展示了 RAG 生態系統的流程,從資料收集到最終的評估與回饋,每一步驟相互連線,確保資料的高效處理和生成內容的準確性。
內容解密:
此圖表展示了 RAG 生態系統的整體流程,包含了從資料收集到最終評估的所有關鍵步驟。流程開始於資料收集,接著進行資料處理和儲存,然後進入檢索查詢階段。隨後,系統會增強輸入並生成輸出,最後進行評估與回饋。整個流程確保了資料的高效處理和生成內容的準確性。
強化檢索生成(RAG)技術的實踐與進階應用
強化檢索生成(Retrieval-Augmented Generation, RAG)技術結合了檢索與生成式AI的優勢,為自然語言處理領域帶來了新的突破。本文將探討RAG技術的核心概念、實作方法及其進階應用,透過Python程式碼範例進行詳細說明。
RAG技術的核心概念
RAG技術的核心在於結合檢索引擎與生成式AI模型,以提升自然語言處理任務的效能。傳統的生成式AI模型依賴大量訓練資料,而RAG技術則透過即時檢索相關資訊來增強模型的生成能力。
關鍵組成要素
- 檢索模組(Retriever):負責從資料函式庫中檢索與輸入查詢相關的資訊。
- 生成模組(Generator):利用檢索到的資訊生成最終的回應。
- 資料函式庫(Database):儲存用於檢索的資料集。
RAG技術的實作方法
本文將透過Python程式碼範例,展示如何實作基本的RAG技術。
環境設定
首先,我們需要安裝必要的套件,包括OpenAI的API客戶端:
!pip install openai==1.40.3
確保安裝的版本與程式碼相容,以避免潛在的衝突問題。
API金鑰設定
接著,我們需要設定OpenAI的API金鑰。為保護金鑰安全,建議將其儲存在安全的位置,如Google Drive:
from google.colab import drive
drive.mount('/content/drive')
f = open("drive/MyDrive/files/api_key.txt", "r")
API_KEY = f.readline().strip()
f.close()
import os
import openai
os.environ['OPENAI_API_KEY'] = API_KEY
openai.api_key = os.getenv("OPENAI_API_KEY")
生成模組實作
我們使用OpenAI的GPT-4o模型作為生成模組:
import openai
from openai import OpenAI
import time
client = OpenAI()
gpt_model = "gpt-4o"
def call_llm_with_full_text(itext):
text_input = '\n'.join(itext)
prompt = f"Please elaborate on the following content:\n{text_input}"
try:
response = client.chat.completions.create(
model=gpt_model,
messages=[
{"role": "system", "content": "You are an expert."},
{"role": "assistant", "content": "1. You can explain."},
{"role": "user", "content": prompt}
],
temperature=0.1
)
return response.choices[0].message.content.strip()
except Exception as e:
return str(e)
#### 內容解密:
此段程式碼定義了一個名為 call_llm_with_full_text
的函式,用於呼叫大語言模型(LLM)並生成回應。函式接受一個文字輸入列表 itext
,將其合併成一個字串後構建提示(prompt)。接著,使用 OpenAI 的 GPT-4o 模型生成回應,並設定系統、助手和使用者角色的訊息。溫度引數設為 0.1 以獲得更精確的回應。函式傳回生成的回應內容,若發生例外則傳回錯誤訊息。
回應格式化
為了提升輸出結果的可讀性,我們可以使用textwrap
模組對回應進行格式化:
import textwrap
def print_formatted_response(response):
wrapper = textwrap.TextWrapper(width=80)
wrapped_text = wrapper.fill(text=response)
print("Response:")
print("---------------")
print(wrapped_text)
print("---------------\n")
#### 內容解密:
此函式 print_formatted_response
用於格式化生成的回應,使其更易閱讀。透過 textwrap.TextWrapper
將回應文字限制在 80 欄寬度內,確保輸出結果整齊。函式列印出格式化的回應內容,並在前後加上標頭和標尾以增強可視性。
資料檢索功能實作
RAG技術的關鍵在於資料檢索功能的實作。本文將介紹基本的檢索方法,包括關鍵字匹配、向量搜尋和索引式搜尋。
資料準備
假設我們已經準備好一個名為db_records
的Python列表,其中包含了經過處理的資料。
檢索方法實作
- 關鍵字匹配:透過比對查詢與資料中的關鍵字進行檢索。
- 向量搜尋:將資料轉換為向量表示,並透過向量相似度進行檢索。
- 索引式搜尋:建立資料索引以提升檢索效率。
進階RAG技術應用
自適應RAG
自適應RAG技術透過結合人類反饋,不斷最佳化RAG系統的效能。這種方法將在後續章節中進行詳細介紹。
微調RAG模型
透過將靜態RAG資料整合到微調過程中,可以進一步提升模型的效能。這種方法結合了強化學習與人類反饋(RLHF)的優勢。
增強檢索技術與評估:RAG系統的核心
在前面的章節中,我們探討了檢索器(Retriever)的基礎架構及其在RAG系統中的重要性。現在,我們將探討增強檢索技術和評估方法,這些是建立高效RAG系統的關鍵。
檢索指標
評估檢索結果的準確性是RAG系統成功的關鍵。本文將探討餘弦相似度(Cosine Similarity)及其在文字相似度評估中的應用。
餘弦相似度
餘弦相似度是一種衡量兩個向量之間角度餘弦值的方法。在我們的案例中,這兩個向量分別代表使用者查詢和語料函式庫中的每個檔案。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def calculate_cosine_similarity(text1, text2):
vectorizer = TfidfVectorizer(
stop_words='english',
use_idf=True,
norm='l2',
ngram_range=(1,2), # 使用單字和雙字組
sublinear_tf=True, # 應用次線性詞頻縮放
analyzer='word' # 您也可以嘗試使用 'char'
)
tfidf = vectorizer.fit_transform([text1, text2])
similarity = cosine_similarity(tfidf[0:1], tfidf[1:2])
return similarity[0][0]
內容解密:
此函式計算查詢文字(text1
)和資料集中的每個記錄(text2
)之間的餘弦相似度。關鍵步驟如下:
TF-IDF向量化:使用
TfidfVectorizer
將文字轉換為TF-IDF特徵矩陣。TF-IDF量化了一個詞對於檔案集合中的某個檔案的重要程度。stop_words='english'
:移除常見的英文停用詞。use_idf=True
:啟用逆檔案頻率(IDF)計算。norm='l2'
:應用L2正則化。ngram_range=(1,2)
:考慮單字和雙字組。sublinear_tf=True
:應用次線性詞頻縮放。analyzer='word'
:按詞進行分析。
餘弦相似度計算:使用
cosine_similarity
函式計算兩個向量之間的相似度。結果傳回:傳回兩個輸入文字之間的餘弦相似度得分。
圖表翻譯:
此圖示呈現了餘弦相似度的計算過程:
graph LR A[使用者查詢] -->|向量化|> B[TF-IDF向量] C[檔案] -->|向量化|> D[TF-IDF向量] B --> E[餘弦相似度計算] D --> E E --> F[相似度得分]
圖表翻譯: 此圖表展示了計算使用者查詢和檔案之間餘弦相似度的流程。首先,使用者查詢和檔案分別透過TF-IDF向量化處理轉換為向量表示。然後,這兩個向量被輸入到餘弦相似度計算模組中。最終,輸出兩個文字之間的相似度得分。
查詢處理
在RAG系統中,查詢處理是至關重要的一環。使用者的查詢可能是模糊或不完整的,因此係統需要能夠處理這些不精確的輸入。
query = "define a rag store"
llm_response = call_llm_with_full_text(query)
print_formatted_response(llm_response)
內容解密:
- 查詢定義:使用者輸入查詢字串 “define a rag store”。
- LLM處理:呼叫
call_llm_with_full_text
函式,將查詢傳送給GPT-4o模型進行處理。 - 結果輸出:透過
print_formatted_response
函式格式化並輸出模型的回應。
RAG的優勢
當面對模糊或不明確的查詢時,傳統的生成式AI模型可能會產生不確定的結果。RAG系統透過結合檢索和生成技術,能夠提供更準確和相關的回應。
未來方向
在未來的章節中,我們將進一步探討RAG的不同組態(naïve、advanced和modular),並實作更複雜的檔案處理和檢索機制。透過這些技術,我們可以構建更強大和靈活的RAG系統,以滿足各種應用場景的需求。
增強相似度在RAG系統中的重要性與實作挑戰
在開發和最佳化RAG(檢索增強生成)系統時,文字相似度計算扮演著至關重要的角色。傳統的餘弦相似度(Cosine Similarity)方法雖然簡單高效,但在處理模糊或多義詞查詢時存在明顯的侷限性。本章將探討增強相似度(Enhanced Similarity)的概念、實作方法及其在RAG系統中的重要性。
餘弦相似度的侷限性
餘弦相似度透過計算兩個文字向量之間的夾角餘弦值來衡量它們的相似程度。然而,這種方法存在以下問題:
- 缺乏上下文理解:餘弦相似度僅根據詞彙的共現頻率進行計算,無法理解查詢的真實意圖或上下文。
- 多義詞問題:當查詢詞具有多重含義時(如「rag」可能指「檢索增強生成」或「破布」),餘弦相似度可能無法準確捕捉使用者的真實需求。
內容解密:
餘弦相似度計算簡單,但缺乏語義理解能力。在RAG系統中,這可能導致檢索結果與使用者查詢不符。
增強相似度的原理與實作
為瞭解決上述問題,研究者提出了增強相似度的方法。這種方法透過結合自然語言處理(NLP)技術來提升文字相似度計算的準確性。
主要步驟:
文字預處理:使用spaCy等NLP函式庫對文字進行分詞、詞形還原,並過濾停用詞和標點符號。
# 使用spaCy進行文字預處理 import spacy nlp = spacy.load("en_core_web_sm") def preprocess_text(text): doc = nlp(text.lower()) return [token.lemma_ for token in doc if not token.is_stop and not token.is_punct]
擴充套件同義詞:利用WordNet等詞典資源為查詢詞擴充套件同義詞,豐富詞彙集合。
# 從WordNet取得同義詞 from nltk.corpus import wordnet def get_synonyms(word): synonyms = set() for syn in wordnet.synsets(word): for lemma in syn.lemmas(): synonyms.add(lemma.name()) return list(synonyms)
計算增強相似度:對預處理並擴充套件後的文字計算餘弦相似度。
# 計算增強相似度 from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import TfidfVectorizer def calculate_enhanced_similarity(text1, text2): # 合併原始文字與同義詞 expanded_text1 = ' '.join(preprocess_text(text1) + get_synonyms(text1)) expanded_text2 = ' '.join(preprocess_text(text2) + get_synonyms(text2)) # 計算TF-IDF向量 vectorizer = TfidfVectorizer() tfidf = vectorizer.fit_transform([expanded_text1, expanded_text2]) # 計算餘弦相似度 return cosine_similarity(tfidf[0:1], tfidf[1:2])[0][0]
內容解密:
增強相似度透過預處理、擴充套件同義詞和計算TF-IDF向量餘弦相似度,有效提升了文字相似度計算的準確性。
RAG系統中的挑戰與未來方向
儘管增強相似度方法在一定程度上改善了文字相似度計算的表現,RAG系統仍面臨多重挑戰:
- 輸入與檔案長度不匹配:使用者查詢通常簡短,而檢索檔案較長,影響直接相似度比較。
- 創意檢索結果:系統可能檢索到與使用者意圖匹配但相似度分數較低的檔案。
- 人類反饋的重要性:自動化指標難以完全捕捉使用者滿意度,人類評估對於最佳化RAG系統至關重要。
解決方案探討:
- 混合評估方法:結合多種相似度計算方法(如餘弦相似度、增強相似度)以提升檢索準確性。
- 引入人類反饋機制:透過使用者反饋最佳化檢索模型,提升系統整體效能。