2024年1月17日星期三

RAG簡單範例

甚麼是RAG?

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種結合了搜尋檢索和生成能力的自然語言處理架構。透過這個架構,模型可以從外部知識庫搜尋相關信息,然後使用這些信息來生成回應或完成特定的NLP任務。   

RAG有什麼用途?

簡單來說 RAG 是種校正方法,能降低大型語言模型憑空杜撰答案、產生幻覺(Hallucination)的機率。


以下是簡單的範例:

Step1:載入Gemin這個Google開發的LLM












Step2:問LLM一個問題 : 新北市板橋的十個旅遊好去處?   

發現其中有些答案是錯的,例如下面的國立台灣美術館是在中和.










Step3:準備外部知識庫

收集一些資料,放在pdf裡面,當作給RAG使用的外部知識庫.

pdf放在這邊: 連結

這邊使用pdf當作範例,實際上還有很多檔案格式也支援,例如txt,excel,html等等

Step4: 將pdf上傳到Colab的資料夾




 

 

 

   


 


Step5: 使用PyPDFLoader載入PDF檔案





Step6:為了讓LLM了解PDF的內容,需要做Embedding的處理:  





Step7:PromptTemplate

提示詞模板可以限制LLM只能根據外部資料庫的內容回答問題.







Step8:接下來可以進行提問:

















如果問題超出範圍,LLM會拒絕回答:





















也可以請LLM做篩選,例如篩選出需要購票的地點:









也可以問複雜一點的問題,例如"推薦三個地方,並且說明理由,如果有提車廠,請提供提車廠的資訊?"






上面的問題,有打錯字(停車場,不小心打字錯誤,成為提車廠),可是LLM還是可以理解我的意思.


完整的Colab範例,請參考這邊連結

關於embedding 的補充資料,請參考這邊的連結

後記:為什麼只有 embedding 是不夠的?

Embedding 最大的限制就是找的僅僅是相似度,是向量空間中問題和文本的相似度。

只找相似度,會有什麼問題呢?像我們這幾天的案例,問題是「工程師寫城市」,而搜索到最相似的答案是「而我,在這座城市遺失了你,順便遺失了自己,以為荒唐到底會有捷徑。而我,在這座城市失去了你,輸給慾望高漲的自己,不是你,過分的感情」。然而,這個問題和搜索到的答案,只是因為含有「城市」這個詞造成的。實際上,這個問題和答案根本是不相關的。

基於這個原因,僅依賴 embeddings 進行資訊檢索或問答等任務可能不是最佳的選擇。於是Retrieval-Augmented Generation (RAG) 被發明出來了。

RAG 的方法是首先使用 embeddings 這類的資訊檢索技術找出最相似的文本。然後,它將查詢與從向量資料庫中檢索到的文檔或句子一起作為上下文提供給生成模型。接著,它依賴先進的語言模型(例如 ChatGPT)來生成答案。現代的生成模型,如 GPT 或 BERT,可以理解複雜的語境。因此即使某些高相似度但與問題不相關的文本被檢索出來,現代的語言模型也能有機會辨識並忽略它,只從真正相關的部分生成答案。







Colab + Gemini 的簡單範例

 

Gemini是Google開發的大語言模型(LLM,arge language model),以下是Wiki的說明:

Gemini是一個多模式語言模型的系列,由谷歌DeepMind開發,是LaMDA的後繼,屬於PaLM2系列的新一代。Gemini包含Gemini Ultra、Gemini Pro和Gemini Nano,於2023年12月6日面世。

Colab全名是Colaboratory, 可讓你在瀏覽器中編寫及執行Python 程式碼,並具有以下優點:. 不必進行任何設定; 免付費使用GPU; 輕鬆共用. 

如果只是測試或者學習,可以在Colab上面run Gemini的話,將會很方便.

以下是簡單的範例:

首先是載入Gemini:











接下來可以對Gemini進行簡單的文字問答:








完整的Colab範例在這邊: 連結