從零打造屬於自己的 RAG-based LLM Line Bot 系列(二):系統架構與事前準備

Kaishen Tseng
7 min readJan 14, 2024

--

在這個系列文章中(預計會有五篇),我會分享如何從頭開始開發一個 RAG-based 的 Line Bot,包含

  1. 介紹與規格
  2. 系統架構與事前準備(此篇)
  3. 用於 RAG 的資料準備與處理
  4. RAG-based LLM Line Bot 開發
  5. 將 Line Bot 發佈到 Heroku(完整程式碼)

目錄

前言

在上一篇介紹與規格中,分享了為什麼開始這個專案以及簡單的規格。從此篇開始,便會開始進入規劃跟架構設計。

此篇會著重在兩個部分,第一個是系統架構與流程,介紹這個專案中出現的各個元件,以及這些元件怎麼彼此相連,相關的程式碼會到下一篇一併分享;接著會列出所需的相關帳號與 Token,以便後續的開發能順利進行。

系統架構與流程

整個流程分為四個元件,分別是

  1. 資料準備與處理
  2. 資料儲存
  3. 向量搜尋和答案生成
  4. 使用者輸入和輸出

資料準備與處理

首先是準備適合的資料。做這個專案的動機是因為在 YouTube 上看很多專家整理好的優質內容,所以很直覺的就想把那些影片的文字作為資料來源。

大致的流程為利用 youtube-transcript-api 這個套件來根據影片 ID 取得字幕。接著利用 Selenium 來自動化開啟瀏覽器並針對給定的 YouTube 頻道名稱,並搭配 Infinite Scroll 去取得該頻道的所有影片 ID 。

再來便可以利用這些影片 ID 去使用 youtube-transcript-api 來取得字幕,不過這僅限於該影片有上傳字幕。因為我所選的幾個頻道,有一定比例的影片沒有字幕,所以需先下載影片並取出音檔,再使用 Whisper Model 來將音檔取出文字。

最後再透過預選的 Embedding Model 將文字向量化並存入資料庫。而在向量話之前,根據 RAG 的設計(文字長度的限制),還需要切割文檔,將一整部影片的文字作合適的分段(Chunk)。因此文字向量化其實是針對每一個分段去產生向量,然後再存入資料庫。

資料儲存

由於是要做向量搜尋(用 Question 的向量去找相似的 Source Documents),因此就需要使用能處理向量的資料庫。在選擇上有很多,包含 ChromaFaiss 等等,不過我並不想只將這些資料存在本地端(儲存一個 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

以下列出曾參考過的連結。

小結

此篇為這個系列第二篇,主要講解這個 RAG-based LLM Line Bot 的各個元件與架構,以及在進入開發前所需要帳號或 Token。

下一篇就會進入開發環節跟程式範例,會先從資料準備與處理開始。包含以下內容

  1. 利用自動化程式來下載 YouTube 影片、取出字幕
  2. 針對沒字幕的影片取出音檔並利用 Whisper 來將音檔轉成文字。
  3. 將資料切成片段,並使用 Embedding Model 產生向量。
  4. 建立資料庫並儲存資料。總共會示範兩種方式,第一種是在 AWS 建立一個 Postgres DB 並將資料存入。第二種事示範如何利用 Chroma DB 將資料存在本地端。前者的好處在這裡有提到,後者的好處則是可以迅速的做 POC。

對這個系列有興趣的讀者請持續保持關注,我們下次見!

--

--