里程碑
從批改、刷題到打破罩門,用 n8n 打造會記得你程度的英文助理 | Aibel 小精靈
Jerrie @yonglin522發布於 已編輯
一、專案簡介
Aibel(AI + able,希望能讓人「Be able to learn English well」而想出的名字)是一個跑在 LINE 上的英文陪練小精靈。用自架的 n8n 串接 Gemini,陪準備雅思的人練習口說和寫作,也能刷多益閱讀、設定個人目標、查詢針對弱點的教學影片。
(要看demoㄉ話請直接滑到最下面XD)
二、動機
身為一個正在準備雅思的學生,我發現說與寫是最難自己練的兩項,也是我最難準備的項目,上網找方法的時候,發現不只是我有遇到相同的困難,可能的原因有:
- 寫作:寫完作文,要等老師批改好幾天,才知道問題在哪
- 口說:口說沒有人陪練,也沒有人幫忙計時、回饋
- 罩門:知道自己有弱點,卻不知道該看哪些教學資源
- 量化目標:不知道以目前的程度落點,離目標分數還差多少
所以在發想的階段,我希望 Aibel 能有效的解決上述的問題,實現以下主要功能:
- 寫作:貼上作文,1~3 分鐘拿到分數、改進建議和改寫示範
- 口說:收到題卡、自動計時,錄音後拿到逐字稿、語音指標和分數
- 罩門:選擇聽/說/讀/寫痛點,直接推薦影片和練習步驟
- 量化目標:看到官方指標對應的目前程度、預估總分,以及說寫還要考幾分
三、Aibel 能做什麼
主選單設計了五個按鈕,傳任意訊息或是點「回到主選單」都可以叫出他:
| 功能 | 做什麼 | 重點 |
|---|---|---|
| 操作指南 | 五張輪播卡片,介紹 Aibel 的相關功能與使用方式 | 讓使用者知道這個工具怎麼使用 |
| 練習雅思(寫作 Task 2) | AI 依五大題型出題,也可以貼自己的題目;批改分成 4 段 | 四項分數、最需要改進的 3 點、高分替換字句、兩個等級的改寫示範;依題型檢查切題性 |
| 練習雅思(口說 Part 2) | AI 出題卡→準備 1 分鐘→推播「開始作答」→計時兩分鐘→錄音→時間到會提醒→批改分成 5 段 | 逐字稿、作答時長、語速、停頓和填充詞次數、發音觀察、這次的分數 +0.5 級分和 +1 級分的示範回答 |
| 練習多益(閱讀 Part 5) | 一次一題、可以一直刷,點「結束」看本次成績 | 每題標記 CEFR 難度,答完馬上看正解、考點和解析;作答紀錄會保存 |
| 打破罩門 | 選項目(聽/說/讀/寫)→選痛點→推薦一部教學影片 | 每個項目都對應八種痛點,依序播放表格存放的影片,之後也可以再擴充。AI 負責寫「看完可以怎麼練」,此外可以回報不符合的影片,會存放在 resource_feedback 表格 |
| 目標設定 | 自訂考試日期、目標總分、單項最低分、現有成績或自評 | 換算成 CEFR、預估總分、反推說寫需要幾分;說寫程度會依最近 3 次練習取平均,自動更新到現有成績 |
| 評分說明 | 參照雅思 IDP 官方提供的評分標準,提供客觀的給分要求 | 隸屬在「練習雅思」之下的子項目,口說跟寫作都有 |
四、使用者流程、系統架構
(如附圖一,抱歉我放不下ㄌ所以塞一張,字有點小qwq)
五、資料表欄位設計
用 n8n 內建的 Data table 設計了 7 張表格。題型、痛點、影片都放在資料表裡,方便管理內容,這樣新增內容只要加一列,不用再去改流程。
| 資料表 | 用途 | 主要欄位 |
|---|---|---|
| users | 每個使用者的狀態與目標 | userId、state(idle/answering/setup)、currenttask、currentquestion、sessionid、answerstart、recentquestions、lastresource、goaldraft、examdate、targetscore、targetmin、levelL/S/R/W、srcL/S/R/W |
| exam_config | 題型設定,一列一種題型 | key、exam、label、menu、inputtype(text/audio/choice)、systemprompt、questionprompt、rubrictext、prepseconds、answerseconds |
| practice_log | 雅思說寫的每次批改紀錄 | userId、skill、task、band、tags(罩門標籤) |
| toeic_log | 多益每題的作答紀錄 | userId、level(CEFR 難度)、correct、point(考點) |
| pain_points | 打破罩門的痛點清單,聽說讀寫各 8 個 | skill、label、sort |
| resources | 教學影片資料庫,目前 87 部 | skill、pain_point、sort、title、url、lang、summary、status |
| resource_feedback | 使用者回報「影片不符合」 | userId、skill、pain_point、sort |
說明:
- state 決定下一則訊息怎麼處理:answering 代表正在作答,setup 代表正在設定目標。
- session_id 讓計時推播和批改結果知道「還是不是同一題」:取消或換題後,舊的推播和批改就不會送出。
- level / src:四項程度都存成雅思分數,並記錄來源(雅思成績、多益換算、自評、練習)。
- tags 跟 pain_points 用同一份文字,之後可以統計最常出現的罩門,直接連到推薦影片。
六、使用到的技術
| 類別 | 技術 | 用在哪裡 |
|---|---|---|
| 自動化平台 | n8n(Docker 自架) | 用在主流程約 85 個節點,另外一個子流程負責延長載入動畫 |
| 對外網址 | ngrok 固定網域 | 讓 LINE 的 Webhook 連得到自己電腦上的 n8n |
| 聊天介面 | LINE Messaging API | Reply(回覆)、Push(推播)、Flex Message(卡片、輪播)、Quick Reply(輸入框上方的按鈕)、日期選擇器(postback)、載入動畫、下載語音檔 |
| 語言模型 | Gemini 3.6 Flash | 寫作、口說批改 AI Agent、語音轉逐字稿與發音觀察 |
| 語言模型 | Gemini 3.5 Flash-Lite | 批改的備援模型、出題、多益補題、影片說明 |
| 資料儲存 | n8n Data table | 使用者狀態、題型設定、練習紀錄、影片資料庫 |
| 程式 | n8n Code 節點(JavaScript) | 語音指標計算、多益對答案與選項打亂、依序播放影片、目標設定精靈、成績換算 |
| 程度標準 | CEFR(A1~C2) | 統一雅思、多益、全民英檢和自評的程度 |
七、實作時的決定/取捨
1.多益只做閱讀 Part 5:
原本是有考慮放聽力或是其他題型,但考慮到聽讀還是用題本練比較有手感,而且 AI 出題還要等,加上我認為 Aibel 的價值在「很難取得的回饋」,也就是說寫批改的部分。不過我最後還是有把 Part 5 列入是因為它是純文字單選題,很適合零碎時間刷,加強文法跟單字的概念
2.寫作可以用 AI 的題目,也可以用自己的:
一開始我沒有讓AI出題,但我想到很多人練寫作是照著雅思網站、線上資源或老師出的題目,所以後來讓這個功能可以用題卡給的題目,也可以用你自己準備的題目。規則只看一件事:訊息裡有「題目:」就用自己的題目;直接打英語作文,那就是使用題卡給的題目
3.口說的發音不打分數:
目前的模型無法可靠地評發音,所以只給文字建議;總分是 FC、LR、GRA 三項平均,並提醒正式考試還會評發音。但我之前用過某些英語學習平台,是會去分析你的發音的,就很好奇是怎麼實現,後來有查到一個叫做「Azure」的發音評估工具,我放在後續的擴充項目當中
4.語音指標由程式計算:
作答時長來自 LINE 的錄音長度,語速、填充詞、停頓從逐字稿算出,不讓 AI 自己估算。改寫示範給「目前分數 +0.5」和「+1」兩種,理由是示範太高分的可能會讓使用者覺得太遙遠,目標分數只用來顯示與目前的差距
5. 拿掉「能力測驗」功能:
原本想做一個功能更新使用者程度,使用者可以決定要不要使用,自訂某個日期進行能力測驗,並以該成績更新成「目前程度」。但考慮到我沒有做聽力或是需要圖表的項目,如果要完善這個,就變相的要思考這些題型怎麼生成了。所以後來改成自評/回報考過的英檢分數只是作為起點,用這個小工具進行說寫時,每次練習就會成為一次評估,取最近 3 次平均自動更新。
八、碰壁的地方qwq
| 問題 | 原因 | 解法 |
|---|---|---|
| Webhook 一直回 404 | workflow 沒有發布;後來又不小心按到 D 鍵,把 Webhook 節點停用了 | 發布 workflow、重新啟用節點 |
| Invalid reply token | 在編輯器重跑時用到舊的 replyToken;AI 批改太久,replyToken 過期 | 一律用手機測試;回覆失敗時改用推播送出 |
| 同一則訊息只收到一個回覆,而且內容錯了 | 舊的評分說明節點沒刪,一條線分岔到兩個回覆節點,且 replyToken 只能用一次 | 刪除重複的回覆路線 |
| 條件明明對,卻一直走錯分支 | 運算式前後有看不見的空白或換行,true 變成文字 true ,導致布林判斷失敗 | 清空欄位重新貼,比對時加上 .trim() |
| 口說傳文字收不到格式提醒 | 整理狀態的 userId 被填成訊息文字,所有寫入都寫到了錯誤的列 | 修正 userId,清除表裡的錯誤資料 |
| 取消後還是收到評語,而且覆蓋新題目的狀態 | 批改一旦開始就停不下來 | 批改前寫入專屬標記 grading-訊息ID,送出前確認使用者還在等這份批改 |
| 交了錄音還收到「時間到」 | 批改要跑 1 分鐘,這段時間 state 還是 answering | 收到錄音就先改掉 session_id,計時檢查就不會通過 |
| 載入動畫最多只能 60 秒 | LINE 的限制;而且 n8n 的分支不會同時執行 | 用另一個 workflow 在背景每 55 秒重新呼叫一次,批改結束就停 |
| fetch failed/connection refused | Docker 裡的 Node.js 優先走 IPv6 | 加上 NODE_OPTIONS=--dns-result-order=ipv4first,節點開啟 Retry On Fail |
| Gemini 503 high demand | 模型尖峰時段太忙 | AI Agent 開啟備援模型(3.5 Flash-Lite)和自動重試 |
九、未來可改進/擴充的項目
- 練習報告:在「我的目標」加上分數趨勢和最常出現的罩門,直接連到推薦影片
- 多益閱讀程度估計:同一個難度至少作答 10 題、答對率 ≥ 70%,才算達到該等級,或是取最近 20 題計算
- 口說 Part 1、3:多輪對話式的口說練習
- 發音評分:串接 Azure 發音評估
(參考網址:n8n.io/integrations/microsoft-azure-monitor/and/talknotes/(在新分頁開啟))
- 雅思寫作 Task 1:新增圖表題
- 時事週報:依使用者 CEFR 程度挑選英文文章,每週推播一次
- 定期提醒:讓使用者自訂時間,提醒更新聽讀成績或查看報告
十、心得
這是我第一次用n8n做這麼大的專案,覺得好有挑戰性,尤其在設計資料表還有定義節點的部分,是花費我最多心思的,像是用 state 和 session_id 讓 Aibel 知道「現在在做什麼」、「還是不是同一題」,在計時、取消、換題才不會互相干擾,有效的更新目前的狀態。還有有既定流程或公式的,能用程式做會比 AI 穩定許多,像是對答案、算字數、算語速、換算程度這類型的。此外 AI 的輸出就算有事先定義,可能也不一定完全100%照格式輸出,所以解析時要放寬一些,並在失敗時也輸出錯誤訊息,才找得到問題。最後運算式前後多一個空格,就可能讓整個分支走錯,讓我後來在定義value時都會加上.trim()以防萬一。總之最後做出來真的很有成就感,相信它會成為我準備考試的好助手!!
小小備註:
- 因為照片只能十張不太夠qwq,有拍demo影片如檢附連結
- 如果想玩看看ㄉ話也歡迎加加試用看看:@910vajkz,目前的功能只有口說的計時會用到推播,應該是不會碰到推播上限XD
-有任何優缺點的話歡迎回饋給我,很希望能把這個小工具優化得更好!٩(ˊωˋ )و✧*。
21 個愛心14 則留言
登入並驗證手機後就能留言。登入