RAG技術揭密:推動各大專業領域AI發展的關鍵

AI回答能力取決於LLM本身神經元所具備的「記憶」。RAG的突破在於跳脫出LLM記憶的限制,透過讓AI在回答問題時參考文檔(Open Book)的方式,找到參考段落後進一步回答問題

Yu-Ting Ye
17 min readJun 16, 2024

前言

長時間未更新Medium文章,回想過去,我從網路資源中獲得了無數幫助。自2022年11月30日起,ChatGPT更是給予了我許多啟發。基於此,我決定重啟Medium,旨在回饋網路社群並貢獻於未來社會。本文將介紹一項能在各大專業領域中推動大型語言模型(LLM)發展的重大技術:RAG。

💡 本片閱讀無難度,專業術語不至於影響理解,適合普羅大眾及專業人士

目錄

如果你對於LLM已有一定認知,可跳至RAG開始閱讀,如果你希望快速了解實作,可直接從檢索系統開始。

簡介

檢索增強生成(RAG),英文全名為Retrieval-Augmented Generation,是Meta(Facebook)研發團隊於2020年發表的技術(論文連結),並於NIPS 2020學術會議上展示(連結)。本文將淺談為什麼需要RAG,論文細節將在下一篇文章中詳述。

值得注意的是,ChatGPT於2022年發布,而RAG技術則早在兩年前問世。當時並沒有像ChatGPT這樣好用的大型語言模型(Large Language Model, LLM)。當時的AI回答能力取決於LLM本身神經元所具備的「記憶」。RAG的突破在於跳脫出LLM記憶的限制,透過讓AI在回答問題時參考文檔(Open Book)的方式,找到參考段落後進一步回答問題。這種高度彈性的應用方法彌補了LLM知識的不足,並且能快速導入專業知識。因此,RAG在2023年後順利推動LLM在各大企業內部應用。我對這種極具遠見的學術成果深感偏愛。

大型語言模型(LLM)難道還不夠大?!

傳統上,人們期望AI能像智者一樣回答問題,因此資料科學家們收集了Wikipedia、線上公開書籍、網路媒體文章等大量資料,並用充足的AI大腦進行學習,來回答各種自然語言(Natural Language)問題。

在2022年以前,語言模型BERT在專名辨識(NER)、情感分析(Sentiment Analysis)、詞性分析(POS)等鑑別式AI(Discriminative AI)場景達到了相當的水準,即使在問答系統(Question Answering)上也表現不俗。在2018年的SQuAD 2.0問答比賽中,搭配BERT模型後的問答能力明顯上升,掀起了一股潮流,BERT成為每個踏入NLP領域的研究者必學的模型。

然而,BERT在回答能力上仍不夠人性化。可以比喻為,BERT像是一個博學多聞但不太會社交的學者(肯定是I人),能指出參考文獻中的關鍵段落,但無法流暢解釋。因此,BERT在客服場景這種需要高度同理心的應用中,仍有許多障礙。

https://paperswithcode.com/sota/question-answering-on-squad20

真正能解決人性化問答的,是像GPT這類的生成式模型(Generative AI)。GPT模型的發展一直到2022年底的GPT-3.5(即ChatGPT的基底模型)才展現了高度貼近人類的語言能力。那麼既然有了ChatGPT這樣的LLM,為什麼不能直接導入商用場景?Large Language Model還不夠Large嗎?

一般來說,LLM要超過200億參數量(20B)比較容易出現湧現(Emergence),讓語言模型的表現變得智能化。早期BERT最大有3億400萬參數量(340M),相比之下確實不夠大。GPT-3.5擁有1750億參數量(175B),足夠學習全新領域,但若問GPT-3.5特斯拉電動車Tesla Model X內有幾個USB插槽,可能會得到幻覺(Hallucination)的回答。這並非模型不夠大的問題,而是當時GPT-3.5還沒看過Model X詳細規格的問題。

ChatGPT看過570G的資料,就是沒看過貴公司Domain Know How

早在 ChatGPT 發布後的三個月,麻省理工學院 (MIT) 進行了一項實驗,探討生成式人工智慧(主要是以 ChatGPT 為主)對生產力的影響。研究結果顯示,使用 ChatGPT 確實能提升生產力的效率和品質(詳見 論文連結)。然而,論文中有一段有趣的發現:實驗後那些沒有開始或繼續在工作中使用 ChatGPT 的實驗者表示,這是因為 ChatGPT 缺少公司內部特定情境的知識(context-specific knowledge)

這種情況導致了一個顯著問題,即LLM在應用於特定公司環境時,因缺乏該公司內部的專有知識而顯得無力。為了克服這個問題,公司可以考慮將內部資料投入到LLM進行再訓練(re-training)。然而,再訓練需要大量算力,對於中小型公司來說,可能無法負擔高階GPU的昂貴成本來進行20B以上LLM模型的訓練。

針對LLM進行微調(fine-tuning)是一個可行的替代方案,使其更符合特定的應用場景。微調雖然比再訓練需要的算力少,但仍然需要一定的技術資源和專業知識。

這種情況催生了檢索增強生成(Retrieval-Augmented Generation, RAG)在市場上的剛性需求。RAG模型結合預訓練的大型語言模型(LLM)和專門的資料檢索系統(Data Retrieval System),可以有效利用特定領域的專業知識,提升生成內容的準確性和相關性。這對於希望在特定情境下應用生成式人工智慧的公司,提供了一個兼顧效能和實用性的解決方案。接下來,我們將詳細探討RAG的運作方式。

RAG : AI也需要看小抄?!

相較於單純使用LLM回答,檢索增強生成(RAG)的主要機制在於,在將問題提供給LLM之前,先透過檢索系統(Retriever)提取與問題相關的文本參照(Reference),組合成更豐富的提示詞(Prompt),再投入給LLM回答。

舉個例子,我們可以事先準備聲韻學、分子生物學、高等微積分、心理語言學、量子物理學、森林多樣性概論、地質調查等不易取得的專業知識文本(只是舉例,上述學科知識並不難取得),建立額外的擴充知識庫,就像是「外接硬碟」,來額外幫助LLM進行思考,不影響LLM本身記憶

例如,若今天問了一個積分問題,LLM的數學能力通常較差,直接讓LLM回答會擔心表現不夠好或不穩定。

此時,檢索系統(Retriever)將從擴充知識庫中找到「高等微積分」這本書中關於「高斯積分」、「雙重積分」、「極座標轉換」、「瑕積分」等對解題有幫助的段落,提取並排序這些段落。

篩選排序較高的段落作為文本參照,最後將「問題」連同「文本參照」重組後一起交給LLM回答。這整個過程就是一個標準的RAG流程,是不是很像AI在面對隨堂測驗時偷偷看小抄呢?

https://python.langchain.com/v0.1/docs/use_cases/question_answering/

RAG真的有比較好嗎?

2020年RAG的研究論文(連結)指出,RAG在知識密集(Knowledge-intensive)的場景下,能顯著提升生成回答的事實性(Factuality)和具體性(Specificity)。這篇研究中使用的LLM是融合了BERT和GPT的BART模型,並對比了有無加入RAG機制的結果表現。根據人類主觀評價,事實性較好的答案中,有42.7%來自於RAG。

此外,這也顯示出RAG有機會大量消除幻覺(Hallucination)的產生,使回答結果更加優化。幻覺是指生成模型在缺乏正確信息或上下文的情況下創造出不準確或虛構的內容。RAG通過檢索和整合大量的外部知識,有效降低了幻覺的發生率,提供了更可靠的回答。

檢索系統是RAG成功的關鍵

RAG的強大有一大部分來自於其優良的檢索系統(Retrieval System)。如果檢索能力太差,例如輸入微積分的問題,結果卻檢索到莎士比亞的十四行詩,你還期望LLM邊看著十四行詩邊正確回答你微積分問題,即使是ChatGPT也很為難,還可能增加幻覺的發生。

那麼,如何實現一個優良的檢索系統?早期方法大多基於關鍵字(keywords)比對方法,透過擷取輸入問題的關鍵字,再比對資料庫中每個文本的關鍵字。文本關鍵字的擷取方法則基於TF-IDF(Wiki參考)、BM25(Wiki參考)等關鍵字分析技術。Google Search搜尋引擎早期就是基於BM25方法來提供搜尋結果。

隨著自然語言理解(NLU)技術的進步,後來衍生出基於嵌入(Embedding)比對方法。這個方法比起擷取關鍵字,更能保留整個句子或文本的完整語意,這也是當今RAG檢索系統的主流方式。以下簡單介紹LangChain框架所建議的做法:Load → Split → Embed → Store。

https://python.langchain.com/v0.1/docs/use_cases/question_answering/

1. Load 文本讀取

首先,讀取每個文本的資料,這些資料可能來自PDF、Word、JSON、API等不同格式,個別讀取後統一轉換為文本資料(Document),例如:

## Langchain Document 文本範例
[
Document(page_content="埃及聖䴉(學名:Threskiornis aethiopicus),又名埃及聖朱鷺、埃及聖鷺、聖䴉,是撒哈拉以南非洲、伊拉克東南部及以往埃及的一種朱鷺。牠們在埃及備受尊敬,經常被製成木乃伊當做托特的象徵。牠們也被引入到法國、義大利、西班牙及美國。現在,在臺灣西部濱海地區也可看到牠們。", metadata={'source': 'A.pdf'}),
Document(page_content="隨著科技的不斷發展和革新,人工智能已經成為了眾多企業和機構的重點關注對象。機器學習、自然語言處理、深度神經網絡等技術的應用,已經開始推動著人工智能產業的快速發展。從目前的發展情況來看,人工智能不僅可以提高工作效率,降低人力成本,還可以促進產業升級,改善生活品質。", metadata={'source': 'B.docx'}),
Document(page_content="Apache Hadoop是一款支持數據密集型分佈式應用程序並以Apache 2.0許可協議發佈的開源軟體框架。它支持在商品硬件構建的大型集群上運行的應用程序。Hadoop是根據谷歌公司發表的MapReduce和Google檔案系統的論文自行實作而成。", metadata={'source': 'C.xlsx'}),
Document(page_content="23歲時出道、血型A型的福井舞是出身於京都的日本女創作歌手,所屬唱片公司為J-more。2004年,與WADAGAKI、SHINO組合地下音樂隊Poplar,發表了兩張專輯,天照和夢死物語。在2006年時退出,2007年10月加入了Avex獨立發展。" , metadata={'source': 'D.json'}),
Document(page_content="協和橋(Pont de la Concorde)是法國巴黎一座跨越塞納河的拱橋,介於協和廣場的堤道(quai des Tuileries)(右岸)和奧賽堤道(quai d'Orsay)(左岸)之間。它在過去曾稱為路易十六橋(pont Louis XVI)、革命橋(pont de la Révolution)、協和橋,波旁復辟時期(1814年)複稱路易十六橋,1830年再度恢復協和橋名稱,直至今日。", metadata={'source': 'E.csv'}),
Document(page_content="中華民國空氣汙染指標(Pollutant Standards Index,PSI)是空氣汙染情況的一項指標,由中華民國行政院環境保護署於1993年擴充測站後推出,目標乃藉由本測站系統監控全臺灣所有的空氣品質並加以通報改善。空氣汙染指標為依據監測資料將當日空氣中懸浮微粒(PM10)、二氧化硫(SO)、二氧化氮(NO)、一氧化碳 (CO) 及臭氧 (O) 等5種空氣汙染物濃度數值", metadata={'source': 'F.txt'}),
Document(page_content="滾石國際音樂股份有限公司 Rock Records Co., Ltd. 曾用名 滾石雜誌社 滾石有聲出版社 公司類型 股份有限公司 統一編號 22012304 成立 1976年,滾石雜誌社 1980年,滾石有聲出版社 1986年1月28日(公司登記日期)(38年113天) 創辦人 段鍾沂、段鍾潭 代表人物 段鍾沂、段鍾潭 ", metadata={'source': 'api@example.com'}),
]

2. Split 文本切分

這個步驟是可選的,視輸入問題長度、文本長度、嵌入模型(Embedding Model)最大能夠接受的吞吐量來決定切分方法。例如,嵌入模型最大只能接收256個字,則讀取每個文檔後,超過256字的文本必須切成多個文本段落(Chunk),每個Chunk上限為256字。如果擔心文本的切分點落在關鍵資訊上,可以採用遞迴分割(Recursively split),讓切分後的Chunk之間允許段落重疊(chunk overlap),例如:

"23歲時出道、血型A型的福井舞是出身於京都的日本女創作歌手,所屬唱片公司為J-more。2004年,與WADAGAKI、SHINO組合地下音樂隊Poplar,發表了兩張專輯,天照和夢死物語。在2006年時退出,2007年10月加入了Avex獨立發展。"
# Langchain Splitter 範例程式碼
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
chunk_size=50,
chunk_overlap=20,
)
example_text = "23歲時出道、血型A型的福井舞是出身於京都的日本女創作歌手,所屬唱片公司為J-more。2004年,與WADAGAKI、SHINO組合地下音樂隊Poplar,發表了兩張專輯,天照和夢死物語。在2006年時退出,2007年10月加入了Avex獨立發展。"
text_splitter.split_text(example_text)

可以每50字切分段落,並且允許段落間有20字的重疊,就能切分成以下4個段落:

[
'23歲時出道、血型A型的福井舞是出身於京都的日本女創作歌手,所屬唱片公司為J-more。2004年,',
'所屬唱片公司為J-more。2004年,與WADAGAKI、SHINO組合地下音樂隊Poplar,發',
'SHINO組合地下音樂隊Poplar,發表了兩張專輯,天照和夢死物語。在2006年時退出,2007年',
'夢死物語。在2006年時退出,2007年10月加入了Avex獨立發展。'
]

不同的切分方法,會間接影響檢索系統召回文本的品質,務必謹慎考量。

3. Embed 文字轉嵌入

這個步驟將每個文本段落,從文字(“23歲時出道、血型A型的福井舞是…”)轉換為數值向量([0.78, 0.64, 0.13, …. ]),後者稱為嵌入(Embedding)。一個好的Embedding能夠更完整保留原文字的語意特徵。例如:

A: Embedding 是將高維度數據轉換為低維度向量表示的技術,便於機器學習模型處理。
B: Embedding 技術通過將詞彙或數據嵌入到向量空間中,來捕捉其語義或特徵。
C: 我的朋友喜歡去海邊度假,特別是在夏天。

透過Embedding Model轉換成Embedding後,範例如下:

 A: [0.65, 0.48, 0.92, 0.33, 0.76, ...]
B: [0.63, 0.50, 0.90, 0.31, 0.74, ...]
C: [0.02, 0.98, 0.15, 0.82, 0.07, ...]

發現了嗎?A和B兩句話的語意接近,所以A和B的Embedding向量數值也越接近,而C這句話的Embedding數值則明顯不同。如果向量數值夠多(常見為768或1024維度),我們期望能更完整保留整個句子的語意,這也是Embedding比單純用關鍵字方法更適合用來做語意檢索的原因。

4. Store 向量資料庫

通常要檢索的資料很多,100個多頁文檔可能產生出10萬個文本段落,輸入到Embedding Model產生出10萬個Embedding向量。這個過程隨著文本量增加會花上更長的時間,因此會事先將Embedding結果建立索引(index),並儲存在向量資料庫(vector store)。通常主流的向量資料庫除了儲存向量索引資料外,還提供快速檢索排序的演算法,以便在現實場景中能夠更快找到問題。

RAG的實現近在咫尺

相較於過去缺乏強大的LLM,現今已經有像ChatGPT、Gemini、Claude等多種選項,並且這些模型都提供了API可以串接,讓RAG的實現變得更加可行。現在只差一個高效的Embedding Model,那麼,有沒有現成且免費的繁體中文Embedding Model可以使用呢?

當然有!你可以參考以下Hugging Face的開源模型,它們提供了多種免費的繁體中文Embedding Model。以下是一個基於LangChain框架實現RAG的範例程式碼:

後記

在這個AI數位時代,RAG(檢索增強生成)技術的應用前景無限廣闊,特別是在知識密集型的場景中。RAG的強大在於其優良的檢索系統和生成模型的結合,能夠顯著提升生成回答的事實性和具體性,並有效降低幻覺(Hallucination)的發生率。無論是提升企業內部知識管理的效率,還是為用戶提供更加準確和詳細的回答,RAG都能發揮重要作用。

隨著自然語言理解技術的進步,現在已有像ChatGPT、Gemini、Claude等多種選項,並且這些模型都提供了API可以串接,讓RAG的實現變得更加可行。透過Hugging Face的開源模型和LangChain框架,開發者可以輕鬆構建並實現RAG系統,從而更好地應對知識密集型應用的需求。

展望未來,RAG技術將在各行各業中發揮越來越重要的作用。掌握這些技術,我們正站在一個嶄新的時代門檻上,未來的應用場景將更加廣泛和深遠。現在正是學習和實踐RAG技術的最佳時機,讓我們一起迎接這個令人興奮的技術變革時代。

--

--

Yu-Ting Ye

Data Scientist, familiar with Python, interested in Statistics, ML, DL and crazy about IMDB’s 250 top rated movies.