iT邦幫忙

2025 iThome 鐵人賽

DAY 25
2
Odoo

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

🚀 Day 25:有記憶的 AI × Odoo:打造會引導的沉浸式詢價客服

  • 分享至 

  • xImage
  •  

一、前情提要:幫 AI 裝上記憶力

昨天的 Day24,我們完成了一個關鍵性的技術基礎:

✅ 使用 Google Sheets 讓 AI 擁有「記憶力
✅ 解決 LINE API 無法回溯訊息的限制
✅ 將用戶每一句話都即時儲存,讓 AI 有了「上下文」可供參考

📌 但要特別強調一件事:
昨天的內容,只是「記錄上下文」而已,還沒真正應用在實際流程中。

你可以把昨天的流程想像成:
我們替 AI 架好了大腦主機板,也裝上了記憶體,但 CPU 還沒啟動。

🧠 換句話說:AI 雖然有資料庫可以讀,但昨天我們並沒有讓它「讀出來判斷」。

那今天呢?

今天就是:
👉 正式啟動 AI 的大腦
👉 開始讓 AI 參與流程


二、使用者情境

我們延續昨天的情境:
客戶的表達方式是 逐步輸入邊想邊修改

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

在原本的流程中,AI 只會看單一句話 → 每次都當成一個新的需求。
結果就是Odoo系統中會出現:好幾張商機
但其實我們知道,客戶在說的是「同一個商機的不同補充」。


所以今天我們就是要利用有記憶力的 AI,來幫我們完成以下事情:

1️⃣ 整合客戶完整的需求
2️⃣ 判斷哪些資訊還沒講清楚
3️⃣ 主動用對話方式詢問、引導
4️⃣ 整理為一份完整摘要,請客戶確認
5️⃣ 確認後才新增 Odoo 商機

這樣的過程,才是真正像真人客服一樣「一步步引導」,而不是讓客戶像填表機器人一樣被動填資料。


三、實際操作流程

🔧 步驟 1:新增 Gemini

首先,我們要先釐清:
如果客戶逐句輸入詢價內容,可能會有哪些情境?

1️⃣ 表示想了解產品,但沒有提供具體資訊
2️⃣ 提供了工件材質
3️⃣ 提供了加工需求
4️⃣ 提供了工件尺寸
5️⃣ 點選了「規格無誤」按鈕,回傳規格無誤

根據這五種可能,我設計了一套邏輯:
👉 讓 AI 分析客戶的整段對話,判斷是否有遺漏關鍵資訊。
如果有缺漏,AI 會只回覆一項優先度最高的缺少項目;
若資訊都已完整,AI 則會幫我們統整為一份清單,並等待客戶確認。

簡單來說:

  • 若缺「工件材質」與「加工需求」→ 請 AI 回覆「工件材質」
  • 若只缺「加工需求」→ 回覆「加工需求」
  • 若全部資訊齊全 → 整合為摘要 + QuickReply

https://ithelp.ithome.com.tw/upload/images/20250825/20177665ClShKibla5.png
因此,我們現在要來新增一個 Gemini 模組,並設定對應的 Prompt。
📌 注意:Prompt 的輸入內容,必須是該客戶的完整對話紀錄(也就是Google Sheets的對話紀錄),而不是單一句話!

請根據以下對話紀錄,依照購買流程順序判斷是否已取得完整資訊,並輸出對應結果。

購買流程如下順序進行判斷:
-購買:明確表示想要購買刀具產品。
-工件材質:說明被加工物體的材質,例如鋁、不鏽鋼、鑄鐵等。
-加工需求:說明希望刀具能達成的加工效果,例如去毛邊、內孔加工、倒角等。
-工件尺寸:說明被加工物體的尺寸或體積,例如「材積大概5」、「長寬高約10公分」。

輸出邏輯、順序如下:

一、若對話中出現"規格無誤"的語句,表示前一筆單據已完成。
→ 請只讀取這句之後的內容。前面的資料一律忽略。


二、若三項資訊皆齊全,請統整為下列格式:
1.工件材質:xxx
2.加工需求:xxx
3.工件尺寸:xxx

三、若有缺少資訊,請依照購買流程順序,回傳第一個缺少的欄位名稱(只輸出一項):
工件材質
加工需求
工件尺寸

請勿輸出任何說明或格式說明,只需輸出結果。

對話紀錄如下:{{70.array}}

範例 1:
輸入:
我想購買刀具
我要用來切鋁的
我要倒角跟去毛邊
材積約為10

輸出:
1.工件材質:鋁
2.加工需求:倒角、去毛邊
3.工件尺寸:10

範例 2:
輸入:
我想購買刀具
我要用來切鑄鐵的

輸出:
加工需求

範例 3:
輸入:
嗨,我是佳佳精密的
我們有在找可以加工不鏽鋼的刀具
主要是希望可以用在內孔加工跟倒角這兩種用途
目前的工件大約是 12x12x20 的尺寸

輸出:
1.工件材質:不鏽鋼
2.加工需求:內孔加工、倒角
3.工件尺寸:12x12x20

範例 4:
輸入:
哈囉~我們最近在挑刀具,想問一下你們家的規格
我想要加工鋁材,會用在倒角跟去毛邊上
之前用別家的效果沒有很好
這次想試試看你們家的
目前就先給這些資訊,方便報個價嗎?

輸出:
工件尺寸

範例5:
輸入:
我要購買刀具
材質鋁
鑽孔
16材
規格無誤
我想買你們的產品
我要用來切鑄鐵

輸出:
加工需求
(輸出加工需求的原因是因為有出現規格無誤,所以規格無誤前的資料都不需參考,只統整規格無誤後的資料)

🔧 步驟 2:新增 Router 設定路線

接下來,根據我的 Prompt 設計,AI 可能會產生以下五種結果:

  • 購買
  • 工件材質
  • 加工需求
  • 工件尺寸
  • 統整後的完整資訊

https://ithelp.ithome.com.tw/upload/images/20250825/20177665S9Y9f9IouE.png
所以我們需要設定 五條分流路線

https://ithelp.ithome.com.tw/upload/images/20250825/20177665zw2IOY0tUd.png
特別是最後一條「統整資訊」的判斷,因為AI會回傳的格式為:

1.工件材質:xxx
2.加工需求:xxx
3.工件尺寸:xxx

所以我們可以設置嚴謹一點的篩選:
如果AI文字包含

  • 工件材質:
  • 且包含 加工需求:
  • 且包含 工件尺寸:

則就走統整路線。


🔧 步驟 3:設定前四種路線的對應流程

針對前四種「缺少資訊」的情境,我設計了兩種詢問方式:

  1. 提供 QuickReply 按鈕(讓使用者點選,例如:只提供「鋁」一個選項)
  2. 讓使用者直接以自然語言輸入(例如:「是鋁合金」)

https://ithelp.ithome.com.tw/upload/images/20250825/20177665m9Js6nTHzV.png
所以新增一個Line的Make an API Call

我在這邊呈現兩種範例
1.這是我第一次購買路線Make an API Call設置

URL:/v2/bot/message/reply
BODY:
{
  "replyToken": "{{3.events[].replyToken}}",
  "messages": [
    {
      "type": "text",
      "text": "請選擇或說明工件材質:(被加工物體的材質)",
      "quickReply": {
        "items": [   
          {
            "type": "action",
            "action": {
              "type": "message",
              "label": "鑄鐵",
              "text": "工件材質:鑄鐵"
            }
          },
         {
            "type": "action",
            "action": {
              "type": "message",
              "label": "不銹鋼",
              "text": "工件材質:不銹鋼"
            }
          },
         {
            "type": "action",
            "action": {
              "type": "message",
              "label": "鋁",
              "text": "工件材質:鋁"
            }
          }
        ]
      }
    }
  ]
}

2.這是我工件材質路線Make an API Call設置
至於加工需求和工件尺寸就請大家練習,就其實也是依樣畫葫蘆

URL:/v2/bot/message/reply
BODY:
{
  "replyToken": "{{3.events[].replyToken}}",
  "messages": [
    {
      "type": "text",
      "text": "請選擇或說明工件材質:(被加工物體的材質)",
      "quickReply": {
        "items": [   
          {
            "type": "action",
            "action": {
              "type": "message",
              "label": "鑄鐵",
              "text": "工件材質:鑄鐵"
            }
          },
         {
            "type": "action",
            "action": {
              "type": "message",
              "label": "不銹鋼",
              "text": "工件材質:不銹鋼"
            }
          },
         {
            "type": "action",
            "action": {
              "type": "message",
              "label": "鋁",
              "text": "工件材質:鋁"
            }
          }
        ]
      }
    }
  ]
}

🔧 步驟 4:統整路線的設置

這條路線需要特別處理,因為 AI 回傳的是整合好的完整資訊,例如:

1.工件材質: 不鏽鋼
2.加工需求: 倒角
3.工件尺寸: 30x40x20 mm

我們要做的有兩件事:
1️⃣ 將這份資料回覆給客戶
2️⃣ 加上 QuickReply:「✅ 規格無誤」

到這邊你可能會想說:

那就先用 Send a Reply Message 回資料,再用 Make an API Call 發送 QuickReply,不就好了?

❗但其實這是個 陷阱
因為quickreply 一定要使用Make an API Call
而Make an API Call是需要使用要Reply Token
但你還記得Day13說的嗎?

  1. Reply Token 只能用一次,用過就失效
  2. 若要在之後回覆,必須改用 Push Message

所以正確做法如下:

1️⃣用 Line 的 Send a Push Message 傳送統整資訊(因為不需要 Reply Token,使用 line_uid 來判斷要發送給哪一位使用者)
https://ithelp.ithome.com.tw/upload/images/20250825/20177665lsSn7X3cby.png

2️⃣再用 Make an API Call 發送帶有 QuickReply 的確認訊息

URL:/v2/bot/message/reply
BODY:
{
  "replyToken": "{{3.events[].replyToken}}",
  "messages": [
    {
      "type": "text",
      "text": "請幫我確認規格是否正確,若不正確請直接在聊天窗敘述你要更改的資訊",
      "quickReply": {
        "items": [   
          {"type": "action",
            "action": {
              "type": "message",
              "label": "規格無誤",
              "text": "規格無誤"
            }}
        ]
      }
    }]}

🎯 到這裡,我們就完成了像 「真人對話般的機器人」

  • 客戶逐句輸入資料
  • AI 自動整合+補問
  • 客戶點選確認

至於如何將資料寫入 Odoo CRM 商機,就請參考 Day23 的說明吧~
那接下來就來成果演示一下吧~


四、測試成果

我們實測了一段真實互動:
1️⃣ 客戶第一句:「你好,我想詢價」
2️⃣ AI 判斷為「詢價意圖」
3️⃣ 系統開始提問:「請提供工件材質」
4️⃣ 客戶逐步說明
5️⃣ 系統持續補問、判斷是否有缺漏
6️⃣ 系統整合為摘要並請客戶確認
7️⃣ 客戶點選「規格無誤」
8️⃣ 成功新增 Odoo CRM 商機
9️⃣ LINE 回覆:「✅ 已新增,稍後與您聯繫」

結果呈現:https://youtu.be/UNbxfoNeKJs
Yes


五、結語:記憶 × 判斷 × 引導,一條龍的沉浸式詢價

今天的任務,我們可以說是幫 AI 打通了任督二脈:

✅ 把對話寫入 Google Sheets(記憶
✅ 用 Gemini 分析上下文(判斷
✅ 補問缺漏資訊,引導對話(引導
✅ 確認後才寫入 Odoo(精準寫入

這樣的流程,才是真正的「對話式詢價」,
不是填表單的包裝,而是從語意到行為都像真人客服。


📌 明天預告

玩到這裡,你可能心中也有個疑問:

「啊你不是說這系列是 No Code 嗎?為什麼我看你用 Make 跟 Odoo 串接時,全部都在用什麼 Make an API Call? Make 不是有 Odoo 模組嗎?」

沒錯,這就是我們明天的主題!

我會完整說明:

  • 為什麼我捨棄了現成的 Odoo 模組
  • 為什麼我使用 Make an API Call 、 它有什麼優勢

我們明天見 👋


上一篇
🚀 Day 24:智慧客服進化:AI擁有上下文,體驗沉浸式對話
下一篇
🚀 Day 26:現成模組不用?我為什麼選擇進階玩法:Make an API Call
系列文
站在巨人的肩膀上打造企業智慧助手:Make × AI × Odoo 的實踐之路30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言