當大語言模型(LLM)的訓練資料不足以應付特定領域或即時資訊的需求時,生成結果的準確性就會受到限制。檢索增強生成(RAG)技術透過從外部資料函式庫檢索相關資訊,有效地解決了這個問題。本文介紹如何利用 LlamaIndex、Deep Lake 和 Pinecone 等框架構建 RAG 流程,並整合 OpenAI 和 Hugging Face 等平台,讓 LLM 能夠參考更多資訊,生成更準確、更可靠的內容。
RAG驅動的生成式人工智慧
RAG技術的核心優勢
RAG技術的核心優勢在於其能夠提供可追溯的生成過程,透過檢索相關檔案或知識來增強生成式AI的輸出準確性和可靠性。這種方法不僅減少了生成內容中的錯誤和偏見,還提高了模型的透明度和可解釋性。
實作RAG的關鍵步驟
- 建立向量儲存:使用Deep Lake和Pinecone等工具來建立和維護高效的向量儲存系統。
- 分塊和索引:對輸入資料進行分塊處理,並建立索引以便快速檢索。
- 檢索和生成:結合檢索到的相關資訊,使用LlamaIndex等框架來生成最終的輸出。
- 最佳化和評估:持續最佳化和評估RAG流程的效能,透過人類反饋來改進模型的準確性和可靠性。
隨著生成式AI的不斷發展,RAG技術將在未來的AI應用中扮演越來越重要的角色。透過結合檢索和生成的優勢,RAG有望在多個領域實作更準確、更可靠的AI解決方案。
圖表翻譯:
graph LR; A[輸入查詢] --> B[檢索相關檔案]; B --> C[生成初步結果]; C --> D[最佳化和評估]; D --> E[最終輸出];
此圖示展示了RAG流程的基本步驟,包括輸入查詢、檢索相關檔案、生成初步結果、最佳化和評估,最終輸出結果。透過這個流程,RAG技術能夠提供更準確和可靠的生成式AI輸出。
為什麼需要檢索增強生成(Retrieval Augmented Generation, RAG)?
即使是最先進的生成式人工智慧模型,也只能根據它們所訓練的資料生成回應。它們無法對超出其訓練資料範圍的資訊提供準確的答案。生成式人工智慧模型根本不知道它們不知道什麼!這會導致不準確或不適當的輸出,有時被稱為幻覺(hallucinations)、偏見(bias),或者簡單地說,就是無意義的內容。
檢索增強生成(RAG)是一種框架,它透過將根據檢索的方法與生成模型相結合來解決這個限制。它能夠即時從外部來源檢索相關資料,並利用這些資料生成更準確和上下文相關的回應。與RAG檢索器整合的生成式人工智慧模型正以其前所未有的效率和強大功能革新這個領域。RAG的主要優勢之一是其適應性。它可以無縫地應用於任何型別的資料,無論是文字、影像還是音訊。這種多功能性使得RAG生態系統成為增強生成式人工智慧能力的可靠且高效的工具。
RAG框架的定義
本章將首先在高層次上定義RAG框架。然後,我們將定義三種主要的RAG組態:簡單RAG(naïve RAG)、進階RAG(advanced RAG)和模組化RAG(modular RAG)。我們還將比較RAG和微調(fine-tuning),並確定何時使用這些方法。RAG只能在生態系統中存在,我們將在本章中設計和描述這樣一個生態系統。資料需要從某個地方來並被處理。檢索需要一個有組織的環境來檢索資料,而生成式人工智慧模型有輸入限制。
RAG生態系統
資料來源的多樣性以及檢索和生成過程的複雜性要求RAG生態系統具有高度的靈活性和可擴充套件性。這包括資料的預處理、索引建立、檢索模型的選擇以及生成模型的整合。每個環節都需要精心設計,以確保整個系統的高效運作。
高階RAG技術:結合向量搜尋與索引式RAG於Python中的應用
建構模組化RAG程式
讓我們首先定義什麼是RAG。
什麼是RAG?
當生成式人工智慧模型無法準確回答問題時,有些人會說它正在產生幻覺或偏差。簡單來說,它只是產生無意義的內容。然而,這一切都歸結於當模型的訓練資料中不包含所要求的資訊時,無法提供適當的回應,這是經典模型組態問題之外的原因。這種混淆經常導致輸出最可能的隨機序列,而不是最準確的序列。
RAG的出現彌補了生成式人工智慧模型在回答問題時所缺乏的資訊,使其能夠更準確地回答。RAG是專為大語言模型(LLMs)設計的(Lewis等人,2020)。RAG框架將執行最佳化的資訊檢索任務,並將檢索到的資訊新增到輸入(使用者查詢或自動提示)中,以產生改進的輸出。RAG框架可以總結為下圖所示的兩個主要組成部分:
圖1.1:RAG驅動生成式AI的兩個主要組成部分
想像你自己是圖書館裡的一名學生,需要寫一篇關於RAG的論文。就像ChatGPT或其他AI輔助工具一樣,你已經學會了閱讀和寫作。作為一個大語言模型(LLM),你有足夠的訓練來閱讀高階資訊、總結並寫作內容。然而,就像任何超級人工智慧一樣,你有很多不知道的事情。
在檢索階段,你在圖書館中搜尋所需的資料(圖1.1的左側)。然後,你回到座位上,執行檢索任務,從那些書籍中提取所需的資訊。在生成階段(圖1.1的右側),你開始寫作你的論文。你是一個RAG驅動的生成式人類代理,就像一個RAG驅動的生成式AI框架。
Naïve、Advanced和Modular RAG組態
一個RAG框架必然包含兩個主要組成部分:檢索器和生成器。生成器可以是任何LLM或基礎多模態AI平台或模型,如GPT-4o、Gemini、Llama,或是數百種初始架構的變體。檢索器可以是任何新興的框架、方法和工具,如Activeloop、Pinecone、LlamaIndex、LangChain、Chroma等。
- Naïve RAG:這種RAG框架不涉及複雜的資料嵌入和索引。它可以透過關鍵字有效地存取合理數量的資料,以增強使用者輸入並獲得令人滿意的回應。
- Advanced RAG:這種RAG涉及更複雜的場景,例如應用向量搜尋和根據索引的檢索。Advanced RAG可以透過多種方法實作,可以處理多種資料型別,以及結構化或非結構化的多模態資料。
- Modular RAG:模組化RAG擴充套件了範圍,包括任何涉及Naïve RAG、Advanced RAG、機器學習和完成複雜專案所需的任何演算法的場景。
RAG與微調的比較
RAG並不總是微調的替代方案,微調也不能總是取代RAG。如果我們在RAG資料集中積累了太多資料,系統可能會變得太笨重而難以管理。另一方面,我們無法微調一個具有動態、不斷變化的資料(如每日天氣預報、股票市場價值、公司新聞和所有形式的日事件)的模型。
決定是否實施RAG或微調模型取決於引數化與非引數化資訊的比例。RAG驅動的生成式AI生態系統中的引數化部分指的是透過訓練資料學習到的生成式AI模型的引數(權重)。這意味著模型的知識儲存在這些學習到的權重和偏差中。原始訓練資料被轉換為數學形式,我們稱之為引數化表示。本質上,模型“記住”了它從資料中學到的東西,但資料本身並未明確儲存。
相反,RAG生態系統中的非引數化部分涉及儲存可以直接存取的明確資料。這意味著資料保持可用,並可以在需要時查詢。與知識間接嵌入權重中的引數化模型不同,RAG中的非引數化資料允許我們檢視和使用每個輸出的實際資料。
RAG和微調之間的區別取決於生成式AI模型必須處理的靜態(引數化)和動態(非引數化)不斷演變的資料量。過度依賴RAG的系統可能會變得過載和笨重。過度依賴微調生成模型的系統將顯示其無法適應日常資訊更新。
圖1.2:增強RAG或微調LLM之間的決策閾值
最終,在RAG驅動的生成式AI生態系統中,增強檢索器和生成器之間的平衡取決於專案的具體需求和目標。RAG和微調並不是互相排斥的。RAG可以用於提高模型的整體效率,與微調一起,作為增強RAG框架內檢索和生成元件效能的方法。我們將在第9章《增強AI模型:微調RAG資料和人類反饋》中微調一部分檢索資料。
RAG生態系統
RAG驅動的生成式AI是一個可以在多種組態中實施的框架。RAG的框架執行在一個廣泛的生態系統中,如圖1.3所示。然而,無論有多少檢索和生成元件,RAG生態系統的核心都是檢索器和生成器。
graph LR; A[檢索器] -->|查詢| B[資料來源]; B -->|相關資料| C[生成器]; C -->|生成內容| D[輸出];
圖表翻譯: 上圖展示了RAG生態系統中的基本流程,包括檢索器如何查詢資料來源、檢索相關資料並將其傳遞給生成器,最終生成輸出內容。
程式碼範例
# 匯入必要的函式庫
from langchain import LLMChain, PromptTemplate
from langchain.llms import OpenAI
# 初始化LLM
llm = OpenAI(model_name="text-davinci-003")
# 定義提示範本
template = PromptTemplate(
input_variables=["query"],
template="請根據以下查詢提供相關資訊:{query}"
)
# 初始化LLM鏈
llm_chain = LLMChain(llm=llm, prompt=template)
# 執行查詢
query = "RAG技術的最新進展"
response = llm_chain.run(query)
print(response)
內容解密:
- 匯入必要的函式庫:我們匯入了實作RAG功能所需的函式庫,包括
LLMChain
和PromptTemplate
,以及OpenAI
模型。 - 初始化LLM:我們初始化了一個OpenAI模型,具體使用了
text-davinci-003
版本。 - 定義提示範本:我們建立了一個提示範本,用於格式化輸入查詢,使其成為一個結構化的提示,指導模型生成相關的回應。
- 初始化LLM鏈:我們將LLM例項和提示範本結合起來,建立了一個LLM鏈,用於處理查詢並生成輸出。
- 執行查詢:我們定義了一個查詢字串,並使用LLM鏈執行查詢,最終列印預出模型的回應。