建構執行要求 (Dialogflow)

「執行要求」定義了對話式介面,以便您取得「動作」 處理輸入內容並最終完成要求的邏輯 動作。

定義對話

現在您已定義動作,接下來就可以建立 這些動作對應的對話做法是 建立定義文法或使用者需求的 Dialogflow 意圖 例如觸發意圖和對應的執行要求 和調性

您可以建立數量不限的意圖,藉此定義整個對話的 文法

建立意圖

在 Dialogflow 的「Intents」(意圖) 選單項目旁按一下「+」符號 點選左側導覽區您可在隨即顯示的意圖編輯器中輸入下列資訊:

  • 意圖名稱是 IDE 中顯示的意圖名稱。
  • 背景資訊可讓您將意圖觸發條件的範圍限制在特定情況下。 參閱結構定義的 Dialogflow 說明文件 瞭解詳情
  • 「事件」會觸發意圖,使用者無需說任何內容,一 範例事件是 GOOGLE_ASSISTANT_WELCOME 事件,會在這個事件中允許 Google 讓 Google 助理叫用你的動作。這個事件會用於動作的 default Action。 如要進一步瞭解內建輔助意圖,請參閱說明文件。
  • 訓練詞組定義了使用者觸發時必須說的內容 (文法) 意圖。在這裡輸入一些使用者可觸發的詞組 (5 到 10 個) 意圖。Dialogflow 會自動處理範例的自然變化 提供的詞組。
  • 動作和參數會定義要傳遞給執行要求的資料 (如果有的話) 此意圖的執行要求已啟用。這包含剖析 您可以在執行要求中使用這類使用者輸入內容 已觸發意圖稍後您將使用這個名稱,將您的意圖對應至其 對應的執行要求邏輯請參閱「動作和參數」 ,進一步瞭解如何定義動作。

  • Responses 是 Dialogflow 回應建構工具,您可以在其中定義 直接在 Dialogflow 中回應此意圖,無須呼叫 執行要求這個功能對於不需要的靜態回應非常有用 執行要求您可以利用此方式簡單歡迎歡迎訊息,或說再見。 不過,您可能會使用執行要求來回應使用者 意圖。

  • 「Fulfillment」(執行要求) 會指定您是否要呼叫執行要求 並在觸發此意圖時觸發您很可能需要為大多數 建立意圖如要在意圖中查看這個項目,您必須 已在「Fulfillment」選單中為代理程式啟用執行要求。

在 Dialogflow 中建構回應

對於某些意圖,您可能不需要讓執行要求傳回回應。 在這種情況下,您可以使用 Dialogflow 中的回應建構工具來建立 回應。

在「Responses」區域中,提供要傳回的文字回應。 使用者。預設文字回覆是簡單的文字轉語音文字回應,適用於 以及多項 Dialogflow 整合會提供「Google 助理」的回覆 的值。

建構執行要求回應

執行要求程式碼是由動作的 Webhook 執行邏輯代管。 例如,在Silly Name Maker 範例中, 您可以在 index.js 中找到 Cloud Function for Firebase 的這個邏輯。

使用執行要求觸發意圖時,您會收到 內含意圖相關資訊的 Dialogflow。接著您回應 來處理意圖並傳回回應。這個要求和 回應是由 Dialogflow Webhook 定義。

強烈建議您使用 Node.js 用戶端程式庫處理要求 並傳回回應以下是使用用戶端程式庫的一般流程:

  1. 初始化 Dialogflow 物件。 這個物件會自動處理監聽要求並加以剖析, 方便你處理。
  2. 建立函式來處理要求。 這些函式會處理使用者輸入內容和意圖的其他元件 建構回應以傳回 Dialogflow

Dialogflow 物件初始化

下列程式碼會將 Dialogflow 執行個體化,並進行一些樣板作業 Google Cloud Functions 的 Node.js 設定:

Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
敬上
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }
敬上

建立函式來處理要求

當使用者說出可觸發意圖的詞組時,你會收到來自 您在執行要求中使用函式處理的 Dialogflow。在本 函式,通常會執行以下作業:

  1. 執行處理使用者輸入內容所需的任何邏輯。
  2. 建立回應來回應觸發的意圖。請考量 使用者會用來建構適當的回應。詳情請見 介面功能 進一步瞭解如何為不同途徑提供回應。
  3. 使用您的回應呼叫 ask() 函式。
,瞭解如何調查及移除這項存取權。

以下程式碼說明如何建立兩個 TTS 回應,以處理 叫用意圖 (input.welcome) 和對話方塊意圖 (input.number) 歡迎使用者接受您的 Action,並響應使用者聽到的數字 一個名為:

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
敬上
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

和上述程式碼隨附的自訂意圖「輸入號碼」會使用 @sys.number 實體,從使用者語音擷取數字。接著意圖 將 num 參數 (內含使用者數字) 傳送到 函式。

您不必為每個意圖分別建立個別處理常式, 備用函式在備用函式中,檢查觸發的意圖 並做出相應處理

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
敬上
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

不相符的問題重新提示

當 Dialogflow 無法與意圖中定義的任何輸入文法相符時 訓練詞組:觸發備用意圖。通常備用意圖 重新提示使用者,為您的動作提供必要的輸入內容。你可以 您可以在 替代意圖,也可以使用 Webhook 提供回應。

如果使用者回覆與動作的訓練詞組不符,Google Google 助理會嘗試處理輸入內容。這項行為可協助使用者改變 對話中間的動作。舉例來說,有使用者詢問「什麼是電影?」 嗎?」接著在對話中調整情境:「什麼是 明天天氣如何?」在這個範例中,因為「明天天氣如何?」 並非針對初始提示觸發的對話有效回覆, Google 助理會自動嘗試處理比對,並將使用者移至 適當的對話。

如果 Google 助理找不到符合使用者輸入內容的適當動作, 即可將使用者返回動作情境

因為 Google 助理可能會中斷你的動作,以回應有效的不相符項目 情境中,請勿使用備用意圖做為執行使用者查詢的方式。個人中心 只能利用備用意圖,透過有效的輸入機制重新提示使用者。

如何建立備用意圖:

  1. 按一下 Dialogflow 導覽選單中的「Intents」(意圖)
  2. 點選「建立意圖」旁的 ⋮ 圖示,然後選取 建立備用意圖。(您也可以按一下 [預設備用], Intent,來編輯該意圖)。
  3. 指定自我提示詞組,以便回應使用者。這些詞組應該是 對話,盡可能提供使用者目前情境的實用服務。

    如要在沒有執行要求的情況下執行這項操作:請在「Response」區域中指定詞組 意圖Dialogflow 會從清單中隨機選擇詞組來說話 直到觸發更具體的意圖為止

    如何使用執行要求執行這項操作

    1. 在意圖的「Fulfillment」(執行要求) 部分,切換「Enable Webhook call for this intent」(為這個意圖啟用 Webhook 呼叫)
    2. 在執行要求邏輯中,處理備用意圖和處理其他任何意圖 如建立用於處理要求的函式一文所述 專區。

    舉例來說,下列函式使用 conv.data 物件 ( 任意資料酬載 Node.js 用戶端程式庫: 來追蹤備用意圖的觸發次數。如果是 如果多次觸發,動作就會退出。雖然不會顯示在 程式碼,您應讓其他意圖將這個計數器重設為 0 觸發非備用意圖時(請參閱 Number Genie 範例 )。

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    敬上
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

使用情境

如果希望 Dialogflow 只在特定情況下觸發備用意圖,請使用情境 情境。假如您想為各個群組設定不同的備用意圖 不同的不相符情境

  • 如果您未設定備用意圖的背景資訊,系統會視為 在沒有其他意圖的情況下,Dialogflow 會觸發的全域備用意圖 比對成功。如果選擇使用,您只能定義其中一個。
  • 如果您為備用意圖設定輸入背景資訊,Dialogflow 會觸發此情況 以下為 true 時的備用意圖:

    • 使用者目前的結構定義是 意圖。
    • 沒有其他相符的意圖。

    如此一來,您就能在不同輸入背景資訊中使用多個備用意圖, 針對特定情況自訂不相符提示訊息的功能

  • 如果您為備用意圖設定了輸出背景資訊,使用者會留在 相同的背景資訊。

詳情請參閱 Dialogflow 情境

無輸入重新提示

如要進一步瞭解做法,請參閱「重新提示」頁面 當使用者沒有透過語音裝置進一步輸入 (例如 需要持續互動的 Google Home。