從零打造屬於自己的 RAG-based LLM Line Bot 系列(二):系統架構與事前準備
在這個系列文章中(預計會有五篇),我會分享如何從頭開始開發一個 RAG-based 的 Line Bot,包含
目錄
前言
在上一篇介紹與規格中,分享了為什麼開始這個專案以及簡單的規格。從此篇開始,便會開始進入規劃跟架構設計。
此篇會著重在兩個部分,第一個是系統架構與流程,介紹這個專案中出現的各個元件,以及這些元件怎麼彼此相連,相關的程式碼會到下一篇一併分享;接著會列出所需的相關帳號與 Token,以便後續的開發能順利進行。
系統架構與流程
整個流程分為四個元件,分別是
資料準備與處理
首先是準備適合的資料。做這個專案的動機是因為在 YouTube 上看很多專家整理好的優質內容,所以很直覺的就想把那些影片的文字作為資料來源。
大致的流程為利用 youtube-transcript-api 這個套件來根據影片 ID 取得字幕。接著利用 Selenium 來自動化開啟瀏覽器並針對給定的 YouTube 頻道名稱,並搭配 Infinite Scroll 去取得該頻道的所有影片 ID 。
再來便可以利用這些影片 ID 去使用 youtube-transcript-api 來取得字幕,不過這僅限於該影片有上傳字幕。因為我所選的幾個頻道,有一定比例的影片沒有字幕,所以需先下載影片並取出音檔,再使用 Whisper Model 來將音檔取出文字。
最後再透過預選的 Embedding Model 將文字向量化並存入資料庫。而在向量話之前,根據 RAG 的設計(文字長度的限制),還需要切割文檔,將一整部影片的文字作合適的分段(Chunk)。因此文字向量化其實是針對每一個分段去產生向量,然後再存入資料庫。
資料儲存
由於是要做向量搜尋(用 Question 的向量去找相似的 Source Documents),因此就需要使用能處理向量的資料庫。在選擇上有很多,包含 Chroma、Faiss 等等,不過我並不想只將這些資料存在本地端(儲存一個 index 檔案),每次使用時都要需要載入,而是希望能像一般使用資料庫的方式,透過連線字串連線並取得資料。主要原因是我會把這個應用程式發佈到 Heroku 的 server,而 Heroku 會根據應用程式的大小有不同的收費。如果只是因為要使用較大容量的機器來裝這些資料,除了浪費錢之外,也浪費資源(不必要的 RAM)。
這個專案我選擇使用在 AWS 上使用 Postgres,除了容易找到教學外,也可以利用 pgvector 這個擴充套件來滿足向量查找的需求。一但順利建立完成,便可以在處理資料後,把文字向量化的結果存進資料庫,方便後續查找。
向量搜尋和答案生成
預期的輸入會是使用者的提問(Question),由於會是一串文字,因此要先用同樣的 Embedding Model(文檔向量化),將此提問的向量和欲搜尋的文檔向量在同一個向量空間,這樣的相似度計算才有意義。
這裏使用 HuggingFaceApiEmbedding,利用 API 的方式來取得該提問的向量。沒有使用一般常見的 HuggingFaceEmbedding 的原因在於 Heroku 的量限制,HuggingFaceEmbedding 會需要先將模型檔案下載到本地端使用,而HuggingFaceApiEmbedding 可以向呼叫 API 的方式來取得結果。前者適合在資料準備與處理使用,而後者則適合在應用程式端。
在定義好「如何產生提問的 Embedding Vector 的函數」、「用作搜尋的資料庫」以及「用作生成答案的 LLM」(也就是 ChatGPT)後,便可使用 LangChain 所設計好的流程去產生結果,這個結果會包含產生的 K 個片段以及生成答案。
使用者輸入和輸出
最後是和使用者互動的元件,這裏是使用 Line Bot 作為介面。
在 Request 的部分,就是直接得接收使用者的提問(Question)然後將此提問丟給向量搜尋和答案生成的元件,預期會取得答案(Answer)和來源文件(source documents),在回應時便將答案直接透過 Line Bot 回應,並透過來源文件取得 Video ID 組成網址一併貼回,增加回應的信任度。
事前準備
介紹完各自元件扮演的角色以及如何彼此合作後,在進入開發前還有一個重要的事情,就是相關服務的設定。我不會再重造輪子把細節寫在這裡,而是附上我參考過的連結和教學,因為這些文章都已經足夠好到我可以按部就班地完成。
以下為預期在進入開發前,需要準備好的帳號或 Token:
Line
- CHANNEL_ACCESS_TOKEN
- CHANNEL_SECRET
HuggingFace
- HUGGINGFACEHUB_API_TOKEN
OpenAI
- OPENAI_API_KEY
Heroku
申請帳號密碼
AWS
會用到 AWS 是因為我是在上面啟用 Postgres DB。若習慣其他平台也可以,反正目的就是透過雲端服務建立資料庫。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_REGION_NAME
以下列出曾參考過的連結。
- Python + Line bot 從頭開始建立一個 Line 機器人,部署到 Heroku!:很清楚地講解如何從零開始建立一個簡單的 Line 機器人,對於像我這樣沒開發過 Line Bot 的人來說,很適合作為開發複雜功能前的起手式。因為可以先把簡單的流程串起來,在基於這樣的流程上疊加上新功能。
- TheExplainthis/ChatGPT-Line-Bot:列出如何取得 Line Token 和 OpenAI 的 API Token 的步驟,同時針對 Line Bot 開發也有很不錯的介紹以及如何使用其他方式發佈。
- 打造 LINE Bot 並且加入一個有個性的大腦:裡面有一個段落在講「打造 RAG LINE Bot with LangChain」也提到了 RAG 的基本概念以及用一個文件機器人為範例,裡面使用了另一套 RAG 框架 Embedchain,雖然我沒實際使用過,但除了套件之外,此篇也對 RAG 相關的架構有簡單明瞭的介紹,並且文章中也有許多延伸的資訊值得參考。
小結
此篇為這個系列第二篇,主要講解這個 RAG-based LLM Line Bot 的各個元件與架構,以及在進入開發前所需要帳號或 Token。
下一篇就會進入開發環節跟程式範例,會先從資料準備與處理開始。包含以下內容
- 利用自動化程式來下載 YouTube 影片、取出字幕
- 針對沒字幕的影片取出音檔並利用 Whisper 來將音檔轉成文字。
- 將資料切成片段,並使用 Embedding Model 產生向量。
- 建立資料庫並儲存資料。總共會示範兩種方式,第一種是在 AWS 建立一個 Postgres DB 並將資料存入。第二種事示範如何利用 Chroma DB 將資料存在本地端。前者的好處在這裡有提到,後者的好處則是可以迅速的做 POC。
對這個系列有興趣的讀者請持續保持關注,我們下次見!