返回首頁Dialogflow

Dialogflow Intent 與 Context 完整教學:打造聰明的多輪對話

17 min 分鐘閱讀
#Dialogflow#Intent#Context#Entity#對話設計

Dialogflow Intent 與 Context 完整教學:打造聰明的多輪對話

Dialogflow Intent 與 Context 完整教學:打造聰明的多輪對話

為什麼有些聊天機器人感覺很笨,有些卻能像真人一樣對話?

關鍵在於「多輪對話」的設計。一個笨機器人每次都像第一次見面,聽完就忘。一個聰明的機器人會記住對話脈絡,理解你真正想要什麼。

Dialogflow 透過 Intent、Entity、Context 三大元素,讓你設計出能「記住」對話的機器人。這篇文章深入講解這些概念,教你打造真正聰明的 AI 對話。

如果你還不熟悉 Dialogflow 基礎,建議先閱讀 Dialogflow 完整指南


Intent(意圖)詳解

Intent 是 Dialogflow 最核心的概念:使用者想要做什麼

什麼是 Intent

當使用者說「我想訂位」,Dialogflow 需要理解這是「訂位」的意圖,而不是「查詢訂單」或「問營業時間」。

Intent 的工作流程

使用者輸入 → NLU 分析 → 匹配 Intent → 執行回應
    │              │            │            │
「我要訂位」    意圖理解    make_booking    「好的,請問...」

Training Phrases 設計技巧

Training Phrases 是教機器人認識 Intent 的例句。寫得好,機器人辨識就準確。

技巧 1:提供多樣化的說法

不要只寫一種說法:

❌ 不好的例子(只有一種說法):
- 我要訂位

✓ 好的例子(多樣化):
- 我要訂位
- 想訂個位子
- 預約座位
- 可以幫我訂位嗎
- 我想預約
- 訂桌

技巧 2:覆蓋不同長度

- 訂位(極短)
- 我要訂位(短)
- 幫我訂明天晚上的位子(中)
- 你好,我想預約這週六晚上 7 點,4 個人用餐(長)

技巧 3:包含常見錯字

台灣用戶常見的錯字或口語:

- 定位(「訂」寫成「定」)
- 預月(「約」寫成「月」,注音誤觸)
- 我想book位子(中英混用)

技巧 4:使用 Entity 標註

在 Training Phrases 中標註 Entity,讓 Dialogflow 學會擷取資訊:

訂 @sys.date:date 的位子
→ 「訂明天的位子」會擷取 date = 明天

建議數量

  • 每個 Intent 至少 10-15 個 Training Phrases
  • 重要的 Intent 可以到 30-50 個

Response 設定方式

Response 是機器人的回覆。有幾種設定方式:

1. 純文字回覆

最簡單的方式,直接輸入文字。可以輸入多個變體,Dialogflow 會隨機選擇。

- 好的,請問用餐日期是哪一天?
- 沒問題!請告訴我您想訂哪一天?
- 好的,我來幫您訂位。請問是哪一天用餐?

2. 包含參數的回覆

使用 $parameter_name 引用參數值:

好的,您想訂 $date $time,$party_size 位用餐,對嗎?

3. 平台專屬回覆

不同平台可以設定不同格式:

  • LINE:Flex Message
  • Messenger:Quick Reply
  • 網頁:純文字

預設 Intent 說明

Dialogflow 自動建立的兩個 Intent:

Intent觸發時機建議設定
Default Welcome Intent對話開始時親切的問候 + 功能引導
Default Fallback Intent聽不懂時提供選項或轉人工

Fallback Intent 設計建議

❌ 不好的回覆:
「抱歉,我聽不懂。」

✓ 好的回覆:
「不好意思,我沒有理解您的意思。您可以試試:
• 輸入「訂位」預約座位
• 輸入「菜單」查看餐點
• 輸入「客服」聯繫真人」

插圖:Intent 結構示意圖

場景描述: 一張示意圖展示 Intent 的結構。中央是 Intent 名稱「make_booking」,周圍連接四個元素:Training Phrases(多個例句)、Parameters(date、time、party_size)、Response(回覆文字)、Context(輸入/輸出上下文)。

視覺重點:

  • 主要內容清晰呈現

必須出現的元素:

  • 依據描述中的關鍵元素

需要顯示的中文字:

顏色調性: 專業、清晰

避免元素: 抽象圖形、齒輪、發光特效

Slug: dialogflow-intent-structure-diagram


Entity(實體)進階

Entity 讓 Dialogflow 從使用者輸入中擷取有意義的資訊。

系統實體 vs 自訂實體

系統實體(System Entity)

Dialogflow 內建的實體,直接可用:

實體用途範例
@sys.date日期明天、1/15、下週一
@sys.time時間7 點、晚上 8 點半
@sys.number數字4、十、一百
@sys.phone-number電話0912345678
@sys.emailEmail[email protected]
@sys.url網址https://...
@sys.geo-city城市台北、高雄

自訂實體(Custom Entity)

針對你的業務需求建立:

Entity: @menu_item
Values:
- 炒飯
- 炒麵
- 牛排
- 義大利麵

同義詞設定

讓 Entity 認識同一個東西的不同說法:

Entity: @menu_item
Value: 炒飯
Synonyms: 蛋炒飯, 炒飯飯, 炒飯便當, fried rice

Value: 牛排
Synonyms: 牛排餐, 菲力牛排, steak, 排骨, 排餐

複合實體設計

當需要擷取複雜資訊時,可以組合多個實體:

Entity: @booking_info
Value: @sys.date @sys.time @sys.number 位
Example: 明天晚上 7 點 4 位

對話:
User: 我要訂明天晚上 7 點 4 位
→ 擷取:date=明天, time=19:00, party_size=4

建議:複合實體容易出錯,建議改用多輪對話分開詢問。


Context(上下文)深度解析

Context 是讓機器人「記住」對話的關鍵。沒有 Context,每次對話都像第一次。

Input Context / Output Context

Output Context:這個 Intent 觸發後,「設定」的 Context Input Context:這個 Intent 需要「存在」才能觸發的 Context

範例:訂位流程

Intent: start_booking
Input Context: (無)
Output Context: booking(lifespan: 5)
Response: 「好的,請問用餐日期是?」

Intent: provide_date
Input Context: booking
Output Context: booking_date(lifespan: 5)
Response: 「$date 收到,請問幾點用餐?」

Intent: provide_time
Input Context: booking_date
Output Context: booking_complete(lifespan: 2)
Response: 「$date $time,請問幾位用餐?」

效果:使用者必須先觸發 start_booking,才能觸發 provide_date。這樣可以防止使用者亂講話導致流程混亂。

Lifespan 生命週期設定

Lifespan 決定 Context 存活多少輪對話。

Lifespan效果
0立即移除這個 Context
1只存活這一輪
5存活 5 輪(預設)
10+長時間記憶

設定建議

  • 短流程(2-3 步):Lifespan 設 3-5
  • 長流程(5+ 步):Lifespan 設 10+
  • 需要清除時:在結束 Intent 設定 Output Context lifespan = 0

多輪對話設計模式

模式 1:線性流程

開始 → 問日期 → 問時間 → 問人數 → 確認
 │        │         │         │        │
 └─ C1 ──┴── C2 ───┴── C3 ───┴─ C4 ───┘

每一步設定不同的 Context,確保順序執行。

模式 2:分支流程

        ┌─→ 內用流程 ─→ 問人數 → 問時間
開始 ──┤
        └─→ 外帶流程 ─→ 問品項 → 問取餐時間

根據使用者選擇,進入不同的 Context 分支。

模式 3:隨時跳出

在任何步驟都可以說「取消」跳出流程:

Intent: cancel_booking
Input Context: booking
Output Context: booking(lifespan: 0)  // 清除 Context
Response: 「已取消訂位,有其他需要嗎?」

Context 參數傳遞

Context 可以攜帶參數,讓後續 Intent 使用前面收集的資訊。

設定方式

Intent: provide_date
Parameters:
  - date: @sys.date
Output Context: booking
  - 參數會自動帶入 Context

下一個 Intent 中使用:
Response: 您選的日期是 #booking.date

存取方式

  • 同名 Context:$parameter_name
  • 指定 Context:#context_name.parameter_name

插圖:Context 流程圖

場景描述: 一張流程圖展示 Context 在多輪對話中的運作。三個 Intent 方塊垂直排列,每個方塊顯示 Input/Output Context 設定。旁邊用時間軸表示 Context 的生命週期,標示 lifespan 數字遞減的過程。

視覺重點:

  • 主要內容清晰呈現

必須出現的元素:

  • 依據描述中的關鍵元素

需要顯示的中文字:

顏色調性: 專業、清晰

避免元素: 抽象圖形、齒輪、發光特效

Slug: dialogflow-context-flow-diagram


Agent 架構設計

當專案變大,Intent 和 Context 的管理變得很重要。

意圖分類策略

用命名規則分類

訂位相關:
- booking.start
- booking.provide_date
- booking.provide_time
- booking.confirm
- booking.cancel

查詢相關:
- query.order_status
- query.menu
- query.hours

通用:
- common.greeting
- common.thanks
- common.help

好處

  • 在 Console 中排列整齊
  • 一眼看出 Intent 屬於哪個功能
  • 團隊協作更清楚

對話流程規劃

在開始建 Intent 之前,先畫出對話流程圖:

┌───────────────────────────────────────────────┐
│                  對話開始                       │
│              「你好,我是 XX 客服」              │
└───────────────┬───────────────────────────────┘
                │
    ┌───────────┼───────────┬───────────┐
    ▼           ▼           ▼           ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│ 訂位  │ │ 查詢  │ │ 客訴  │ │ 其他  │
└───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘
    │         │         │         │
    ▼         ▼         ▼         ▼
 [流程]    [流程]    [轉人工]   [FAQ]

設計原則

  • 主要功能不超過 5 個入口
  • 每個流程控制在 3-5 步
  • 永遠提供「返回」或「取消」選項

大型專案組織方式

方法 1:用 Context 前綴分組

booking_*:訂位相關 Context
order_*:訂單相關 Context
support_*:客服相關 Context

方法 2:考慮升級到 CX

如果 Intent 超過 50 個,建議改用 Dialogflow CX。CX 的 Flow 架構更適合大型專案。

詳細的 CX 教學請參考 Dialogflow CX 教學:從入門到進階

插圖:Agent 架構規劃圖

場景描述: 一張心智圖風格的圖表,中央是 Agent 名稱,分支出四個主要功能區(訂位、查詢、客服、FAQ)。每個功能區下方列出相關的 Intent 名稱,用顏色區分不同分類。

視覺重點:

  • 主要內容清晰呈現

必須出現的元素:

  • 依據描述中的關鍵元素

需要顯示的中文字:

顏色調性: 專業、清晰

避免元素: 抽象圖形、齒輪、發光特效

Slug: dialogflow-agent-architecture-planning


對話架構越做越亂?Intent 和 Context 的規劃需要經驗,架構不好會讓專案難以維護。預約架構諮詢,讓有經驗的人幫你設計可擴展的架構。


Conditional Response 條件式回應

讓機器人根據不同情況給出不同回應,更像真人對話。

根據參數動態回應

場景:根據人數給不同回應

方法 1:在 Response 中使用條件(ES 不直接支援)

方法 2:使用 Fulfillment

function handler(agent) {
  const partySize = agent.parameters.party_size;

  if (partySize > 10) {
    agent.add('10 位以上需要預付訂金,請問可以嗎?');
  } else if (partySize > 6) {
    agent.add('好的,6 位以上幫您安排包廂,請問時間是?');
  } else {
    agent.add('好的,請問用餐時間是?');
  }
}

根據 Context 切換回應

場景:已經問過日期,不要重複問

function handler(agent) {
  const context = agent.context.get('booking_date');

  if (context) {
    const date = context.parameters.date;
    agent.add(`您之前選的是 ${date},要改日期嗎?還是繼續?`);
  } else {
    agent.add('請問用餐日期是哪一天?');
  }
}

實作範例

完整的條件式訂位流程

exports.dialogflowWebhook = (request, response) => {
  const agent = new WebhookClient({ request, response });

  function handleBooking(agent) {
    const { date, time, party_size } = agent.parameters;

    // 檢查是否是週末
    const bookingDate = new Date(date);
    const isWeekend = bookingDate.getDay() === 0 || bookingDate.getDay() === 6;

    // 檢查是否是熱門時段
    const hour = parseInt(time.split(':')[0]);
    const isPeakHour = hour >= 18 && hour <= 20;

    if (isWeekend && isPeakHour && party_size > 4) {
      agent.add('週末熱門時段大桌位置有限,建議提前 3 天預約。您確定要訂這個時段嗎?');
    } else if (isWeekend) {
      agent.add('週末用餐人較多,建議提早 10 分鐘到場。確認訂位嗎?');
    } else {
      agent.add(`好的,${date} ${time},${party_size} 位,確認訂位嗎?`);
    }
  }

  const intentMap = new Map();
  intentMap.set('booking.confirm', handleBooking);

  agent.handleRequest(intentMap);
};

更多 Fulfillment 開發細節,請參考 Dialogflow Fulfillment 與 API 整合教學


常見錯誤與除錯

錯誤 1:Intent 互相衝突

症狀:說 A 卻觸發 B

原因:Training Phrases 太相似

解法

  1. 檢查兩個 Intent 的 Training Phrases
  2. 讓差異更明顯
  3. 使用 Input Context 區隔

錯誤 2:Context 過期

症狀:多輪對話中途斷掉

原因:Lifespan 太短

解法:增加 Lifespan,或在每個步驟都重新設定 Output Context

錯誤 3:參數擷取失敗

症狀:應該擷取到的參數是 null

原因

  1. Entity 沒有覆蓋使用者的說法
  2. Training Phrases 沒有標註 Entity

解法

  1. 增加 Entity 的同義詞
  2. 確認 Training Phrases 有正確標註

除錯技巧

使用測試面板

  1. 在 Dialogflow Console 右側測試
  2. 點擊「Diagnostic Info」查看詳細資訊
  3. 檢查觸發的 Intent、參數值、Context 狀態

查看歷史記錄

  1. 點擊左側「History」
  2. 查看過去的對話記錄
  3. 找出辨識失敗的案例,加入 Training Phrases

下一步

掌握 Intent 和 Context 後,你可以:

  1. 整合後端系統Dialogflow Fulfillment 與 API 整合教學
  2. 串接 LINE BotDialogflow LINE Bot 串接教學
  3. 學習 CX 版本Dialogflow CX 教學:從入門到進階

插圖:Intent/Context 學習完成路線圖

場景描述: 一張路線圖,起點是「Intent/Context 基礎」,分成三條路徑:「後端整合」連接到 Fulfillment 文章、「平台整合」連接到 LINE Bot 文章、「進階架構」連接到 CX 教學文章。每條路徑用不同顏色標示。

視覺重點:

  • 主要內容清晰呈現

必須出現的元素:

  • 依據描述中的關鍵元素

需要顯示的中文字:

顏色調性: 專業、清晰

避免元素: 抽象圖形、齒輪、發光特效

Slug: dialogflow-intent-context-next-steps


對話設計需要專業建議?

好的對話設計讓使用者覺得在跟真人聊天,不好的設計讓人想直接打電話找客服。

如果你需要:

  • 規劃複雜的多輪對話流程
  • 優化現有機器人的辨識率
  • 設計自然流暢的對話體驗
  • 處理大量 Intent 的架構規劃

預約 AI 導入諮詢,讓有經驗的對話設計師幫你打造真正好用的 AI 客服。

諮詢完全免費,我們會在 24 小時內回覆。


需要專業的雲端建議?

無論您正在評估雲平台、優化現有架構,或尋找節費方案,我們都能提供協助

預約免費諮詢

相關文章