最近看了許多文章、影片,都在探討 RAG 的應用,所以研究了一下 N8N 如何建立自己的 RAG 系統, 並且結合 Line 來打造一個客服 AI 機器人,這篇文章就來分享一下整個流程和步驟。
由於 AI 領域的更新,可能是以天或者甚至以小時為單位在變化,參考了很多影片後,會發現不一定時做得出來你想要的需求
總共會使用到的服務有 N8N、Line OA、Gemini AI、Pinecone、Google Drive,這些服務大部分都有免費額度可以使用
建立 Line 帳號
首先進入到 Line OA 管理後台,建立自己一個新的官方帳號 Line OA 管理

取得 Channel Access Token 和 Webhook 以及點擊下方的 LINE Developers Console 可以找到 Channel Secret
這 3 個資訊在後續 N8N 的設定中會用到。

RAG 介紹

RAG (Retrieval-Augmented Generation) 是一種結合檢索和生成的技術,主要用於提升自然語言處理模型的性能。 在大語言模型中經常會出現「幻覺」(Hallucination) 的問題,RAG 透過引入外部知識庫來減少這種現象。
主要分成三個部分:
- 檢索 (Retrieval):從外部知識庫中檢索相關資訊,這些資訊可以是文件、文章、數據等。
- 增強 (Augmentation):將檢索到的資訊與輸 入的查詢結合起來,形成一個更豐富的上下文。
- 生成 (Generation):使用自然語言生成模型來產生回答,
RAG 與 生成式 AI (Generative AI) 的主要區別於 RAG 透過資料庫中的資訊來輔助回答問題, 而生成式 AI (例如 GPT 等)則主要依賴於模型本身的訓練數據來產生內容,但不一定保證內容正確性
N8N 設定
這次總共會使用到兩個 Flow,一個是用來建立 RAG 的流程,另外一個是用來處理 Line 的訊息,
RAG Flow 將資料切片放入 Pinecone

主要是將資料放於 Google Drive 透過 N8N 裡面的 Google drive 節點來讀取檔案內容,接下來就要使用 Pinecone 來建立向量資料庫
- 申請 Pinecone 帳號
- 建立一個 Index,選擇一個 model 作為向量模型

- 根據圖中拉取
Search files and folders節點來讀取 Google Drive 的檔案 Download file節點來下載檔案內容Pinecone Vector Store節點來將檔案內容上傳至 Pinecone 向量資料庫- 建立 Pinecone Credential,輸入 API Key 和 Environment
Pinecone Index選擇剛剛在 Pinecone 建立的 Index
Embedding Model選擇Google Gemini Embeddings
Data Loader
- 下方要加上一個
Recursive Character Text Splitter這邊就是要選擇要切割的方式,可以根據文件的特性來選擇適合的切割器,以及大小
- 執行後就會將 Google Drive 裡面的檔案內容上傳至 Pinecone 向量資料庫

整合 Line & AI & RAG Flow

- Webhook 節點,設定 Method 為 POST,這邊的網址就是要放在 Line OA 裡的 Messaging API
Webhook URL裡面 - AI Agent 節點,設定主要的
System Prompt,這邊可以根據自己的需求來設定
- AI Agent 下方的 Chat model 我是選用 OpenRouter Chat Model 中的
Gemini-2.0-flash-001 - AI Agent 的 Tools 下要新增一個
Pinecone Vector Store,這邊要設定剛剛建立的 Pinecone Credential 以及 Index
- 下方的 Embedding Model 也是選用
Google Gemini Embeddings - 最後一個節點是
Line節點,這邊要設定剛剛取得的Channel Access Token和Channel SecretURL:https://api.line.me/v2/bot/message/replyMethod:POSTGeneric Auth Type:Bearer TokenSend BodyBody Content Type:JSONBody Parameters:replyToken:
{ "replyToken":"{{ $('Webhook').item.json.body.events[0].replyToken }}", "messages":[ { "type":"text", "text": {{ JSON.stringify($json.output) }} } ] }
結果

