iT邦幫忙

2025 iThome 鐵人賽

DAY 24
1
Odoo

站在巨人的肩膀上打造企業智慧助手:Make × AI × Odoo 的實踐之路系列 第 24

🚀 Day 24:智慧客服進化:AI擁有上下文,體驗沉浸式對話

  • 分享至 

  • xImage
  •  

一、前情提要:從商機到交流感

昨天的 Day23,我們完成了「LINE 詢價 → Odoo CRM 商機」的自動化流程:
✅ 客戶詢價 → AI 整理 → Odoo 新增商機 → LINE 回覆完成。

這樣的流程雖然省下大量人工輸入,但也出現一個問題:
👉 客戶被迫按照格式輸入,那這樣就直接填表單就好啦,沒有用 LINE 的意義。

這種互動方式,雖然效率高,但體驗感卻「很機器化」。
在我們原本的流程中,AI 每次只看單一句話 → 完全沒有上下文。
為了要讓客戶有像真人一樣的對話的機器人

所以今天的主題就是要來說:
👉 如何讓 AI 擁有「上下文記憶,打造更像真人的沉浸式對話式客服。


二、使用者情境:一句一句輸入,卻變成好多商機?

昨天的流程裡,如果客戶是「一次性」輸入完整需求,AI 可以一次整理後新增商機。
但實際上,客戶的表達方式往往是 逐步輸入邊想邊修改

  • 第一句:「你好,我想詢價」
  • 第二句:「工件材質是鋁合金」
  • 第三句:「尺寸大概 30x40x20 mm,要倒角」
  • 第四句:「啊對了,不是鋁,是不鏽鋼」

在我們原本的流程中,AI 只看單一句話 → 每次都當成一個新的需求。
結果就會出現:
👉 系統自動在 Odoo 建立了好幾張商機,而其實它們應該是「同一個商機的不同補充」。

這樣一來,業務在 Odoo 看到的畫面會是一堆重複、破碎的商機,還要花時間手動合併,反而降低效率

所以我們必須讓 AI 擁有「上下文記憶」,能夠根據完整對話紀錄來判斷客戶需求。
👉 這樣即使客戶一句一句輸入、甚至中途修改,AI 也能在最後輸出正確、完整的一張商機資料。

所以今天的目標就是讓 Make 中的 AI 擁有上下文的能力


三、實際操作流程

臺灣俗語說得好:「江湖一點訣,講破無價值」

今天要分享的這個方法,看似簡單,卻能徹底改變 AI 的判斷方式。
只要懂得這個訣竅,就能讓 AI 從「機器式客服」升級成「真人式客服」。

所以我現在就要來揭開,我到底是怎麼讓 Make 的 AI 擁有上下文的。

其實方法很簡單,就是把 Google Sheets 當作資料庫。

對!你沒聽錯,就是這麼樸實無華又簡單

因為 Make 在呼叫 Gemini 模組時,每一次都是「新對話」,沒有內建的上下文保存。
既然沒有內建,那我們就自己幫它建立一個資料庫,專門用來儲存對話。

👉 把每一段對話都寫進 Google Sheets,需要判斷時,再把整份紀錄丟給 AI。


看到這如果你覺得 「原來只是放到 Google Sheets 而已喔,我還以為是什麼很酷炫的技術,阿說白了,不就是在 Google Sheets Add a Row」
那我只能說:
你可能把重點放錯了,只看到了「Make 串接 Google Sheets 模組」這件事,那些都只是技術動作而已。

就像你知道資料庫新增資料是用 Create,吃飯是用筷子 —— 但重點是:資料庫怎麼設計?筷子怎麼用?這才是本質啊!

👉 所以讓AI擁有上下文的重點核心是:如何把 Google Sheets 設計成我們的資料庫。
因為 Make 的任務就是「把資料寫進去」,而上下文能不能運作,全靠 Google Sheets 的架構。

所以接下來我就來說明一下我的Google Sheets資料結構


📁 資料結構設計

1️⃣ 第一個工作表 → 使用者清單

  • line_uid
  • 公司名稱
  • gmail

因為要跟我的 LINE 機器人進行服務的互動,前提就是「必須加入聯絡人」。
所以我以 「公司為單位」 來管理,確保每個使用者都能追溯到公司。


2️⃣ 每一間公司 → 獨立的工作表

  • 每間公司會有一個專屬工作表,用來記錄「這間公司所有人員的對話紀錄」。
  • 欄位設計:line_uidid (對話序號)對話訊息對話時間
  • 同一間公司的不同人員對話就能集中管理。

3️⃣ 暫存邏輯:先個人 → 再歸戶

一開始若不知道某個 line_uid 屬於哪間公司,會先建立一張「個人暫存表」儲存對話。
後續再依情況處理:

  • 如果是 既有公司聯絡人 → 把對話搬進該公司的工作表
  • 如果是 全新公司 → 暫存表直接升級為「公司工作表」

⚠️ 補充說明:為什麼不用讀 LINE 聊天紀錄?

你可能會想問:「不能直接從 LINE 聊天室讀以前的訊息嗎?」

LINE 的 API 無法讀取過去的訊息,只能收到當下的新訊息。

👉 所以只要有訊息進來,我就必須要立刻儲存。否則以後是無法靠API取得對話紀錄。


🔧 步驟 1:讀取對話紀錄

首先,因為在Google Sheets中有Id的概念,所以一先從 Google Sheets 把某間公司的工作表資料全部讀出來,因為我們要知道這個 line_uid 已經有幾筆對話(用來計算 id)。

https://ithelp.ithome.com.tw/upload/images/20250824/20177665wKDDUhc8h1.png
新增 Make an API Call
說明一下設置:
URL:

spreadsheets/aaa/values/bbb!A1:Z1000

Google Sheets網址:

https://docs.google.com/spreadsheets/d/16xxxxxxcE3Gj1BJXh7vjjIS_zXOX4I5_mEzDKTIuUP8/edit?gid=5322620#gid=5322620
  • aaa 是你 Google Sheets 網址中間那段 ID
  • bbb 是對應的工作表名稱,我這邊是公司的名字
  • Method 選擇 GET,因為只是要讀取

所以URL就會為

spreadsheets/16xxxxxxcE3Gj1BJXh7vjjIS_zXOX4I5_mEzDKTIuUP8/values/工作表名稱!A1:Z1000

🔧 步驟 2:AI 萃取

接著把剛剛讀到的整張工作表內容交給 AI(Gemini)處理,請它幫我們找出有幾筆屬於這個 line_uid 的紀錄,並輸出對話數量。
這個步驟只是為了方便我們產生id的值
https://ithelp.ithome.com.tw/upload/images/20250824/20177665u0UBPR2ceF.png
所以在這邊就新增一個Gemini,然後設定Prompt

從以下文字中找出對應的內容數量,並只輸出數量,不需要任何說明或多於文字。

文字:{{60.body}}
規則:
-核對欄位為:{{6.`0`}}
-核對 文字是否有核對欄位
-文字只須核對"values":[["line_uid","id","text","time"]後面的資訊
-只需輸出有核對欄位的總共數量,不要加上其他說明文字


範例1:
輸入:
核對欄位為:U574e754710efd36e309700699efc2f93
{"range":"U574e754710efd36e309700699efc2f93!A1:Z997","majorDimension":"ROWS","values":[["line_uid","id","text","time"],["U574e754710efd36e309700699efc2f93","1","嗨嗨","2025-05-22 16:40:29"],["U574e754710efd36e309700699efc2f93","2","嗨嗨","2025-05-22 16:41:26"],["55","1","你好","2025-05-22 16:41:26"],["654","2","你好安安","2025-05-22 16:41:26"],["U574e754710efd36e309700699efc2f93","3","哈囉","2025-05-22 16:41:26"]]}

輸出:
3

範例2:
輸入:
核對欄位為:U574e754710efd36e309700699efc2f93
{"range":"U574e754710efd36e309700699efc2f93!A1:Z997","majorDimension":"ROWS","values":[["line_uid","id","text","time"]]}

輸出:
0

🔧 步驟 3:添加對話紀錄

最後一步就是把對話紀錄新增到 Google Sheets 中啦!

這邊不是用 Google Sheets 的 Add a Row 模組,而是使用 Make an API Call
為什麼?
👉 Add a Row 模組只能選擇「固定的工作表」,無法依照變數動態切換。

但我們的需求是:
👉 根據用戶所屬的公司,自動將對話寫入該公司的工作表!

https://ithelp.ithome.com.tw/upload/images/20250824/20177665dD6mMB1AXL.png
所以這邊就新增一個Google Sheets 的 Make an API Call模組
URL 範例如下:

spreadsheets/aaa/values/bbb:append?valueInputOption=USER_ENTERED
  • aaa就一樣是Google Sheets網址中的那串ID
  • bbb則是工作表名稱
  • Method 選擇 POST ,因為要做儲存的動作,不是只有讀取了
  • Body 中放入你要新增在Google Sheets的內容
{"values":[[
            "{{3.events[].source.userId}}",
            "= {{trim(61.result)}}+1",
            "{{3.events[].message.text}}",
            "=TEXT((MID(\"{{3.events[].timestamp}}\",1,19)+0)+8/24,\"yyyy-mm-dd hh:mm:ss\")"
        ]]}

到這邊就完成對話紀錄的新增囉~


四、測試成果

實測流程:

1️⃣ 輸入:「哈囉哈囉」
2️⃣ 系統把對話新增至 Google Sheets
3️⃣ 確認 Google Sheets 已新增對話紀錄
gif1


五、結語:沉浸式對話的第一塊地基,正式打好

今天我們的任務不是讓 AI 看起來多聰明,
而是先幫它打造一個能「記住對話」的腦袋 🧠

✅ 完成 Google Sheets 的上下文資料架構
✅ 解決 LINE API 無法查歷史訊息的限制
✅ 讓 AI 擁有記憶

這些設計,乍看只是把訊息寫進 Google Sheets,
但其實是為 AI 建立「理解前後脈絡」的關鍵基礎。

簡單說 —— 今天不是讓客服變得更像真人,
而是幫它裝上一顆能記憶的腦。


📌 明天的 Day25 預告:
我們要正式啟動這顆腦袋:
👉 讓 AI 不只記得你說了什麼,
還能判斷哪裡沒說,主動引導、自然接話,真正實現沉浸式對話客服! 🚀


上一篇
🚀 Day 23:從 LINE 到 Odoo:自動接住每一次商機
下一篇
🚀 Day 25:有記憶的 AI × Odoo:打造會引導的沉浸式詢價客服
系列文
站在巨人的肩膀上打造企業智慧助手:Make × AI × Odoo 的實踐之路30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言