#4, LLM - RAG with Function Calling
講完 Json Mode, Function Calling 之後, 今天的主題是: RAG
同樣截了張我在 .NET Conf 2024 的一頁簡報, RAG ( 檢索增強生成, Retrieval Augmented Generation ), 其實就是用檢索的技術, 讓 LLM 依據這些檢索的結果來生成內容 (回答) 給使用者的技巧。若沒有 RAG, LLM 則會用他被訓練得那些知識來回答。這些來源通常會有幾個月以上的時間差,而且會因為訓練內容的不同而有所偏差…
這邊我把 RAG 分成兩段來看,一個是 RAG 本身的處理流程,另一個是如何觸發 RAG 的運作機制。處理流程其實並不難懂 (難的是怎麼調教到精準 & 滿意),分成幾個步驟:
- 先收斂 “問題”,把她轉換成檢索內容的條件或查詢
- 檢索出相關內容 (一般而言都是到向量資料庫,但是非必要,你要到全文檢索系統,或是搜尋引擎其實也可以)
- 將上述這些資訊組合成 prompt, 讓 LLM 依據你提供的內容 (2), 搭配 (1) 的問題,讓 LLM 替你彙整生成最後的答案
其實這就是 RAG 的基本流程了。不過我刻意把 RAG 擺在 Function Calling, 其實這就是 Function Calling 的一種應用啊..
試著看一下這段 system prompt:
你的任務是協助使用者,代替他到 xxxxxx 檢索資料,並且依據這些檢索的結果來回答使用者的問題。回答問題時請附上檢索的來源網址,並且請勿回答檢索內容沒有提及的內容 —
如果你又很剛好的,有給他這個 “tools” 的定義的話.. ( 回想前面的 Function Calling 案例 ),那麼 LLM 就會自動將你提問的問題,解讀成要先 “檢索” ,然後再回答內容。而這整個過程,其實就是靠 Function Calling 觸發的。
至於要給搜尋引擎的條件與參數 ( 例如 query, limit, tags 等等過濾條件 ),其實就是靠 Json Mode, 將呼叫這 Function 需要的各種參數,從前後文抽取出來 ( 還記得聊 Json Mode 時, 從對話中抽取格式化的地址資訊這例子嗎? )。這些資訊都備齊,LLM 就能隨時指示你的 AI APPs, 該替 AI 去呼叫搜尋引擎了 ( 指令跟參數 LLM 都幫你準備好了 )
如此一來,你的對談內容,突然就搖身一變,從原本只能回答 LLM 腦袋本來就有的世界資訊之外,他彷彿開始懂得使用 Google 了一般,當你問了他不知道,或是他判斷應該去 DB 檢索的時候,他就會自動呼叫搜尋引擎,並且自己生成必要的查詢參數,找到結果後消化吸收,再變成答案回覆給你。感覺很熟悉嗎? 沒錯,這就是 Search GPT 這類功能的工作原理,弄懂它之後,你也有能力自己實作一樣的功能,並且可以把 Search 的對象換成自己的知識庫。
看到這邊,如果你熟悉 Function Calling 的使用技巧,要做出 Search GPT 其實是輕而易舉的事情。03/25 我有準備一個範例程式,我用 BingSearch ( 人家有現成的 API + SDK, 我為了方便 demo 就拿來用了 ) 當作 Plugins 掛上 Semantic Kernel, 同時也掛上了幾個其他的 Plugins ( 例如回答我現在在哪裡,現在的天氣資訊等 ),你就可以這樣問他:
“請問我現在這邊有哪些值得逛逛的景點? 以及提醒我出門前應該準備哪些東西”
推理能力夠好的 LLM,就會聰明的充分運用他手上所有的工具,會先去查你在哪裡 (我只回應到 City),會查你當地現在天氣,然後根據地點去搜尋引擎找資訊,並且提醒你要不要帶傘,或是穿外套等。
你會發現,到最後你只要選擇一個夠可靠的檢索服務就夠了 (你不一定要從零開始,自己用向量資料庫慢慢打造),只要他能夠被當成 Semantic Kernel 的 Plugins, 就能被 LLM 納入他的工具箱內,需要時隨時取用了。那個檢索服務最合適? 我鋪梗鋪那麼久,主角終於能現身了,就是 Microsoft Kernel Memory … , 明天就來聊這個服務能幹嘛 :D
好,今天的葉配到這裡,同樣的,想看上面這一連串的 demo ( 有 source code 逐行說明 + live demo ),歡迎來看 03/25 我跟保哥的直播~ (直播連結請見第一則留言)
