跳至主要內容

里程碑

從批改、刷題到打破罩門,用 n8n 打造會記得你程度的英文助理 | Aibel 小精靈

Jerrie @yonglin522發布於 已編輯

一、專案簡介

Aibel(AI + able,希望能讓人「Be able to learn English well」而想出的名字)是一個跑在 LINE 上的英文陪練小精靈。用自架的 n8n 串接 Gemini,陪準備雅思的人練習口說和寫作,也能刷多益閱讀、設定個人目標、查詢針對弱點的教學影片。
(要看demoㄉ話請直接滑到最下面XD)

二、動機

身為一個正在準備雅思的學生,我發現說與寫是最難自己練的兩項,也是我最難準備的項目,上網找方法的時候,發現不只是我有遇到相同的困難,可能的原因有:

  1. 寫作:寫完作文,要等老師批改好幾天,才知道問題在哪
  2. 口說:口說沒有人陪練,也沒有人幫忙計時、回饋
  3. 罩門:知道自己有弱點,卻不知道該看哪些教學資源
  4. 量化目標:不知道以目前的程度落點,離目標分數還差多少

所以在發想的階段,我希望 Aibel 能有效的解決上述的問題,實現以下主要功能:

  1. 寫作:貼上作文,1~3 分鐘拿到分數、改進建議和改寫示範
  2. 口說:收到題卡、自動計時,錄音後拿到逐字稿、語音指標和分數
  3. 罩門:選擇聽/說/讀/寫痛點,直接推薦影片和練習步驟
  4. 量化目標:看到官方指標對應的目前程度、預估總分,以及說寫還要考幾分

三、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 APIReply(回覆)、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 一直回 404workflow 沒有發布;後來又不小心按到 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 refusedDocker 裡的 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 則留言

登入並驗證手機後就能留言。登入

留言

  1. 戴庭 @tyt0409

    來留言支持一波夥伴的專案 看起來超讚的 不敢想花了多少時間來製作和試錯
    很喜歡把系統架構和使用者流程寫出來的部分(T人兼J人感到快樂(?
    甚至還有口說輸入的部份 不知道將來能不能混合TTS加上個聽力 期待後續更新發展

  2. 逼波 @jennychuan22

    太厲害了.....ai小白看了陣陣發抖。
    很好奇在製作的過程中遇到最大的難題是甚麼呢?
    我覺得光是能夠有這麼清晰的架構就非常了不起(P人羨慕的眼神)

  3. 雷陣雨 @rainafternoon

    屋阿阿阿阿阿阿太厲害了
    我也是想要準備雅思,搞不好可以一起(?
    等等試用你的專案!

    感覺他的功能不該被局現在line裡面
    搞不好之後可以擴張成平台,而line 可以變成簡化的輔助精靈!

  4. 上哲 @nuva.ceo

    我以為 Aibel 是發音日語的相棒(あいぼう,aibou)xDDDD 想說革命情感的夥伴聽起來也太熱血

  5. 晉安 @0356

    雖然已經很多留言了,還是來支持一波!
    很喜歡這個使用者流程,雖然有五大主題,但都有明確指引。
    不會讓用戶點來點去,最後迷失在對話框。

    好奇,開放大家一起玩,不會很燒 AI 的 token 嗎?( aka 燒錢!)

  6. Jerrie @yonglin522

    咦咦?!!!(握手握手

  7. 戴庭 @tyt0409

    什麼 你也是INTJ 原來是同伴嗎

  8. Jerrie @yonglin522

    謝謝尼!!我確實INTJ,跟你一樣是T人兼J人哈哈哈XDD
    混合TTS是很讚的想法耶,謝謝你提供的建議,我之後要來試試看!!

  9. Jerrie @yonglin522

    嗚嗚謝謝你ㄉ鼓勵!!無數個爆肝ㄉ晚上有值得😭
    繼續蒐集大家ㄉ回饋努力更V2(ง๑ •̀_•́)ง

  10. 疊疊青蛙 @radix405225

    來支持了
    好讚的專案,令人佩服

  11. Jerrie @yonglin522

    我卡最久的問題:我做多益出題一直說發生錯誤,卡了整個下午好像有四五個小時吧...qwq

    一開始有發現是變數打錯字,修好後題目出來了,卻還是時好時壞;接著懷疑是引號、多餘的逗號、字串裡的換行,前後改了好幾版解析程式,還是失敗

    後來讓程式把錯誤原因寫出來,才看到真正的問題是 AI 有時候輸出 {"questions":[…題目的內容]},有時候直接輸出 […題目的內容],格式不一致導致的,所以後來讓 AI 的輸出要放寬一點去解析,還有讓失敗時要把錯誤原因印出來,不然只能用猜的

    還有一點是測試的時候跑不出卡片但又找不到原因...後來才發現gemini用最新的模型很容易過載或是跑太慢(我原本用3.8),用3.5或是3.6會相對穩定許多!
    ===============================
    小小ㄉ心得:
    其實我上一支workflow也是簡單的自動回信客服(填表單->回信草稿->歸檔到excel->結束ㄌXD),所以不算是什麼經驗豐富的人,但是我覺得一開始與 AI 討論好明確的需求,是很重要ㄉ!越詳細、越了解你想解決的痛點與領域越好。如果只有初步的想法,AI可以幫助你擴張發想;如果想法太多了,AI也有能力協助你收斂歸納。

    不用到超級完整,當想法有一個基本的骨架了,就開始實作、有看不懂的就問到懂為止,請AI用最白話的方式解釋,會很有幫助,在任何作業都是><!也許做著做著,就又有新的靈感,會越來越完整~~

  12. Jerrie @yonglin522

    謝謝你的回饋!!很開心有達成我一開始畫流程圖的目的😭
    Gemini有免費的模型,身為一個稱職的免費仔,當然是要用好用滿嘿嘿(文中那兩個目前用起來綽綽有餘~)

  13. Jerrie @yonglin522

    當然可以鴨,雅思一起加油!!
    你給了一個好讚的想法,謝謝尼😭
    看過有些人串line客服放在網頁的右下角,網站就是主要的內容那些,感覺這隻小精靈也可以扮演類似的角色!(要來研究一下怎麼把line對話嵌入在網站中ㄌ(ง๑ •̀_•́)ง)

  14. Jerrie @yonglin522

    原來日文還有這個意思!!沒學過日文所以沒想到啊啊啊啊(:3 」∠)_ 但這個意思好讚耶...如果能讓人覺得一直有一起學習的夥伴的感覺確實也可以這樣解讀XD