狀態處理常式

狀態處理常式 (也簡稱處理常式) 可生成使用者回覆,以及/或是轉換目前頁面,藉此控管對話。系統會評估每個對話回合的處理常式,並可能影響工作階段。處理常式有三種一般資料類型:

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

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

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

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

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

範圍

如要評估處理常式,該常式必須在範圍內。處理常式範圍是重要且強大的工具,可協助你控管對話。您可以控制處理常式的範圍,藉此控制:

X 項目
意圖可比對成功時
應檢查條件的時機
可處理特定事件時
頁面轉換的時機
提供靜態完成回應時
為動態回應呼叫啟用 Webhook 的執行要求時

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

詳細範圍規則如下:

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

路由

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

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

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

X 項目
當使用者輸入內容符合意圖時,系統應觸發靜態完成回應。
如果使用者輸入內容與意圖相符,系統應觸發啟用 Webhook 的執行要求,以提供動態回應。
當使用者輸入的內容提供最終必要表單參數時,條件檢查會觸發工作階段轉換至其他頁面。
當使用者輸入內容提供特定表單參數時,條件檢查會觸發靜態完成回應。
設為 true 的條件檢查,會強制頁面轉換。

意圖傳播

一般來說,如果意圖比對成功而呼叫路由,意圖就會遭到耗用。除非新的使用者輸入內容觸發新的意圖比對,否則已使用的意圖無法再次比對。不過,在下列情況下,您可以將意圖比對結果從一個流程傳播到另一個流程:

  • flow F1 中的路徑必須包含 intent I1,且 flow F2 為轉換目標。
  • Flow F2 的路徑也將 intent I1 視為必要條件。

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

傳播意圖有助於:

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

路由群組

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

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

流程層級路徑群組

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

代理層級路由群組

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

流程層級路徑

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

X 項目
處理常式具有意圖或條件需求,且位於流程開始頁面的範圍內。
處理常式在流程中所有頁面的範圍內都有意圖需求。

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

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

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

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

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

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

網頁層級路徑

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

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

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

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

如要從主控台重新排序網頁層級路徑,請按照下列步驟操作:

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

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

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

事件處理常式

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

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

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

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

流程層級事件處理常式

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

X 項目
處理常式必須符合流程開始頁面的事件規定。
處理常式,且流程中所有頁面的事件需求都在範圍內。
處理非預期的使用者輸入內容, 流程中的所有頁面都會共用。
處理所有流程頁面共用的 Webhook 錯誤。
處理系統叫用的自訂事件,這些事件會由流程中的所有網頁共用。

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

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

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

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

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

網頁層級事件處理常式

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

X 項目
在特定頁面處於有效範圍時,處理常式會符合事件需求。
處理特定網頁的非預期使用者輸入內容。
處理網頁專屬的 Webhook 錯誤。
處理系統叫用的自訂事件,特定於某個網頁。

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

  1. 開啟頁面 (不是流程開始頁面)。
  2. 如果沒有「事件處理常式」標題,請點選「新增狀態處理常式」,選取「事件處理常式」,然後點選「套用」。
  3. 按一下「事件處理常式」標題中的「新增」按鈕。
  4. 事件處理常式面板隨即開啟。
  5. 提供事件處理常式欄位。
  6. 按一下 [儲存]。

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

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

參數層級的事件處理常式

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

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

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

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

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

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

  1. 開啟含有表單參數的網頁。
  2. 按一下參數。
  3. 參數面板隨即開啟。
  4. 向下捲動至「Reprompt event handlers」部分。
  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」頁面觸發,請參閱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. 系統只會評估 scope 中的處理常式。
  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」的特殊頁面。使用者下次輸入內容時,系統會從「Default Start Flow」的起始頁面重新啟動工作階段。
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 選項,為參數值建立簡單或複合條件。

您可以針對所有類型的條件使用「自訂運算式」選項,包括系統函式和布林常數。

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

設定自訂條件的螢幕截圖