狀態處理常式

狀態處理常式 (也稱為處理常式) 可用於為使用者建立回應,並/或轉換目前的頁面,以便控制對話。系統會針對每個對話輪次評估處理程序,並可能影響會話。處理常見的資料類型有三種:

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

狀態處理常式分為兩種,分別有不同的處理常式需求:

字詞 定義
路線 當使用者輸入內容符合意圖和/或符合工作階段狀態的某些條件時,系統就會呼叫路由。含有意圖需求的路徑也稱為意圖路徑。只有條件規定的路徑也稱為條件路徑
事件處理常式 在叫用事件時,系統會呼叫事件處理常式。收到非預期的使用者輸入內容,或發生 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. 選取 [刪除]

事件處理常式

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

字詞 定義
事件規定 必須叫用的事件。事件會以名稱識別。當系統收到意外的使用者輸入內容,或發生 webhook 錯誤時,系統會叫用部分內建事件。您也可以定義自訂事件,在對話以外發生事件時叫用。

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

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

流程層級事件處理常式

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

X 項目
處理常式,其範圍包含流程起始頁面的事件需求。
處理常式,其事件需求範圍涵蓋流程中的所有頁面。
處理流程中所有頁面共用的非預期使用者輸入內容。
處理流程中所有頁面共用的 webhook 錯誤。
處理系統叫用的自訂事件,由流程中的所有頁面共用。

每個流程都會為 no-matchno-input 內建事件提供事件處理常式。這些事件處理常式會在您建立流程時自動建立,且無法刪除。

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

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

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

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

網頁層級事件處理常式

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

X 項目
在特定網頁啟用時,事件處理常式會在範圍內設定事件需求。
處理特定網頁的非預期使用者輸入內容。
處理特定網頁的 webhook 錯誤。
處理系統所叫用的自訂事件,具體取決於網頁。

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

  1. 開啟頁面 (不是流程起始頁面)。
  2. 如果沒有「Event handlers」標題,請按一下「Add state handler」,選取「Event handlers」,然後按一下「Apply」
  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. 將滑鼠游標懸停在事件處理常式上,然後按一下刪除 按鈕。

內建事件

下列事件為內建事件,並由 Conversational Agents (Dialogflow CX) 叫用。部分事件只適用於特定層級。

事件名稱
流程層級 頁面層級 參數層級 觸發時機
sys.no-match-default
  • 針對流程頁面層級:使用者輸入內容與範圍內的處理常式不相符。
  • 參數層級:使用者輸入的內容不符合表單參數。
sys.no-match-[1-6] 如果您為上述任何以數字排序的事件提供處理常式,系統會改為呼叫這些處理常式,而非 sys.no-match-default,且會依序呼叫:sys.no-match-1sys.no-match-2、...
sys.no-input-default 未收到使用者輸入內容。可在下列情況下叫用:
  • Conversational Agents (Dialogflow CX) 收到空白的使用者文字輸入內容。
  • Conversational Agents (Dialogflow CX) 收到空的使用者音訊輸入內容,或是輸入內容不含任何可辨識的語音。
  • 在使用者音訊輸入內容中出現任何可辨識的語音之前,就會發生無語音逾時
sys.no-input-[1-6] 如果您為上述任何以數字排序的事件提供處理常式,系統會改為呼叫這些處理常式,而非 sys.no-input-default,且會依序呼叫:sys.no-input-1sys.no-input-2、...
sys.invalid-parameter Webhook 回應WebhookResponse.pageInfo.formInfo.parameterInfo.state 設為 INVALID 而使參數失效時,系統會叫用此方法。
sys.long-utterance 非生成意圖參數比對的使用者輸入內容超過允許的長度上限 (256 個字元)。如未提供,Conversational Agents (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 未經授權403 禁止。只有在原始路徑中沒有設定轉換目標,且透過失敗的 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 叫用事件,請參閱 detectIntent 方法的 queryInput.event 欄位,瞭解 Session 類型。

選取工作階段參照項目的通訊協定和版本:

通訊協定 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 結束目前的流程,並返回導致轉換至目前流程的網頁。另請參閱「Handler 呼叫堆疊和流程堆疊限制」。
END_FLOW_WITH_CANCELLATION 結束目前的流程,並返回導致轉換至目前流程的網頁。呼叫頁面可以使用 flow-cancelled 內建事件處理這項轉換。另請參閱「Handler 呼叫堆疊和流程堆疊限制」。
END_FLOW_WITH_FAILURE 結束目前的流程,並返回導致轉換至目前流程的網頁。呼叫頁面可以使用 flow-failed 內建事件處理這項轉換。另請參閱「Handler 呼叫堆疊和流程堆疊限制」。
END_FLOW_WITH_HUMAN_ESCALATION 結束目前的流程,並返回導致轉換至目前流程的網頁。呼叫頁面可以使用 flow-failed-human-escalation 內建事件處理這項轉換。另請參閱「Handler 呼叫堆疊和流程堆疊限制」。
END_SESSION 清除目前的工作階段,並轉換至名為 END_SESSION 的特殊頁面。下一次使用者輸入內容時,系統會在預設啟動流程起始網頁重新啟動工作階段。
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

設定自訂條件的螢幕截圖