跳至主要內容

里程碑

7/27 Day5作業-喝水小精靈

我是阿力 @kobey1234發布於 已編輯

📝 Day 5 學習筆記:喝水小精靈

一、今天主題:讓 AI 小精靈開始有「資料庫能力」

今天的重點不是單純讓 Line Bot 回話,而是讓喝水小精靈開始具備:

  • 會判斷使用者訊息
  • 會記錄喝水量
  • 會把資料寫進 Google Sheet
  • 會讀取 Google Sheet
  • 會判斷不同使用者身份
  • 會定時提醒
  • 會加總飲水量
  • 會做三天小匯報
  • 會用 Flex Message 做漂亮的進度卡片

整體來說,今天的小精靈已經不只是聊天機器人,而是開始有一點「小助理系統」的感覺了。


二、Reply Token 與 Push Message

今天再次確認 Line 訊息機制:

Reply Token

  • 30 秒內回覆免費
  • Reply Token 只能用一次
  • 適合使用者傳訊息後,立刻回覆

Push Message

  • Push Message 是主動推播
  • Line 官方給 200 次內免費
  • 超過免費次數就要付費
  • 適合用在:
    • 定時提醒喝水
    • 每三天小匯報
    • 主動推播通知

Reply 改 Push 的重點

如果要從 Reply Message 改成 Push Message:

  • Line API 網址直接從 reply 改成 push
  • 原本的 replyToken 要改成 userId
  • 因為 Push Message 是主動找人,所以一定要知道要推給哪一個使用者

三、API 使用:NVIDIA NIM 與 OpenAI API

今天筆記有整理兩種 AI API:
NVIDIA NIM 免費 API
OpenAI API 付費 API

目前喝水小精靈使用 NVIDIA NIM 來處理訊息判斷與 JSON 轉換。

例如:

  • 判斷使用者是不是在記錄喝水
  • 從訊息中抓出 ml 數字
  • 把使用者自然語言轉成可用的 JSON 格式
  • 判斷使用者只是聊天,還是真的要記錄資料

實際免費額度與限制,仍以官方平台當下設定為準。


四、Switch 節點:用 contains 做分流

今天有用到 Switch 節點做訊息分流。

筆記重點:

text
switch → string → contains ( 包含 )

也就是透過文字是否包含某些關鍵內容來判斷下一步。

例如:

  • 包含喝水量 → 進入記錄流程
  • 包含一般文字 → 進入聊天回覆
  • 包含特定 JSON 欄位 → 進入資料處理

Switch 就像小精靈的路口判斷器,決定訊息接下來要走哪一條路。


五、資料處理原則:先寫 JSON,再分析

今天有一個很重要的觀念:

text
先寫 JSON,再分析

也就是不要讓資料亂跑,而是先讓 AI 把使用者的話整理成固定格式,後面才比較好判斷、寫入或加總。

JSON.stringify

注意:

json
"text": "{{ JSON.stringify($json.output) }}"

但實作時要注意:

text
如果字串有 \n,記得 JSON 指令要把雙引號拿掉

也就是避免因為多包了一層雙引號,導致 Line API 或 HTTP Request 送出格式錯誤。


六、資料庫概念:CRUD

今天開始把 Google Sheet 當作簡易資料庫使用。

資料庫基本操作:
create 建立資料
read 讀取資料
update 更新資料
delete 刪除資料

在 n8n 中實作時,主要用到:

1. Append row in sheet

用來新增一筆資料。

例如:

  • 新增喝水紀錄
  • 新增使用者資訊
  • 新增每日資料

2. Get row(s) in sheet

用來讀取資料。

例如:

  • 讀取今日喝水量
  • 讀取使用者資料
  • 讀取過去三天紀錄

3. Append or Update row in sheet

用來新增或更新資料。

這個在身份確認很重要,因為有些使用者資料可能已經存在,有些還沒有。


七、身份確認:Display Name 與 userId

今天很重要的一段是做身份確認。

邏輯是:

text
再收集 Display Name(顯示名稱)→ 在 webhook 後面加 HTTP → 網址後面接 profile / userId
→ 從 POST 改 GET → 沒有 body

也就是:

text
Webhook 收到 Line 訊息
→ 從訊息裡抓 userId
→ 用 HTTP Request 呼叫 Line profile
→ 取得 Display Name

為什麼不能只用 Display Name?

因為:

text
有可能相同 Display Name

所以真正要判斷不同人,要用:

text
userId

Display Name 比較適合拿來顯示名字,但不適合當唯一身份。


八、If 判斷:有資料就繼續,沒有資料就新增或更新

這段邏輯是:

text
If:
如果比對到……繼續(exist)
如果沒有……Append or Update row in sheet

意思是:

  • 如果在 Google Sheet 裡面已經比對到這個使用者:
    • 代表使用者已經存在
    • 流程繼續往下走
  • 如果沒有比對到:
    • 就用 Append or Update row in sheet
    • 把使用者資料新增或更新到資料表

這裡判斷依據要用:

text
userId

而不是 Display Name。


九、身份確認容易踩坑:Always Output Data

如果資料沒有查到,流程可能會中斷。

所以特別提醒:

text
身份確認
→ 如果沒有資料
→ 到 Setting
→ Always Output Data

也就是要開啟 Always Output Data,讓流程就算沒找到資料也可以繼續往下跑。


十、喝水紀錄流程

使用者輸入:

text
我喝了300ml

或:

text
我喝了700ml

流程大概是:

text
Webhook
→ Line User Information
→ AI Agent
→ Switch
→ 轉換資料格式
→ Append row in sheet
→ HTTP Request 回覆 Line

回覆範例:

text
已紀錄完成!喝了300 ml的水 讚啦~

這裡的關鍵是:

  • AI 要能判斷這是喝水紀錄
  • 要抓出 ml 數字
  • 要寫入 Google Sheet
  • 最後再回覆使用者已紀錄完成

十一、讀取資料與加總

除了寫入資料,也要能讀取資料並加總。

用到的節點:

  • Get row(s) in sheet
  • Code
  • Run Once
  • Run Once for Items
  • HTTP Request

今天確認的觀念:

text
Run once for Items:全部加總

適合用在:

  • 加總今日喝水量
  • 加總過去三天喝水量
  • 算出還差多少 ml

例如:

text
1500 - $json.totalML

用來算距離目標還差多少。


十二、定時提醒喝水:Schedule Trigger

今天設定了三個提醒時間:

| 時間 | 提醒條件 |
| 早上 9:00 | 喝水量小於 1000 ml |
| 中午 12:00 | 喝水量小於 1500 ml |
| 下午 3:00 | 喝水量小於 2000 ml |

流程概念:

text
Schedule Trigger
→ Get row(s) in sheet
→ 所有 ml 數量加總
→ IF / Switch 判斷是否低於目標
→ Push Message 主動提醒

提醒範例:

text
你目前總共喝了700 ml的水,還差800 ml的水,加油~

或:

text
你目前總共喝了700 ml的水,還差1300 ml的水,加油~

十三、三天小匯報

今天也做了「過去三天的飲水報告」。

重點:

text
每三天會有提醒的小匯報

流程:

text
3 Days
→ Get row(s) in sheet
→ Filter
→ 所有 ml 數量加總
→ HTTP Request
→ Push Message 推播給使用者

Filter 條件

還有:

text
minus(2, 'days')
is after or equal to

用來抓最近三天的資料。

匯報範例

text
這是過去三天的飲水報告:
2026-07-26:300 ml
2026-07-27:600 ml
2026-07-28:100 ml

總飲用水量:1000 ml

十四、Excel / Google Sheet 日期判斷

今天也有記到日期判斷公式。

等於今天

excel
=$A1=TODAY()

代表判斷 A1 是否是今天。

不等於今天

excel
=$A2<>TODAY()

代表判斷 A2 是否不是今天。

用途:

  • 判斷資料是不是今天
  • 篩選今日資料
  • 排除非今日資料

十五、Flex Message:讓回覆變漂亮

今天也做了 Flex Message 版的喝水進度卡片。

原本只是純文字提醒,Flex Message 可以做成比較漂亮的卡片,例如:

text
今日飲水進度
小口多次,穩穩達標

目前已喝:100 ml
目標:2000 ml
進度:5%

還差:1900 ml
今日目標:還沒達標,繼續補水

做法:

text
Flex Message → 直接用 GPT 下去改比較漂亮

也就是 Flex Message 的 JSON 結構比較複雜,可以先用 GPT 產生初版,再放到 Line 或 n8n 裡面調整。


十六、今天成果整理

今天完成的喝水小精靈功能:

| 功能 | 狀態 |
| Line Webhook 接收訊息 | 完成 |
| AI 判斷喝水訊息 | 完成 |
| Switch 分流 | 完成 |
| JSON 格式轉換 | 完成 |
| 寫入 Google Sheet | 完成 |
| 讀取 Google Sheet | 完成 |
| 加總今日飲水量 | 完成 |
| 使用者身份確認 | 完成 |
| 取得 Display Name | 完成 |
| 使用 userId 判斷不同人 | 完成 |
| 早中下午定時提醒 | 完成 |
| Push Message 推播 | 完成 |
| 三天飲水小匯報 | 完成 |
| Flex Message 進度卡 | 完成 |


十七、今日踩坑與提醒

今天比較容易踩坑的地方:

  1. Reply Token 只能 30 秒內用,且只能用一次
  2. Push Message 要改用 userId,不是 replyToken
  3. Push Message 官方 200 次內免費,超過要付費
  4. Line API 網址要從 reply 改 push
  5. Display Name 可能重複,不適合當唯一識別
  6. 身份判斷要用 userId
  7. 如果沒有資料,記得開 Always Output Data
  8. JSON.stringify 如果有換行或格式問題,要注意雙引號
  9. Run once for Items 可以用來做全部加總
  10. Flex Message JSON 比較複雜,可以先用 GPT 產生,再微調
喝水小精靈(reply+資料庫).png
身份確認+push message.png
9點、12點、15點提醒喝水.png
Flex Message.png

0 個愛心0 則留言

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