動作與參數

本頁面說明意圖的「動作」和「參數」設定,以及當系統在執行階段比對出相符的意圖時會如何使用這兩項設定。

這項資料的所在位置

建構代理程式時,最常見的做法是使用 Dialogflow ES 主控台 (請參閱說明文件開啟主控台)。以下操作說明重點介紹如何使用主控台。如要存取動作和參數資料:

  1. 前往 Dialogflow ES 主控台
  2. 選取代理程式。
  3. 選取左側欄選單中的 [Intents] (意圖)
  4. 選取一個意圖。
  5. 向下捲動至「Action and parameters」(動作及參數) 區段。

動作和參數欄位的螢幕擷圖

如果您要使用 API (而非主控台) 建構代理程式,請參閱意圖參照的相關說明。API 欄位名稱與主控台欄位名稱類似。下方的操作說明會指出主控台和 API 之間所有的重要差異。

動作

「動作」是一個簡便的欄位,可協助執行您服務中的邏輯。

建構代理程式時,您可以將這個欄位設為任何有幫助的文字。

當 Dialogflow 在執行階段比對出相符的意圖時,就會將動作值提供給執行要求 Webhook 要求,或提供給 API 互動回應。動作值可用來觸發服務中的特定邏輯。

參數

當 Dialogflow 在執行階段比對出相符的意圖時,就會提供從使用者表達內容中擷取到的值做為參數。每個參數都有一個類型,稱為實體類型,此類型會明確指定資料的擷取方式。與原始使用者輸入內容不同,參數是結構化的資料,可輕鬆用於執行某些邏輯或產生回應。

建構代理程式時,您可以在訓練詞組的一些部分中為文字加註,並設定相關聯的參數,藉此控制資料的擷取方式。

以下列出參數設定的欄位,並以「book a room on Tuesday」(預訂星期二的會議室) 這個訓練詞組為例,其中「Tuesday」(星期二) 已加註。

  • 「Required」 (必要):如果意圖需要這項參數才算完整,請勾選這個方塊。請參閱下方的使用必要參數進行運算單元填充一節。
  • 「Parameter Name」 (參數名稱):用於識別參數的名稱,範例:date
  • 「Entity」 (實體):與參數相關聯的實體類型,範例:@sys.date
  • 「Value」 (值):在大多數情況下,這個欄位是設為參數參照,例如 $parameter-name (此參照用來做為執行階段擷取值的預留位置)。但是,此欄位也可用於選取替代值。請參閱下方的參數值和參數參照一節。範例:$date
  • 「Is List」 (是清單):如果值應以清單形式傳回,請勾選這個方塊。請參閱下方的列出參數一節。
  • 「Prompts」 (提示):未提供這項參數時,代理程式會向使用者詢問的問題。只有在已勾選 [Required] (必填) 欄位時才會使用這個欄位。請參閱下方的使用必要參數進行運算單元填充一節。
  • 「Default value」 (預設值):這是使用者未提供參數值時的參數預設值。如要使用主控台變更預設值,請將滑鼠懸停在參數列上,然後按一下右側的選單。

當 Dialogflow 在執行階段比對出相符的意圖時,就會將參數資料提供給執行要求 Webhook 要求,或提供給 API 互動回應。提供參數資料時,Dialogflow 會將其當做參數名稱與參數值之間的對應關係。

建構代理程式時,您的回應可包含參數值。請參閱下方的參數值和參數參照一節。

列出參數

使用主控台建構代理程式時,勾選 [Is List] (是清單) 選項會將參數設為清單形式。清單可以包含多個元素。例如,農產品訂購代理程式可能預期會有以下使用者表達內容:

  • 「I want apples」(我想訂蘋果)
  • 「I want apples and oranges」(我想訂蘋果和柳丁)
  • 「I want apples, oranges, and bananas」(我想訂蘋果、柳丁和香蕉)

使用清單參數加註訓練詞組時,詞組可包含一或多個參數範例,您可以分別為每個參數範例加註:

清單參數註解的螢幕截圖。

在單一訓練詞組中,如果至少有兩個字詞或詞組含有相同的參數,系統就會自動啟用「Is List」選項。如果您停用這個選項,但保留相同的註解,只要您開啟含有此註解的網頁,系統就會再次勾選「Is List」

多語言代理程式中,Is List 選項並非語言特定

參數值和參數參照

參數參照是存放執行階段所擷取之參數值的變數。建構代理程式時,您可以在意圖回應、參數提示和參數「Value」(值) 欄位中使用參數參照。

例如,您可以在意圖回應中使用 $parameter-name。Dialogflow 回應使用者時,會以執行階段擷取的參數值取代參數參照。如要提及使用者先前提供的資訊,這種做法就能派上用場。舉例來說,您的意圖回應看起來可能與以下內容類似:「Okay, I booked a room for you on $date」(好的,我幫您預訂了 $date 的會議室」。

基本參數參照

如要參照由相關聯實體擷取的參數值,請使用下列格式:

$parameter-name

例如,如果參數名稱為 date,則能以 $date 形式參照該參數值。

原始值的參數參照

當系統將文字對應至特定實體時,通常會將其轉換成更方便處理的文字。例如,針對水果實體,系統可能會將使用者表達內容中的「apples」(蘋果) 這個字擷取為「apple」。如要完全按照使用者撰寫或說出內容的方式參照參數值,請使用以下格式:

$parameter-name.original

舉例來說,如果參數名稱為 date,則可使用 $date.original 來參照原始值。

含糊日期的參數參照

當參數與 @sys.date 系統實體相關聯,且使用者提供部分日期 (未指定月份、日期和年份) 時,Dialogflow 會比對最近的未來日期。不過,您也可以擷取這個日期的變化版本。

您可以擷取明確的部分比對結果,在這種情況下,Dialogflow 會使用下列格式將不明部分替換為 U

$parameter-name.partial

您可以使用下列格式,擷取最近的過去日期:

$parameter-name.recent

舉例來說,假設今天是 2021 年 8 月 11 日,您的參數名稱為 date,而使用者說「8 月 13 日」:

參數參照 解析值
$date 2021-08-13
$date.partial UUUU-08-13
$date.recent 2020-08-13

複合式實體的參數參照

複合式實體是包含其他子實體的實體。如要參照參數子實體的值,請使用以下格式:

$parameter-name.sub-entity-name

舉例來說,如果參數名稱為 move,且子實體名稱為 direction,則可使用 $move.direction 來參照子實體值。

已啟用之背景資訊的參數參照

背景資訊可以用於暫時儲存參數值。如要參照從已啟用之背景資訊取得的參數值,請使用以下格式:

#context-name.parameter-name

例如,如果參數名稱為 room,而 reservation 是已啟用的背景資訊,則可使用 #reservation.room 來參照參數值。

事件參數的參數參照

如要參照事件參數,請使用以下格式:

#event-name.parameter-name

例如,如果參數名稱為 duration,事件名稱為 alarm,則可使用 #alarm.duration 來參照參數。

參數值欄位

參數「Value」(值) 欄位中的參數參照具有特殊的重要性,因為此欄位的內容決定 $parameter-name 在意圖回應和參數提示中的解析值。Dialogflow 會以下列順序處理參數資料:

  1. 使用相關聯的實體從使用者表達內容中擷取參數值。
  2. 解析參數「Value」(值) 欄位的內容。
  3. $parameter-name 設為參數「Value」(值) 欄位的解析內容。如果「Value」(值) 欄位未設為 $parameter-name,系統會將 $parameter-name 的值重設為其他值。
  4. 解析意圖回應和參數提示的內容。

以下以「I want to buy a "small" shirt」(我想買一件「S 號」上衣) 這個使用者表達內容為例,提供幾個範例來說明這種順序的影響。

參數參照位置 設定內容 解析內容
參數「Value」(值) 欄位 $size S
意圖回應 您選擇的尺寸:$size 您選擇的尺寸:S
參數參照位置 設定內容 解析內容
參數「Value」(值) 欄位 $size.original S 號
意圖回應 您選擇的尺寸:$size 您選擇的尺寸:S 號
參數參照位置 設定內容 解析內容
參數「Value」(值) 欄位 $size S
意圖回應 您選擇的尺寸:$size.original 您選擇的尺寸:S 號

使用必要參數進行運算單元填充

建構代理程式時,您可以將參數標示為必要。使用者必須為每個必要參數提供資料,意圖才算完整。

必要參數欄位的螢幕擷圖

如果 Dialogflow 代理程式在執行階段比對出相符的意圖,則會繼續向使用者收集資訊,直到使用者為每個必要參數提供資料為止。這個過程稱為「運算單元填充」

除非啟用使用 Webhook 進行運算單元填充功能,否則 Dialogflow 會在向使用者收集到所有必要資料後,才傳送執行要求 Webhook 要求。

Dialogflow 會針對運算單元填充的每個步驟傳送 API 互動回應。每一則運算單元填充回應的意圖和動作都相同,而且系統會提供目前為止收集到的參數。

建構代理程式時,您必須提供提示,讓代理程式使用這些提示來向使用者索取參數資料。您也可以提供提示變化版本,這樣代理程式才不會老是問一樣的問題。

參數提示的螢幕擷圖

舉例來說,假設您服飾店代理程式的意圖包含下列資訊的必要參數:

  • clothing type (服飾類型)
  • quantity (數量)
  • size (尺寸)
  • color (顏色)

以下舉例說明意圖處理完成的對話過程:

使用者:I'd like to buy a t-shirt (我想買 T 恤)
代理程式:How many do you want? (您要買幾件?)
使用者:3 (3 件)
代理程式:What color would you like? (您要什麼顏色的?)
使用者:Black (黑色)
代理程式:What size? (什麼尺寸?)
使用者:Medium (M 號)
代理程式:Got it, that was three black t-shirts in medium (我知道了,三件 M 號的黑色 T 恤)

如果使用者在單一表達內容中針對多項參數提供資料,Dialogflow 會收集使用者提供的資料,並繼續提問以取得缺少的資料。例如,使用者可能會說「I'd like to buy three black t-shirts」(我想買三件黑色 T 恤)。這時,Dialogflow 便會請使用者提供尺寸。

為參數排序

建構代理程式時,您可以為參數排序,決定代理程式提示使用者提供缺少資料的先後順序。

使用主控台建構代理程式時,如將滑鼠懸停在參數上,右側就會顯示重新排序圖示。您可以拖曳這個圖示來變更參數在清單中的位置。

提示中的參數參照

建構代理程式時,您可以在提示中使用參數參照,但必須是順序在提示之前的必要參數之參照。例如,如果 color 參數在 quantity 參數之前,則可以對 quantity 參數使用以下提示:How many $color t-shirts would you like to buy?

取消運算單元填充

使用者說出「Cancel」(取消)、「Stop it」(停止)、「That's enough」(這樣就好了) 等結束詞組時,代理程式會回覆「Okay, canceled」(好的,已取消) 並清除運算單元填充背景資訊。

如果您使用 API,當預留時段填入作業取消時,DetectIntentResponse.queryResult.cancelsSlotFilling 欄位會設為 true。詳情請參閱 Sessions 類型的 detectIntent 說明文件。