用 n8n + LLM 實作自動化資料整理流程
致人工智慧時代各位辛苦的 IT 們,不知道你們最近是不是也跟我一樣,整天不是在忙著嘗試各式各樣的 AI Agent,就是在惡補各種新冒出來 AI 知識。
在某個悠閒假日的中午,我正在準備玩新的 AI Cli 的時候,老婆突然冷不防拋出一句話。「你那麼會叫 AI 寫程式,那等等幫我爬一份日本地震資料,整理出某某地區的地震資訊,然後定期丟一份 Excel 給我」。然後還補一句,啊對了,等等十五分鐘後桌子要收起來吃飯。
我心裡想,這是在暗示我只有 15 分鐘寫完爬蟲還要完成部署吧? 😱 問題是……這需求根本跟 AI 無關好嗎!
先來整理一下這個需求到底要做什麼事
這個任務明顯有邏輯且規律的作業,可透過寫程式來解決,但因為其實這個需求本身並沒有複雜的商業邏輯,像這種簡單的任務,最適合用 RPA 工具來搞定的,底下是需求說明和最終 n8n 的工作流程設定圖。
- 使用爬蟲工具到指定地震資訊網站擷取資料。
- 篩選出特定地點(例如:トカラ列島近海)的地震資料。
- 整理成標準格式,匯出 Excel。
- 自動拋轉 Excel 到 Google 雲端硬碟,並分享給需求人(也就是老婆大人 )。
什麼是 RPA?什麼又是 n8n?
快速複習一下底下兩個名詞
RPA 是什麼?
RPA 是機器人流程自動化(Robotic Process Automation) 的縮寫,是一種存在很久的軟體技術,它的工作原理是模擬人類操作,把「重複性且有規則」的電腦工作交給機器人來做,例如填表格、發 email、下載報表等等。
近年來結合 AI 的技術,也發展出了智慧流程自動化(Intelligent Process Automation, IPA),甚至代理流程自動化(Agentic Process Automation, APA)。
那 n8n 是什麼?
n8n 是一個開源的自動化平台,成立於 2019 年,提供許多內建的工作流程節點,支援各種資料串接(HTTP API、Google Drive、GitHub 等等)。它主打透過拖拉節點來設計工作流程,讓沒軟體開發背景的人,也能建立自動化流程(當然你還是得知道一些基本知識拉,例如跨系統拋轉,可能須需知道什麼是 Token)。
而這陣子 AI 技術火熱, n8n 平台也推出了大語言模型(GPT、Gemini 等)的工作節點,讓我們可透過拖拉的方式來呼叫 AI,這種親民的呼叫方式,同時也不需要複雜的開發配置,也因此在軟體界瞬間爆紅。
而 n8n 本身提供了兩種使用方式:
- 線上雲端平台:官方有提供 n8n 線上平台,註冊後可以免費試用 7 天(好像拉,我沒有申請線上版本),接著會根據訂閱等級開始收費,最大的優點是不用自己部署、立即上手、官方維運,但缺點就是要錢😆。
雲端平台收費方式 - 開源自架版本:如果你跟我一樣有環境可以自行架設的話,n8n 提供開源的專案,不但免月費、資料還可以儲存在自己的環境,根本佛心來著。而為了降低複雜的環境設置,我直接用 Docker 來安裝 n8n 服務,底下是 docker-compose.yaml 的設定,提供給有需要的人參考摟。
services: n8n: image: n8nio/n8n:1.102.4 container_name: n8n networks: - n8n_network_prod ports: - "5678:5678" environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=db - DB_POSTGRESDB_DATABASE=n8n_db - DB_POSTGRESDB_USER=n8n_account - DB_POSTGRESDB_PASSWORD=n8n_password - GENERIC_TIMEZONE=Asia/Taipei - TZ=Asia/Taipei - N8N_HOST=localhost - N8N_PROXY_HOPS=1 # 日誌等級 (可選: info, debug, warn, error) - N8N_LOG_LEVEL=debug - WEBHOOK_URL=https://localhost:5678 # 在 Windows 版本測試時會有權限問題,在 POC 階段可以設為 false,正式環境建議不該有底下這行 # 若在 Linux 環境請註解掉這行 # - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false volumes: # 若在 Windows 環境,則可以使用下面的路徑(最終路徑依實際情況調整) # - C:/docker/data/n8n:/home/node/.n8n # 若在 Linux 環境,則可以使用下面的路徑(最終路徑依實際情況調整) - ~/docker/data/n8n/.n8n:/home/node/.n8n depends_on: - db # 若有現有的 PostgreSQL 資料庫,可以將下面的 db 服務註解掉,並將 n8n 的環境並數改成自己的資料庫連線資訊 # 同時也要註解上方的 depends_on 設定 db: image: postgres:12 restart: always container_name: postgres networks: - n8n_network_prod volumes: # 若在 Windows 環境,則可以使用下面的路徑(最終路徑依實際情況調整) # - C:/docker/data/postgres/data:/var/lib/postgresql/data # 若在 Linux 環境,則可以使用下面的路徑(最終路徑依實際情況調整) - ~/docker/data/postgres/data:/var/lib/postgresql/data environment: POSTGRES_USER: n8n_account POSTGRES_PASSWORD: n8n_password POSTGRES_DB: n8n_db # 建立時會自動建立的資料庫名稱 networks: n8n_network_prod: driver: bridge
Docker 環境權限問題
因個人習慣的關係,我喜歡將 Volume 掛載在 docker-compose.yaml 相同路徑底下,方便後續若需轉移 Server 時不會遺漏檔案(如下圖所示,請依自己習慣設定即可喔,不見得要跟我一樣)。因此我會事先建立好資料夾,並將 Volume 指向手動建立的路徑。
但如此一來就會導致出現權限問題,理論上你拿上面這個 docker-compose 直接 up 後,會發現無法正常啟用,進入啟動失敗的容器內查看,則會看到底下的 Log,此時同步檢查 n8n 掛載對應的外部資料夾,照理來說,應該也沒有產生任何檔案。
若你的狀況與上述相符的話,先讓我們回想一下到底發生了什麼事情?還記得 「~/docker/data/n8n 」這個資料夾是用我們登入的帳號建立對吧!而手動建立的資料夾的過程中,我們並沒有授予 Docker 這個使用者讀寫的權限,我登入帳號權限是 1001,而 docker 使用的是 1000(如下圖所示),同時 n8n 官方 Docker 映像檔中的預設執行帳號也是 UID 1000、GID 1000。
但為了保險起見,建議還是先使用 ls -ld ~/docker/data/n8n 指令來查看一下該資料夾的權限後,再透過 sudo chown -R 1000:1000 ~/docker/data/n8n 將目錄 ~/docker/n8n/data 及其所有內容的擁有者與群組改為 Docker 的執行帳號,調整完畢後重新啟動容器即可。
實戰地震資料整理自動化
接下來,回到地震資料整理需求的實作了,在文章的第一張圖片中可看到本需求的自動化流程圖(爬地震資料 ➜ 篩選數據 ➜ 儲存 Excel ➜ 上傳雲端 ➜ 定期執行) 。
- 爬地震資料:透過 Http Request 節點,拉抓取日本氣象廳的數據,這個也是一個很佛的網站,直接透過 json 的檔案就可以抓到我們要的地震資訊,因此省去了我不少的時間。
- 篩選數據:透過 Code 節點,我們可以上一個節點爬下來的原始資料,轉換成準備寫入 Excel 的欄位格式,你可以自行選擇使用 JavaScript 或 Python,我自己是用 JavaScript。但這邊稍微麻煩一點,會需要用到陣列的篩選和 map,目的是把每筆資料挑出需要的欄位,重新組成需求的欄位格式。 但我個人覺得這不太能算是寫程式,頂多就是告訴電腦欄位怎麼整理而已啦 😅。如果你對程式完全沒概念,也不用太擔心,這種邏輯其實 Google 一下,或是直接問 GPT 也行。
- 儲存 Excel:透過 Convert to File 節點,將剛剛整理好的格式儲存成 Excel。
- 上傳到雲端:透過 Google Drive 節點,將 Excel 檔案上傳到雲端硬碟,但這邊就需要事先設定好雲端硬碟的權限(我覺得不難拉,但畢竟步驟有點繁瑣,有興趣請自行 Google 一下)。
- 設定執行排程:透過 Schedule Trigger 節點,設定定期執行的時間。
整個流程從抓資料到存檔上傳,真的不到 5 分鐘就搞定,以前這種東西可能還得用 C# 和 Selenium 爬蟲寫半天,現在完全拖一拖就收工,軟體工程師的地位再次動搖😂。
延伸應用:ICRT 英文學習小工具數據整理自動化
如果只拿 n8n 拿做簡單爬蟲 + 存檔任務,那也太小看它了,因此我這邊進一步的結合之前做的英文學習小工具(我用了幾套 AI Coding Agent,包括 GitHub Copilot、Claude CLI 合力開發完成),該工具抓的是 ICRT For Kids 的英文新聞,但原網站有幾個問題
- 音檔無法分段播放,不便練習聽力。
- 中英文混雜,不適合練習英文閱讀(因為會偷看到中文答案)。
- 無法記錄生字(需另外找筆記來記錄,後須也不方便測驗)。
因此我搭配合 n8n,完成了底下幾個功能:
- 抓取 ICRT 每日網頁數據,並透過大語言模型進行協助將資料整理成網站所需的格式。
- 使用 Whisper 將 MP3 音檔轉出逐字稿,並自動計算每段音訊的播放起始時間,整合到對應段落中,達成分段播放的效果。
- 將整理後的完整資料自動部署到 GitHub Pages,讓整個流程全自動化上線。
不過由於我自己的環境沒有 GPU,語音處理這塊我改用 Colab 來處理,因此整體上這個 n8n 專案,其實是由三個獨立的工作流程串接而成。下圖就是「抓取 ICRT 每日網頁數據」這段的流程圖。每個節點的設定其實都蠻直覺的,網路上也有不少圖文教學,這邊我就不多贅述,只補上我這邊使用的大語言模型 Prompt 設定給大家參考。
抓取 ICRT 每日網頁數據 |
我需要你協助將資料整理成底下的 JSON 格式,但請壓縮,不需要多餘的換行符號,另外底下幾點請幫我特別留意。
1. content 通常都會一段英文和中文為一段,如果是這樣的群組的話,請直接幫我保留他的中英文原文,不要進行調整。
2. 依造慣例 content 最後一段,通常是英文,但不會有中文,這邊就幫我合併在 content 陣列的最後即可,同時這段也請一併提供中文翻譯。
參考格式如下,請回傳 JSON 格是即可,不要回覆其它文字。
###
{
"id": "yyyyMMdd-01",
"type": "國小",
"tag": ["Tags"],
"title": "This is Title",
"audio": "https://audiourl",
"content": [
{
"en": "This is English. Can not include new line",
"tw": "這是中文,不能有換行符號",
"time": null
},
],
"vocabulary": {
"preface": "科學家發現土星有兩百多顆月球繞著它轉,有夠熱鬧。",
"content": [
{
"text": "1. planet 行星。\nHey, look at that bright star! ",
"time": null
}
],
"postscript": "Do you know any of the planets?\nplanet行星 star恆星 study研究 next to在旁邊"
},
"quiz": [
{
"question": "1. Which planet has the most moons?",
"options": [
"a. Saturn",
"b. The largest planet",
"c. Earth"
],
"time": null,
"answer": "a"
}
]
}
###
協助我填寫的資料如下
PostDate:{{ $json.PostDate }}
Tags:{{ $json.Tags }}
Contents:{{ $json.Content.trim() }}
Audio:{{ $json.Audio }}
老實說,這些功能其實用程式一樣能搞定,但我就是想趁機玩一下 n8n + 大語言模型,有個題目搭配實作是最好的學習方式,同時也可以少寫一堆爬蟲程式,AI 又幫你整理資料,根本賺爆(Gemini API 目前若分享數據是不需要收費的),何樂而不為呢?
後記
n8n 沒有傳統迴圈的的概念,這點一開始讓我卡關很久,它是靠「節點的輸出數量」來控制後續節點的執行次數,如下圖所示,這種設計模式跟寫程式有些不同,但看懂了處理方式應該就習慣了。
另外,老婆那句「你不是很會叫 AI 寫程式嗎?」聽起來像是挑釁,但其實她說得沒錯,在一些一次性的開發專案,比的已經是誰能最快把資料處理完、流程跑起來,並且用最少的維護成本讓它長期穩定跑下去,而像 n8n 這樣的工具,加上 LLM 的協助,真的節省很多時間。
但身為一個有骨氣的軟體工程師,如果是要長期維運的專案,我想在短期內還是得靠一套漂亮的架構,才能讓整個系統跑得穩、改得動,甚至方便維運,這點目前的 AI 還是做不到太好。
所以到目前為止,我還是維持上一篇文章的結論「你終究還是要學會寫程式,只是寫程式將不再是一項專業技能。未來需要的,是一個具備優秀表達能力,並且擅長與 AI 合作的軟體工程師」。
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。