狀態處理常式

狀態處理常式 (也簡稱處理常式) 可控管對話,方法包括建立使用者回覆,以及/或是轉換目前頁面。系統會評估每個對話回合的處理常式,這可能會影響工作階段。處理常式通常有三種資料類型:

字詞 定義
處理常式需求條件 必須滿足這些條件,處理常式才會對工作階段產生任何影響。如果處理常式符合條件,並以某種方式影響工作階段,系統就會呼叫該處理常式。
處理常式執行要求 如果呼叫處理常式,系統會使用選用的執行要求,為使用者建立回覆。這些回覆可能定義於靜態代理資料,或從 Webhook 服務動態擷取。
處理常式轉換目標 如果呼叫處理常式,系統會使用選用的轉換目標來變更目前頁面。下一頁只能是流程開始頁面,或目前有效流程中的頁面。

狀態處理常式分為兩種類型,處理常式需求各有不同:

字詞 定義
Routes 當使用者輸入內容與意圖相符,且/或符合工作階段狀態的某些條件時,系統就會呼叫路徑。具有意圖要求的路徑也稱為「意圖路徑」。只有條件要求的路徑也稱為「條件路徑」。
事件處理常式 叫用事件時,系統會呼叫事件處理常式。收到非預期的使用者輸入內容,或發生 Webhook 錯誤時,系統會觸發部分內建事件。您也可以定義自訂事件,在對話以外的情況發生時叫用。

處理狀態處理常式有三個步驟:

字詞 定義
1. 範圍 處理常式必須在範圍內,才能對工作階段產生任何影響。範圍取決於處理常式是否套用至流程、頁面或表單參數,以及相關聯的流程是否有效、相關聯的頁面是否有效,或代理目前是否嘗試填寫相關聯的表單參數。
2. 評估 系統會依序評估範圍內的每個處理常式。如果符合處理常式的要求,就會通過評估。
3. 撥打電話 如果處理常式在範圍內且通過評估,就會受到呼叫。系統會呼叫所有相關的執行要求,並將所有相關的轉換目標套用至工作階段。

範圍

處理常式必須在範圍內,才能進行評估。處理常式範圍是重要且強大的工具,可協助您控制對話。控制處理常式的範圍,即可控制:

X 項目
意圖可比對時
檢查條件的時機
可處理特定事件時
頁面轉換的時機
提供靜態執行要求回覆時
呼叫已啟用 Webhook 的執行要求,以取得動態回覆時

範圍取決於處理常式是否套用至流程、頁面或表單參數,以及相關聯的流程是否有效、相關聯的頁面是否有效,或代理目前是否嘗試填寫相關聯的表單參數。

詳細的範圍設定規則如下:

  • 套用至有效流程的路由:
    • 如果目前頁面是流程開始頁面,則在範圍內。
    • 如果目前頁面不是流程開始頁面,則只有在意圖符合要求時,才會納入範圍。
  • 套用至目前頁面的路徑屬於範圍內。
  • 套用至有效流程的事件處理常式會納入範圍。
  • 套用至目前頁面的事件處理常式都在範圍內。
  • 如果事件處理常式套用至代理目前嘗試填寫的表單參數,則會納入範圍。

Routes

路徑有兩項規定,必須提供其中一項或兩項。如果同時提供這兩項要求,則必須同時滿足這兩項要求,才能呼叫路徑:

字詞 定義
意圖規定 意圖:必須與目前對話回合的使用者輸入內容相符。如果路由有意圖需求,則稱為「意圖路由」。
條件要求 必須符合的條件。如果路徑有條件要求,則稱為「條件路徑」。

您可以將路徑套用至流程 (流程層級路徑) 和頁面 (頁面層級路徑)。舉例來說,您可以在下列情況使用路徑:

X 項目
使用者輸入內容與意圖相符時,應觸發靜態執行要求回覆。
當使用者輸入內容與意圖相符時,這項比對應觸發已啟用 Webhook 的執行要求,以提供動態回覆。
使用者輸入內容提供最後一個必要的表單參數後,條件檢查會觸發工作階段轉換至另一個頁面。
使用者輸入內容提供特定表單參數時,條件檢查會觸發靜態 fulfillment 回覆。
條件檢查設為 true,強制轉換頁面。

意圖傳播

一般來說,當意圖比對成功而呼叫路徑時,系統會使用該意圖。除非新的使用者輸入內容觸發新的意圖比對,否則已使用的意圖無法再次比對。不過,在下列情況下,意圖比對可以從一個流程傳播到另一個流程:

  • flow F1 中的路徑以 intent I1 為必要條件,並以 flow F2 為轉換目標。
  • Flow F2 的路徑也需要 intent I1。

在這種情況下,當系統呼叫 flow F1 中的路徑時,intent I1 會針對單一使用者輸入內容比對兩次,並呼叫這兩條路徑。

傳播意圖有助於:

X 項目
將目前頁面變更為其他流程中的特定頁面 (轉換目標流程的路由具有特定轉換目標頁面)。
為流程的開始頁面建立進入訊息 (轉換目標流程的路由有 fulfillment)。

路由群組

建構代理時,您可能會發現許多頁面都有共同的路由。如要重複使用路由,可以定義路由群組。您可以在流程或整個代理中,建立可重複使用的群組資源。

舉例來說,您可能希望流程處理使用者輸入內容,例如「我想在披薩上加配料」和「我想變更飲料大小」。當流程中有多個頁面處於啟用狀態時,應處理這些輸入內容。您可以定義兩個路徑,並使用意圖處理所有相關頁面的這些輸入內容,但這會造成大量重複工作。您可以定義一次路由群組,然後在所有相關頁面上新增該群組的參照。

流程層級路由群組

流程層級路徑群組是以流程為父項建立的路徑群組資源。可在流程中重複使用。

代理層級路由群組

代理層級路徑群組是以代理為父項建立的路徑群組資源。這些頁面可在整個代理中重複使用,但禁止轉換至非符號頁面的路徑。

流程層級路徑

流程層級路由:將路由新增至流程開始頁面,即可套用至流程。這類處理常式的用途如下:

X 項目
流程起始頁面範圍內,有意圖或條件要求的處理常式。
處理常式,其意圖需求範圍涵蓋流程中的所有頁面。

如要透過控制台建立流程層級路徑,請按照下列步驟操作:

  1. 開啟流程起始頁面。
  2. 按一下「Routes」標題中的新增 按鈕。
  3. 路線編輯面板隨即開啟。
  4. 提供路徑欄位。
  5. 按一下 [儲存]。

如要透過控制台重新排序流程層級路徑,請按照下列步驟操作:

  1. 開啟流程起始頁面。
  2. 按一下「Routes」(路徑) 標題。
  3. 路線清單面板隨即開啟。
  4. 依所需順序拖曳路徑。 或者,按一下選項選單 ,然後選取「Move To」(移至)。

如要透過控制台刪除流程層級路徑,請按照下列步驟操作:

  1. 開啟流程起始頁面。
  2. 按一下「Routes」(路徑) 標題。
  3. 路線清單面板隨即開啟。
  4. 按一下選項 選單。
  5. 選取 [刪除]。

網頁層級路徑

頁面層級路徑是套用至頁面的路徑。這類處理常式的用途如下:

X 項目
特定頁面處於啟用狀態時,範圍內有意圖或條件要求的處理常式。

如要透過控制台建立頁面層級路徑,請按照下列步驟操作:

  1. 開啟頁面 (而非流程起始頁面)。
  2. 按一下「Routes」標題中的新增 按鈕。
  3. 路線編輯面板隨即開啟。
  4. 提供路徑欄位。
  5. 按一下 [儲存]。

如要透過控制台重新排序頁面層級路徑,請按照下列步驟操作:

  1. 開啟頁面 (而非流程起始頁面)。
  2. 按一下「Routes」(路徑) 標題。
  3. 路線清單面板隨即開啟。
  4. 按照所需順序拖曳路徑。 或者,按一下選項選單 ,然後選取「Move To」(移至)。

如要從控制台刪除頁面層級路徑,請按照下列步驟操作:

  1. 開啟頁面 (而非流程起始頁面)。
  2. 按一下「Routes」(路徑) 標題。
  3. 路線清單面板隨即開啟。
  4. 按一下選項 選單。
  5. 選取 [刪除]。

事件處理常式

事件處理常式必須符合一項條件才能呼叫:

字詞 定義
活動規定 必須叫用的事件。事件是依名稱識別。 收到非預期的使用者輸入內容,或發生 Webhook 錯誤時,系統會叫用部分內建事件。您也可以定義自訂事件,在對話以外的情況發生時叫用。

您可以將事件處理常式套用至流程 (流程層級事件處理常式)、頁面 (頁面層級事件處理常式) 和參數 (參數層級事件處理常式)。舉例來說,您可以在下列情況使用事件處理常式:

X 項目
如果使用者輸入內容與任何意圖都不相符,不相符事件處理常式會提供特定的靜態執行回覆。
系統中的計時器到期,您想透過特定的靜態執行回應,向使用者提供提醒資訊。

流程層級事件處理常式

流程層級事件處理常式是套用至流程的事件處理常式。這類處理常式的用途如下:

X 項目
流程起始頁面範圍內,有活動規定的處理常式。
流程中所有頁面範圍內,有活動規定的處理常式。
處理非預期的使用者輸入內容,由流程中的所有頁面共用。
處理 Webhook 錯誤,由流程中的所有頁面共用。
處理系統叫用的自訂事件,由流程中的所有頁面共用。

每個流程都有 no-match 和 no-input 內建事件的事件處理常式。建立流程時,系統會自動建立這些事件處理常式,且無法刪除。

如要透過控制台建立流程層級事件處理常式,請按照下列步驟操作:

  1. 開啟流程起始頁面。
  2. 按一下「Event handlers」標題中的「Add」 按鈕。
  3. 事件處理常式面板隨即開啟。
  4. 提供事件處理常式欄位。
  5. 按一下 [儲存]。

如要從控制台刪除流程層級事件處理常式,請按照下列步驟操作:

  1. 開啟流程起始頁面。
  2. 按一下「事件處理常式」標題。
  3. 事件處理常式清單面板隨即開啟。
  4. 將滑鼠游標懸停在事件處理常式上,然後按一下「Delete」(刪除) 按鈕。

網頁層級事件處理常式

頁面層級事件處理常式是套用至頁面的事件處理常式。這類處理常式的用途如下:

X 項目
特定頁面處於啟用狀態時,範圍內有事件要求的處理常式。
處理非預期的使用者輸入內容 (特定頁面)。
處理特定頁面的 Webhook 錯誤。
處理系統叫用的自訂事件 (特定網頁)。

如要透過控制台建立頁面層級事件處理常式,請按照下列步驟操作:

  1. 開啟頁面 (非流程開始頁面)。
  2. 如果沒有「事件處理常式」標題,請按一下「Add state handler」,選取「事件處理常式」,然後點選「Apply」。
  3. 按一下「Event handlers」標題中的「Add」 按鈕。
  4. 事件處理常式面板隨即開啟。
  5. 提供事件處理常式欄位。
  6. 按一下 [儲存]。

如要從控制台刪除頁面層級事件處理常式,請按照下列步驟操作:

  1. 開啟頁面 (非流程起始頁面)。
  2. 按一下「事件處理常式」標題。
  3. 事件處理常式清單面板隨即開啟。
  4. 將滑鼠游標懸停在事件處理常式上,然後按一下「刪除」按鈕 。

參數層級事件處理常式

參數層級事件處理常式是套用至表單參數的事件處理常式。這類處理常式也稱為重新提示處理常式。這些事件處理常式不允許自訂事件,因為其專門用於處理使用者填寫表單時輸入的無效內容。

這類處理常式的用途如下:

X 項目
使用者在填寫表單參數時,未提供有效輸入內容。

如要透過控制台建立參數層級事件處理常式,請按照下列步驟操作:

  1. 開啟含有表單參數的頁面。
  2. 按一下參數。
  3. 參數面板隨即開啟。
  4. 向下捲動至「Reprompt event handlers」(重新提示事件處理常式) 部分,然後點選「Add event handler」(新增事件處理常式)。
  5. 事件處理常式面板隨即開啟。
  6. 提供事件處理常式欄位。
  7. 按一下 [儲存]。

如要從控制台刪除參數層級事件處理常式,請按照下列步驟操作:

  1. 開啟含有表單參數的頁面。
  2. 按一下參數。
  3. 參數面板隨即開啟。
  4. 向下捲動至「Reprompt 事件處理常式」部分。
  5. 將滑鼠游標懸停在事件處理常式上,然後按一下「刪除」按鈕 。

內建事件

下列事件為內建,由 Dialogflow CX 叫用。部分活動僅限特定等級參加。

事件名稱
流程層級 頁面層級 參數層級 叫用時機
sys.no-match-default ✔ ✔ ✔
  • 流程或頁面層級:使用者輸入內容與範圍內處理常式的任何意圖都不相符。
  • 參數層級:使用者輸入內容不符合表單參數。
sys.no-match-[1-6] ✔ ✔ ✔ 如果您為這些依數字排序的事件提供處理常式,系統會依序叫用這些處理常式,而非 sys.no-match-default:sys.no-match-1、sys.no-match-2...
sys.no-input-default ✔ ✔ ✔ 未收到使用者輸入內容。這項功能可在下列情況下叫用:
  • Dialogflow CX 收到空白的使用者文字輸入內容。
  • Dialogflow CX 收到空白的使用者音訊輸入,或輸入內容不含任何可辨識的語音。
  • 在使用者音訊輸入內容包含任何可辨識的語音之前,發生無語音逾時。
sys.no-input-[1-6] ✔ ✔ ✔ 如果您為這些依數字排序的事件提供處理常式,系統會依序叫用這些處理常式,而非 sys.no-input-default:sys.no-input-1、sys.no-input-2...
sys.invalid-parameter ✔ 當 Webhook 回應將 WebhookResponse.pageInfo.formInfo.parameterInfo.state 設為 INVALID,導致參數失效時,系統會叫用這個方法。
sys.long-utterance ✔ ✔ ✔ 使用者輸入內容超過非生成意圖或參數比對的長度上限 (256 個字元)。如未提供,Dialogflow CX 會將長篇使用者語句視為 no-match。如果是串流音訊輸入,只有在用戶端關閉音訊串流後,才會觸發這個事件。
webhook.error ✔ ✔ Webhook 呼叫傳回錯誤。只有在下列情況下,系統才會叫用這個事件:1) 沒有與 Webhook 錯誤代碼相符的精細 Webhook 事件處理常式 (例如 webhook.error.timeout);2) 在呼叫執行作業的原始路徑中,沒有設定轉換目標,且 Webhook 失敗。詳情請參閱「評估順序」一節。
webhook.error.timeout ✔ ✔ Webhook 呼叫逾時。只有在原始路徑中未設定轉換目標,且該路徑呼叫了含有失敗 Webhook 的執行要求時,系統才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
webhook.error.bad-request ✔ ✔ Webhook 傳回 400 Bad Request。只有在原始路徑中未設定轉換目標,且該路徑呼叫了含有失敗 Webhook 的執行要求時,系統才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
webhook.error.rejected ✔ ✔ Webhook 傳回 401 Unauthorized 或 403 Forbidden。只有在原始路徑中未設定轉換目標,且該路徑呼叫了含有失敗 Webhook 的執行要求時,系統才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
webhook.error.unavailable ✔ ✔ Webhook 傳回 503 Service Unavailable。只有在原始路徑中未設定轉換目標,且該路徑呼叫了含有失敗 Webhook 的執行要求時,系統才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
webhook.error.not-found ✔ ✔ 無法連上 Webhook 網址,因此 Webhook 呼叫失敗。只有在原始路徑中未設定轉換目標,且該路徑呼叫了含有失敗 Webhook 的執行要求時,系統才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
flow-cancelled ✔ ✔ 使用者要求取消流程。這個事件是由「End Flow With Cancellation」頁面觸發,請參閱 END_FLOW_WITH_CANCELLATION 符號轉換目標。
flow-failed ✔ ✔ 這項流程無法完成指定工作。這個事件是由「結束流程並回報失敗」頁面觸發,請參閱END_FLOW_WITH_FAILURE 符號轉換目標。
flow-failed-human-escalation ✔ ✔ 使用者要求與真人服務專員交談。這個事件是由「End Flow With Human Escalation」頁面觸發,請參閱END_FLOW_WITH_HUMAN_ESCALATION 符號轉換目標。

自訂事件

您可以建立自訂事件和事件處理常式。自訂事件可處理使用者對話以外的情況,例如使用者點選按鈕、經過一段時間、對話期間可用庫存已變更等。

事件僅以名稱識別。請避免使用開頭為 sys. 或 webhook. 的事件名稱,以免與內建事件衝突。

如要使用 API 叫用事件,請參閱 Session 類型的 detectIntent 方法 queryInput.event 欄位。

選取工作階段參考資料的通訊協定和版本:

通訊協定 V3 V3beta1
REST 工作階段資源 工作階段資源
RPC 工作階段介面 工作階段介面
C++ SessionsClient 不適用
C# SessionsClient 不適用
Go SessionsClient 不適用
Java SessionsClient SessionsClient
Node.js SessionsClient SessionsClient
PHP 不適用 不適用
Python SessionsClient SessionsClient
小茹 不適用 不適用

評估順序

系統會按照特定順序評估處理常式。並遵守以下通則:

  1. 系統只會評估範圍內的處理常式。
  2. 只有符合條件的處理常式才能呼叫。
  3. 如果呼叫的處理常式沒有轉換目標,系統會繼續評估處理常式清單。根據這項規則,多個執行要求可以將多則訊息新增至回覆佇列。
  4. 如果呼叫具有轉換目標的處理常式,系統就會停止評估處理常式清單。
  5. 如果呼叫了含有執行要求的處理常式,且執行要求導致 Webhook 錯誤:
    • 如果處理常式已定義轉換目標,Webhook 會失敗,但不會顯示任何訊息。
    • 如果事件處理常式在事件範圍內,就會處理事件,並結束評估處理常式清單。
    • 如果事件範圍內沒有事件處理常式,Webhook 會失敗,但不會顯示任何訊息。
  6. 當意圖需求獲得滿足時,系統會使用意圖,因此只能呼叫為意圖找到的第一個路徑處理常式 (例外狀況請參閱「意圖傳播」)。
  7. 滿足條件要求時,條件不會消耗,因此可以呼叫多個具有該條件的路徑。
  8. 當事件符合條件時,系統會消耗事件,因此只能呼叫為事件找到的第一個事件處理常式。
  9. 處理常式呼叫堆疊可能會影響評估順序。

評估作業分為三個階段:

  1. 具有意圖需求的路由會依下列順序評估:
    1. 頁面層級:套用至目前頁面的個別路徑,依提供順序排列。
    2. 頁面層級群組:套用至目前頁面的路由群組,依提供的順序排列。
    3. 流程層級:按照提供的順序,將路徑套用至有效流程。
    4. 流程層級群組:套用至有效流程的路徑群組,依提供的順序排列。
  2. 如果路徑只有條件要求,則會按照下列順序評估:
    1. 頁面層級:套用至目前頁面的個別路徑,依提供順序排列。
    2. 頁面層級群組: 套用至目前頁面的路由群組,依提供的順序排列。
    3. 流程層級 (僅限目前頁面為流程開始頁面時):按照提供的順序,將路由套用至有效流程。
    4. 流程層級群組 (僅限目前頁面為流程起始頁面時):按照提供的順序,套用至有效流程的路由群組。
  3. 事件處理常式的評估順序如下:
    1. 參數層級: 套用至目前頁面表單參數的事件處理常式,代理目前嘗試填寫 (重新提示處理常式),順序與提供時相同。
    2. 頁面層級:套用至目前頁面的事件處理常式,按照提供的順序排列。
    3. 流程層級:按照提供的順序,將事件處理常式套用至有效流程。

象徵性過渡目標

輸入處理常式的轉換目標時,您可以輸入特定流程或頁面,也可以輸入符號轉換目標:

符號轉換目標
說明
START_PAGE 轉換至同名有效流程的開始頁面。
END_FLOW 結束目前運作中的流程,並返回導致轉換至目前流程的頁面。另請參閱「處理常式呼叫堆疊和流程堆疊限制」。
END_FLOW_WITH_CANCELLATION 結束目前運作中的流程,並返回導致轉換至目前流程的頁面。呼叫頁面可以使用 flow-cancelled 內建事件處理這項轉換。另請參閱「處理常式呼叫堆疊和流程堆疊限制」。
END_FLOW_WITH_FAILURE 結束目前運作中的流程,並返回導致轉換至目前流程的頁面。呼叫頁面可以使用 flow-failed 內建事件處理這項轉換。另請參閱「處理常式呼叫堆疊和流程堆疊限制」。
END_FLOW_WITH_HUMAN_ESCALATION 結束目前運作中的流程,並返回導致轉換至目前流程的頁面。通話頁面可以使用 flow-failed-human-escalation 內建事件處理這項轉換。另請參閱「處理常式呼叫堆疊和流程堆疊限制」。
END_SESSION 清除目前的工作階段,並轉換至名為 END_SESSION 的特殊頁面。使用者下次輸入內容時,工作階段會從預設啟動流程的起始頁面重新開始。
PREVIOUS_PAGE 轉換至導致轉換至目前頁面的前一個頁面。轉換後,系統會還原前一頁的頁面狀態。
CURRENT_PAGE 重新轉換至目前頁面。如果想讓代理重複某個動作,這項功能就派得上用場。

處理常式呼叫堆疊和流程堆疊限制

當工作階段透過特定跳轉目標從一個流程跳轉到另一個流程時,每個流程都會推送至流程堆疊。

處理常式呼叫堆疊

工作階段轉換至 END_FLOW 時,會返回導致轉換至完成流程的呼叫頁面。在這種情況下,系統會保留處理常式呼叫堆疊。系統會略過先前從呼叫頁面評估的所有處理常式,並依序評估其餘處理常式。

例如:

  1. 頁面 P 有三個處理常式,順序如下:H1、H2、H3。
  2. 系統會評估 H1,但不會觸發轉換。
  3. 評估 H2,並轉換至流程 F。
  4. 流程 F 中的頁面會轉換至 END_FLOW。
  5. 工作階段返回頁面 P,該頁面會再次啟用並保留狀態。
  6. 頁面 P 中的處理常式評估會從保留的狀態繼續,因此會評估 H3。

流程堆疊限制

流程堆疊上限為 25。如果超過堆疊上限,流程可能會從堆疊中彈出,導致使用 END_FLOW 轉換時發生非預期行為。為避免這些潛在問題,請盡量減少 END_FLOW 轉換前的流程轉換次數。

如果流程堆疊為空,END_FLOW 轉換會結束工作階段。

設定條件

如要使用控制台設定條件,請提供條件規則,並選取下列其中一個邏輯選項:

  • 符合至少一項規則 (OR)
  • 符合所有規則 (AND)
  • 自訂運算式

為方便起見,您可以使用 AND/OR 選項,為參數值建立簡單或複合條件。

您可以使用任意形式的「Customize expression」(自訂運算式) 選項,設定所有類型的條件,包括系統函式和布林常數。

舉例來說,如要設定有 10% 機率通過評估的條件,請選取「Customize expression」(自訂運算式) 選項,然後在「Condition」(條件) 欄位中輸入 $sys.func.rand() < 0.1:

設定自訂條件的螢幕截圖