狀態處理常式

狀態處理常式 (也簡稱處理常式) 可用來控制對話,方法是為使用者建立回應,和/或轉換目前頁面。系統會評估每個對話回合的處理常式,並可能影響工作階段。處理常式有三種一般資料類型:

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

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

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

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

字詞 定義
1. 範圍 處理常式必須在範圍內,才能對工作階段產生任何影響。範圍取決於處理常式是否套用至流程、頁面或表單參數,以及相關聯的流程是否處於啟用狀態、相關聯的頁面是否處於啟用狀態,或是服務專員目前是否嘗試填寫相關聯的表單參數。
2. 評估 系統會依序評估範圍內的每個處理常式。如果處理常式符合規定,就會通過評估。
3. 撥打電話 如果處理常式在範圍內並通過評估,系統就會呼叫該處理常式。系統會呼叫任何相關聯的完成動作,並將任何相關聯的轉換目標套用至工作階段。

範圍

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

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

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

詳細範圍規則如下:

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

路徑

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

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

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

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

意圖傳播

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

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

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

傳播意圖有助於:

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

路徑群組

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

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

流程層級路徑群組

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

專員層級路徑群組

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

流程層級路徑

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

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-matchno-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 event handlers」(重新提示事件處理常式) 部分,然後點選「Add event handler」(新增事件處理常式)
  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-defaultsys.no-match-1sys.no-match-2...
sys.no-input-default 系統未收到使用者輸入內容。在下列情況下,系統可能會叫用這項功能:
  • Dialogflow CX 收到空白的使用者文字輸入內容。
  • Dialogflow CX 收到空白的使用者音訊輸入內容,或輸入內容不含任何可辨識的語音。
  • 在使用者音訊輸入內容包含任何可辨識的語音之前,發生無語音逾時
sys.no-input-[1-6] 如果您為任何這些依序編號的事件提供處理常式,系統會依序叫用這些處理常式,而非 sys.no-input-defaultsys.no-input-1sys.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 Unauthorized403 Forbidden。只有在呼叫失敗 Webhook 的原始路徑中未設定轉移目標時,才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
webhook.error.unavailable Webhook 傳回 503 Service Unavailable。只有在呼叫失敗 Webhook 的原始路徑中未設定轉移目標時,才會叫用 Webhook 事件。詳情請參閱「評估順序」一節。
webhook.error.not-found Webhook URL 無法連線,因此 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
Ruby 不適用 不適用

評估順序

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

  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 有三個處理常式,順序如下:H1H2H3
  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

設定自訂條件的螢幕截圖