フルフィルメントを作成する(Dialogflow)

フルフィルメントは、アクションでユーザー入力を取得するための会話型インターフェースと、その入力を処理して最終的にアクションを遂行するためのロジックを定義します。

会話を定義する

アクションの定義が完了したら、アクションの定義に対応する会話を作成できます。それには、Dialogflow インテントと対応するフルフィルメントを作成します。インテントは、文法を定義します。つまり、そのインテントをトリガーするために必要なユーザーの呼びかけを定義します。インテントがトリガーされると、対応するフルフィルメントがそれを処理します。

会話全体の文法を定義するために必要な数だけのインテントを作成できます。

インテントを作成する

Dialogflow の左側のナビゲーションの [Intents] (インテント)のメニュー項目で [+] 記号をクリックします。インテント エディタが表示されます。インテント エディタには、次の情報を入力できます。

  • [Intent name](インテントの名前)は IDE に表示されるインテントの名前です。
  • コンテキストを使用すると、インテントのトリガーの範囲を特定のケースに限定できます。 Dialogflow ドキュメントのコンテキストについて読む をご覧ください。
  • [Events](イベント)はユーザーの呼びかけを必要とせずに、インテントをトリガーできます。1 本 サンプル イベントは GOOGLE_ASSISTANT_WELCOME イベントです。これにより、Google アクションを呼び出します。このイベントは、アクションの デフォルトのアクション組み込みヘルパー インテントについて詳しくは、ドキュメントをご覧ください。
  • [Training phrases](トレーニング フレーズ)はインテントをトリガーするために必要なユーザーの呼びかけ(文法)を定義します。インテントをトリガーするユーザーの呼びかけとして、ここにいくつか(5~10 個)のフレーズを入力します。サンプル フレーズを入力すると、Dialogflow はそのフレーズの不自然でないバリエーションを自動的に処理します。
  • [Action and parameters](アクションとパラメータ)は、次の場合にフルフィルメントに渡すデータを定義します。 このインテントではフルフィルメントが有効になっています。これには、データソースから解析された ユーザー入力と名前が表示されます。これを使用して、 トリガーされました。後でこの名前を使用して、インテントを 対応するフルフィルメント ロジックです。アクションとパラメータをご覧ください。 をご覧ください。

  • Responses: Dialogflow Response Builder です。ここで、レスポンス 直接 Dialogflow 内でこのインテントに応答できます。 受け取りますこの機能は、アクセス リクエストを必要としない静的なレスポンスに 受け取りますシンプルなウェルカム メッセージやお別れのメッセージに使用できます。 ただし、ほとんどのケースではフルフィルメントを使用して 作成します。

  • [フルフィルメント] では、フルフィルメントに電話をかけるかどうかを指定します。 呼び出すことができますほとんどのケースでは 作成することもできます。インテントでこのアイテムを表示するには、以下を行う必要があります [Fulfillment] メニューでエージェントのフルフィルメントが有効になっている

Dialogflow でレスポンスを作成する

インテントによっては、フルフィルメントからレスポンスを返す必要がない場合もあります。 この場合、Dialogflow のレスポンス ビルダーを使用して、 できます。

[Responses] 領域で、レスポンスを返すテキスト レスポンスを指定します。 できます。デフォルトのテキスト レスポンスは、さまざまなサービスにわたって機能するシンプルな TTS テキスト レスポンスです。 統合されていますGoogle アシスタントの応答は、 [レスポンス] ページで確認できます。

フルフィルメントでレスポンスを作成する

フルフィルメント コードは、アクションの Webhook フルフィルメント ロジックでホストされます。 たとえば、Silly Name Maker サンプルの場合、 このロジックは、Cloud Functions for Firebase の index.js にあります。

フルフィルメントを使用するインテントがトリガーされると、サービス プロバイダからリクエストを受け取ります。 インテントに関する情報を含む Dialogflow。その後、返信文に インテントを処理してレスポンスを返します。このリクエストと レスポンスは Dialogflow Webhook によって定義されます。

リクエストの処理には、Node.js クライアント ライブラリを使用することを強くおすすめします。 レスポンスが返されます。このクライアント ライブラリを使用する際の一般的なプロセスは次のとおりです。

  1. Dialogflow オブジェクトを初期化します。 このオブジェクトは、リクエストのリッスンと解析を自動的に処理するため、 フルフィルメントで処理できます
  2. リクエストを処理する関数を作成します。 これらの関数は、ユーザー入力とインテントのその他のコンポーネントを処理し、 Dialogflow に戻るレスポンスを作成します。

Dialogflow オブジェクトを初期化する

次のコードは、Dialogflow をインスタンス化し、ボイラープレートを実行します。 Google Cloud Functions 用の Node.js の設定:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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);
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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() 関数を呼び出します。
で確認できます。

次のコードは、1 つのメッセージを処理する 2 つの TTS レスポンスを 呼び出しインテント(input.welcome)とダイアログ インテント(input.number)があります。 アクションでユーザーを歓迎し、ユーザーが話しかけた番号をエコーします。 次の名前の Dialogflow インテントを使用します。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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}`);
});
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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();
}

上記のコードに付随するカスタム インテントの [Input Number] では、 @sys.number エンティティを使用して、ユーザーの発話から数値を抽出します。インテントでは、 ユーザーからの番号を含む num パラメータを 呼び出します。

インテントごとに個別のハンドラを用意する代わりに、フォールバック関数を追加することもできます。フォールバック関数内で、そのフォールバック関数をトリガーしたインテントを確認し、それに応じて適切な処理を行います。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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;
 }
});
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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 がインテントで定義されている入力文法のどれにも一致しない場合 トレーニング フレーズでは、フォールバック インテントがトリガーされます。通常、フォールバック インテント アクションに必要な入力を提供するようユーザーに求めます。Google Chat では プロンプトの [Response] 領域にそのフレーズを指定することで、再プロンプト フレーズを指定できます。 Webhook を使用してレスポンスを提供することもできます。

ユーザーのレスポンスがアクションのトレーニング フレーズと一致しない場合、 アシスタントが入力を処理しようとします。この動作により、ユーザーは簡単に 会話の最中の操作。たとえば、ユーザーが「何の映画が 今週上映してる?」と尋ねることができます。会話の途中でコンテキストを変化させます。 明日の天気は?」この例では「明日の天気は?」という質問が 最初のプロンプトでトリガーされた会話に対する有効な応答ではない アシスタントは一致を自動的に処理し、ユーザーを 会話を適切に行うことができます。

ユーザーの入力に一致する適切なアクションをアシスタントが見つけられない場合は、 アクションのコンテキストに戻ります。

アシスタントは有効な一致なしに応答するためにアクションを中断する可能性があるため ユーザークエリを解決する方法としてフォールバック インテントを使用しないでください。マイページ 有効な入力をユーザーに求めるためにのみフォールバック インテントを使用する必要があります。

フォールバック インテントを作成するには:

  1. Dialogflow のナビゲーション メニューで [Intents] をクリックします。
  2. [Create Intent] の横にある ⋮ をクリックして、 フォールバック インテントを作成する。または、[デフォルトのフォールバック Intent を使用してオブジェクトを編集することができます)。
  3. ユーザーに聞き返す再プロンプト フレーズを指定します。これらのフレーズは会話調にして、できるだけユーザーの現在のコンテキストに即したものにしてください。

    フルフィルメントなしでこれを行うには: [レスポンス] 領域でフレーズを指定します。 渡されます。Dialogflow はこのリストからランダムにフレーズを選択し、読み上げます。 より具体的なインテントがトリガーされるまで、ユーザーに返すメッセージを返します。

    フルフィルメントを使用して作成する場合:

    1. インテントの [Fulfillment] セクションで、[Enable webhook call for this intent] をオンにします。
    2. フルフィルメント ロジックで、他のインテントと同様にフォールバック インテントを処理します。 (リクエストを処理する関数を作成するを参照) 。

    たとえば、次の関数は conv.data オブジェクト( 状態維持に使用できる任意のデータ ペイロード)を ファイルを保存するための Node.js クライアント ライブラリ フォールバック インテントがトリガーされた回数を追跡するカウンタ。これが複数回トリガーされると、アクションが終了します。コードには表示されませんが、フォールバック以外のインテントがトリガーされた場合は、他のインテントでこのカウンタを 0 にリセットする必要があります。( Number Genie サンプル をご覧ください)。

    <ph type="x-smartling-placeholder">
    </ph> <ph type="x-smartling-placeholder">
    </ph>
    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.`);
     }
    });
    をご覧ください。 <ph type="x-smartling-placeholder">
    </ph>
    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 がトリガーするグローバルなフォールバック インテント 一致します。コンテキストを使用する場合、定義されているフォールバック インテントのうちの 1 つだけ必要です。
  • フォールバック インテントに入力コンテキストを設定すると、Dialogflow は次の条件が当てはまる場合にこのフォールバック インテントをトリガーします。

    • ユーザーの現在のコンテキストは、 使用します。
    • 他に一致するインテントがない。

    これにより、それぞれ異なる入力コンテキストが設定された複数のフォールバック インテントを使用して、一致するインテントがない場合の再プロンプトを特定のシナリオに合わせてカスタマイズできます。

  • フォールバック インテントに出力コンテキストを設定すると、フォールバック インテントがトリガーされて処理された後も、ユーザーを同じコンテキストに維持できます。

詳細については、Dialogflow コンテキストをご覧ください。

入力がない場合の再プロンプト

詳細については、再プロンプトのページをご覧ください。 ユーザーが音声デバイスで追加の入力を 継続して操作する必要がある Google Home。