接上 AI:會聊天的客服誕生
你已經在第 3 課把 LINE OA 接上 n8n,每一則顧客訊息都能觸發工作流程。問題是:現在它還只是一台傳話機——把訊息收進來,頂多貼一段固定文字回去。你設定「感謝您的詢問,我們會盡快回覆」,顧客問菜單,它還是回「感謝您的詢問,我們會盡快回覆」;問幾點關門,還是那句話。這種機器人不只沒用,還會讓顧客覺得你的店不把人當回事。
真正有用的客服機器人,要能「讀懂訊息、給出對應答案」。2026 年,AI 語言模型已經強到可以做到這件事——你只需要告訴它你是哪家店、賣什麼、哪些問題可以回、遇到客訴要說什麼。剩下的,它自己來。這堂課就帶你把這塊最核心的 AI 大腦裝進你的 LINE OA。
這堂學什麼
- 在 n8n 串接 Anthropic Claude 或 OpenAI 節點,讓 AI 讀懂顧客訊息並生成回覆
- System Prompt 六大區塊設計原則,附完整飲料店範本可直接複製修改
- 用 userId 存對話脈絡:讓機器人記得「你剛才說的那件事」
- 控制回覆長度與 API 成本的四個關鍵設定
- 實戰完整走一遍:一家飲料店的 AI 客服從 Webhook 到問答成功
觀念一:整條流程長什麼樣
動手前,先把整個系統的資料流想清楚。顧客在 LINE 傳訊息給你的官方帳號,LINE 伺服器把訊息透過 Webhook 推給你在 n8n 設定的網址,n8n 整理好後呼叫 AI 模型,模型生成回覆,n8n 再透過 LINE 的 Reply API 把回覆送回給那位顧客。

有一個費用概念要先說清楚:LINE 官方帳號免費方案每月有 200 則推播額度(2026 年現況:免費 200 則、中用量方案 NT$800/月 3,000 則、高用量方案 NT$1,200/月 6,000 則)。推播(Push API)才計入額度——那是你主動傳給顧客的訊息。顧客主動傳訊給你、你用 Reply API 回覆,這條路徑完全不消耗推播額度。所以這套 AI 客服流程,免費帳號每月可以回覆幾千則顧客詢問,不用擔心超額。
觀念二:System Prompt 是機器人的靈魂
AI 模型本質上是「什麼都懂一點、但什麼都不太確定」的通才。你的工作是透過 System Prompt,把它塑造成「只懂你的店、只說你想讓它說的話」的專才。

六大區塊各有功能:①角色人設讓 AI 知道自己是誰;②核心知識給它事實根據;③能做不能做的邊界讓它不亂答;④轉真人規則是保護客服品質的最後防線;⑤回覆格式控制字數與排版;⑥語言邊界確保輸出永遠是繁體中文。少一塊都會在使用中踩坑。
手把手實戰
以下用一家叫「珍珠奶茶王」的飲料店當例子,走完整條流程。工作流程裡應該已經有第 3 課設定好的 Webhook 節點,從那個節點之後開始接。

在 n8n 加入 AI 節點
打開你在第 3 課建好的工作流程,在 Webhook 節點後面點「+」加節點。搜尋框輸入 Anthropic,選「Anthropic Chat Model」;或搜尋 OpenAI,選「OpenAI Chat Model」。
選好 AI 模型節點後,再點「+」加一個Basic LLM Chain節點,然後在它的「Chat Model」欄位連接你剛才加的 Anthropic 或 OpenAI 節點。Basic LLM Chain 是整合介面,System Prompt 和 User Message 都在這裡設定。
設定 API 金鑰:點 AI 模型節點 → Credentials → 「Create new」→ 貼上你的 API Key。Anthropic Key 在 console.anthropic.com 取得,OpenAI Key 在 platform.openai.com 取得。
模型建議:
- Anthropic:選
claude-haiku-4-5(速度快、成本低,客服場景夠用) - OpenAI:選
gpt-4o-mini(快且便宜)
先不要選 Opus 或 GPT-4o——客服回覆不需要那麼強的推理能力,貴 10–20 倍不值得。小店每日 50 對話,用 claude-haiku 估計 API 費用約 NT$5–15/天。
設計 System Prompt:完整飲料店範本
在 Basic LLM Chain 節點找到「System Message」欄位,貼入以下範本,按你的店修改內容:
你是「珍珠奶茶王」的 AI 客服助理小嵐。你代表這家台灣手搖飲料店服務顧客,語氣親切自然、像店員朋友,不要過度正式。
【店家資訊】
店名:珍珠奶茶王
地址:台北市大安區忠孝東路四段 123 號
營業時間:週一至週日 10:00–22:00
外送平台:Uber Eats、Foodpanda
【菜單與價格】
珍珠奶茶 NT$65(M) / NT$75(L)
芋泥波波奶茶 NT$75(M) / NT$85(L)
冬瓜檸檬 NT$55(M) / NT$65(L)
黑糖鮮奶 NT$70(M) / NT$80(L)
甜度:正常糖、少糖、半糖、微糖、無糖
冰塊:正常冰、少冰、微冰、去冰
加購:珍珠 +NT$10、椰果 +NT$10、仙草 +NT$10
【你可以回答的問題】
- 菜單品項、價格、甜度冰塊規則、加料選項
- 營業時間、地址、外送平台
- 一般口味建議
【你不可以回答或承諾的事】
- 訂位、預訂(本店不接受)
- 團購優惠、大量折扣(請顧客來電洽詢)
- 競品比較
【遇到以下情況,用固定話術回覆並結束本輪對話】
客訴、食品安全疑慮、退款要求:
→ 回覆:「感謝您的回饋!已為您轉達給同仁,我們會在 30 分鐘內透過 LINE 與您聯繫,造成不便非常抱歉🙏」
問到超出範圍的問題:
→ 回覆:「這個問題我需要請同仁幫您確認,您方便留下聯絡方式或稍後再來詢問嗎?」
【回覆格式規定】
- 每則回覆不超過 150 字
- 不使用 Markdown 符號(不用 **、##、清單符號)
- 改用換行分段、句子自然結束
- 只使用繁體中文回覆
- 可適當使用 1–2 個 emoji,不要過多
這份範本對應的就是前面說的六大區塊結構。改的時候按區塊替換,不要隨意刪掉某一整個區塊——每個區塊都有它防止 AI 出軌的作用。
把顧客訊息接進 AI 節點
Webhook 接收到的資料裡,顧客說的話在 body.events[0].message.text。在 Basic LLM Chain 節點的「User Message」欄位,切換到 Expression 模式,輸入:
{{ $json.body.events[0].message.text }}
同時要提取另外兩個值,放到 Edit Fields 節點備用:
// userId:識別這位顧客,存對話記憶用
$json.body.events[0].source.userId
// replyToken:LINE 的一次性回覆票券
$json.body.events[0].replyToken
replyToken 有效期是 5 分鐘,超過就無效,只能改用 Push API(那就要消耗推播額度了)。整個 AI 呼叫流程越快越好,避免 AI 回應太慢讓 token 過期。
建議在 Webhook 後面先加一個Edit Fields節點,把 userMessage、userId、replyToken 三個欄位都提取出來,之後每個節點用 {{ $json.userMessage }} 這樣的方式引用,比一直寫長路徑好維護。
加入對話記憶
現在 AI 每次都是從頭開始回答,沒有記憶。顧客先問「有無糖嗎」,AI 回「有」,顧客再問「那珍奶呢」,AI 就不知道「珍奶」指的是剛才問的那杯飲料。要解決這個問題,需要幫每位顧客存一份對話紀錄。

最簡單的做法:用 n8n 的 Static Data(靜態資料)
Static Data 是 n8n 內建的 key-value 儲存,不用另外建資料庫。在工作流程裡加一個 Code 節點,貼入以下程式碼:
// 讀取這位顧客的歷史對話
const userId = $json.userId;
const userMessage = $json.userMessage;
// 從 Static Data 取出舊對話(沒有就初始化空陣列)
const staticData = $getWorkflowStaticData('global');
if (!staticData.history) staticData.history = {};
const history = staticData.history[userId] || [];
// 把新訊息加進去
history.push({ role: 'user', content: userMessage });
// 只保留最近 10 則,避免 Token 爆炸
if (history.length > 10) history.splice(0, history.length - 10);
// 存回去
staticData.history[userId] = history;
// 輸出供 AI 節點使用
return [{ json: { ...($json), conversationHistory: history } }];
然後在 Basic LLM Chain 節點的「System Message」裡,把對話歷史拼進去:
{{ $json.conversationHistory.map(m => m.role + ': ' + m.content).join('\n') }}
AI 收到的 prompt 就會包含「這位顧客之前說過什麼」,它就能做到上下文連貫的回覆了。
AI 回覆後,同樣加一個 Code 節點把 AI 的回覆也存進去:
const userId = $json.userId;
const aiReply = $json.text; // Basic LLM Chain 的輸出欄位名稱
const staticData = $getWorkflowStaticData('global');
const history = staticData.history[userId] || [];
history.push({ role: 'assistant', content: aiReply });
if (history.length > 10) history.splice(0, history.length - 10);
staticData.history[userId] = history;
return [{ json: { ...($json) } }];
Static Data 的限制是重新啟動 n8n 服務後會清空。如果你的 n8n 跑在雲端且很少重啟,短期用沒問題。若需要永久記憶,第 5 課會介紹接 Airtable 或 Google Sheets 做知識庫,同樣的 userId key 可以存進外部資料庫。
用 Reply API 把回覆送回 LINE
Basic LLM Chain 執行後,回覆文字在 $json.text。現在要用這個文字加上 replyToken 呼叫 LINE 的 Reply API。
加一個 HTTP Request 節點,設定如下:
- Method:
POST - URL:
https://api.line.me/v2/bot/message/reply - Authentication:Header Auth
- Header Name:
Authorization - Header Value:
Bearer 你的Channel Access Token(在 LINE Developers 後台取得)
- Header Name:
- Send Body:JSON
- Body 內容(切換到 Expression 模式後填入):
{
"replyToken": "{{ $('Edit Fields').item.json.replyToken }}",
"messages": [
{
"type": "text",
"text": "{{ $json.text }}"
}
]
}
注意 replyToken 要從前面的 Edit Fields 節點引用,因為 Code 節點和 AI 節點執行完後,原始的 replyToken 可能已經不在當前 $json 裡了。用節點名稱直接引用:$('Edit Fields').item.json.replyToken。
送出後,LINE API 會回傳 HTTP 200 代表成功。如果收到 400 錯誤,九成是 replyToken 過期或格式錯誤(下面常見坑會講)。
成本控制:四個旋鈕調好就省錢
流程跑起來之後,趁還沒有大量流量時把這四個設定調到位。

① max_tokens(回覆字數上限)
在 AI 模型節點找到「Max Tokens」欄位,設定 300。客服回覆超過 150 字通常讀者不想看,設 300 給點緩衝夠了。超過這個值的 Token 直接截斷,既省錢也避免 AI 長篇大論。
② 對話歷史則數 前面的 Code 節點已經限制保留最近 10 則。如果你的業務單純(顧客大多一問一答),可以降到 6 則,更省 Token。
③ temperature(創意度)
客服場景不需要創意,要的是精準。設定 0.3——這會讓 AI 比較保守,老老實實照你的 System Prompt 回答,而不是自己發明資訊。在 AI 模型節點找「Temperature」欄位設定。
④ 選對模型 claude-haiku 和 gpt-4o-mini 的費用大概是旗艦模型的 1/10 到 1/20。客服場景用不到旗艦模型的複雜推理能力——你給了詳細的 System Prompt 和菜單,它只需要「對應問題、找出答案、照格式輸出」,便宜模型就很稱職。
實戰驗收:飲料店問答測試
工作流程設定好之後,到 n8n 點「Test workflow」,然後拿你的手機在 LINE 裡找到你的官方帳號,實際傳幾則訊息測試。

建議按這個順序測試,涵蓋各種情境:
- 菜單問題:「你們有什麼口味?」→ AI 應列出菜單品項
- 價格問題:「珍奶多少錢?」→ 應回 NT$65/NT$75
- 上下文連貫:先問「有無糖嗎」,再問「那珍奶可以嗎」→ 應記得珍奶的脈絡
- 邊界測試:「可以訂位嗎?」→ 應說不接受訂位
- 轉真人:「我剛喝到一杯有異味」→ 應觸發固定客訴話術
- 超出範圍:「你覺得 XX 家比較好喝嗎?」→ 應婉拒回答競品比較
全部測試通過,你的 LINE OA 就正式擁有一個會聊天的 AI 客服了。測試過程中如果發現 AI 的回答不夠好,回去修 System Prompt——通常只要在對應區塊補一句說明就能修正。
常見坑
坑 1:replyToken invalid 或 400 Bad Request
{
"message": "Invalid reply token"
}
這是最常見的錯誤。原因是 replyToken 有效期只有 5 分鐘,而你的 AI 呼叫太慢(例如歷史對話太長、模型回應時間超過 5 分鐘),或者同一個 replyToken 被用了兩次(只能用一次)。
解法:
- 把對話歷史限制在 6–10 則,減少 prompt 長度,加快 AI 回應
- 檢查你的工作流程有沒有不小心讓 HTTP Request 節點執行兩次
- 如果流程確實可能超過 5 分鐘(例如有很多前置處理),改用 Push API + userId 發送,但記住這會消耗推播額度
坑 2:AI 回覆含 Markdown 符號顯示在 LINE 裡很醜
顧客在 LINE 收到的訊息出現 **粗體**、## 標題、- 清單 這些符號——LINE 不渲染 Markdown,這些符號原文照送。
解法:在 System Prompt 的格式規定區塊明確禁止:「不使用任何 Markdown 符號,包含 **、##、-、```」。如果 AI 還是偷用,在 HTTP Request 節點前加一個 Code 節點清掉符號:
const text = $json.text
.replace(/\*\*/g, '')
.replace(/##/g, '')
.replace(/^- /gm, '')
.replace(/`/g, '');
return [{ json: { ...($json), text } }];
坑 3:AI 「幻覺」亂報菜單資訊或價格
顧客問「你們有桂圓紅棗嗎」,AI 回「有的,售價 NT$70」——但菜單根本沒有這個品項。這是 AI 在瞎猜、用訓練資料填補你沒給的資訊。
解法:在 System Prompt 的「你不可以回答」區塊加一條:「菜單以上面列出的為準,如果顧客問到不在菜單上的品項,誠實說『目前菜單沒有這個品項』,不要猜測或自行創造品項」。同時降低 temperature 到 0.2–0.3,讓 AI 更保守。
坑 4:同一則訊息被觸發兩次
n8n 工作流程跑了兩次,顧客收到兩則一樣的回覆。這通常是 LINE 的 webhook retry 機制造成的——LINE 在第一次送 webhook 後如果你的 n8n 沒有快速回應 HTTP 200,它會再送一次。
解法:在 Webhook 節點設定確認「Respond」選項是「Immediately」(立刻回 200),讓 n8n 先應答 LINE、後台再慢慢處理。或在 Webhook 節點後面加一個 Respond to Webhook 節點,專門先回 200 給 LINE。
坑 5:Static Data 記憶在 n8n 重啟後消失
n8n 服務重啟(升級版本、伺服器維護)就清掉所有 Static Data,顧客的對話歷史全沒了。
解法:接受這個限制——對話記憶的目的是讓「同一次聊天」連貫,不是永久記住每個顧客。如果你需要持久化記憶或跨裝置的顧客資料,第 5 課會教你接 Airtable 存 FAQ 知識庫與顧客互動紀錄,那是更完整的架構。
作業
- 把本課的範本 System Prompt 改成你自己的店(或你想像的店),填入真實菜單、時間、地址。
- 實際傳 6 則測試訊息,涵蓋:一般問題、上下文連貫、邊界問題、轉真人情境。
- 找一個真實顧客問過你的問題(或社群上看到的常見問題),貼給 AI 看它怎麼回。如果回得不好,修 System Prompt 直到滿意為止。
- 記錄你這次測試共用了多少 Token(可在 AI API 後台查看用量),估算一個月如果有 500 則對話,費用大約是多少。
下一課預告
AI 現在已經會聊天了,但它的知識只來自你寫在 System Prompt 裡的那幾百字。遇到顧客問「你們之前的期間限定有回來嗎」、「五月有什麼活動」,或是問到很細的產品規格,AI 就只能說「我不確定」。第 5 課要解決這個問題:建立 FAQ 知識庫,讓 AI 能查詢外部資料庫找答案;同時設計更完整的轉真人機制,讓真人小編在對的時機接手。知識庫 + 轉真人,才是一個能在實際店家長期跑的 AI 客服完整版本。