自然言語を理解して自然言語で応答する Dialogflow CX Google Chat アプリを構築する

このページでは、Dialogflow を使用して自然言語を理解して応答できる Google Chat アプリを作成する方法について説明します。このガイドでは、Google Chat と直接統合された Dialogflow CX を使用します。また、Dialogflow ES Google Chat ガイドに沿って、Dialogflow ES を使用して Dialogflow ES Google Chat アプリを構築することもできます。

たとえば、レンタカーをサポートする Chat アプリについて考えてみましょう。ユーザーは「車を借りたい」と入力するでしょう。Chat アプリは「どこで車を受け取りますか?」のような質問で応答する場合があります。これにより、ユーザーと人間のような会話が開始されます。Chat アプリは、レンタカーの予約中に人間の発話を理解して応答します。

これは一例にすぎません。Dialogflow Chat アプリはあらゆる種類のやり取りで役立ちます。自然な人間の発話が必要な場合は、Dialogflow Chat アプリが必要です。ビルド済みエージェントを使用すると、すぐに使用を開始でき、Dialogflow の機能を確認できます。たとえば、次のようなものがあります。

  • フライトを予約
  • 診察を予約できます
  • 料理の出前を注文する
  • 他の色のアイテムが購入可能かどうかなど、小売商品カタログに関する質問に回答する
  • ビルド済みの Dialogflow エージェントの選択ページ。
    図 1: Dialogflow Chat アプリ用のビルド済みエージェントの選択
  • Dialogflow CX でエージェントをテストする。
    図 2.Dialogflow CX でエージェントをテストし、エージェントのロジックと構成が意図したとおりに機能することを確認する。この図は、レンタカーの乗車場所と返却場所の設定など、会話の特定の手順に関連する一連のトピックのページを示し、それらをつなぐロジックを構成しています。会話はシミュレータでテストされます。
  • Dialogflow Chat アプリの構成。
    図 3.Google Cloud コンソールの Chat API 構成ページで、Dialogflow CX エージェントを使用してレスポンスを処理するように Chat アプリを構成します。
  • Dialogflow CX Chat アプリのテスト
    図 4.Google Chat の Dialogflow Chat アプリを使用して、レンタカーの予約について会話する。

目標

  • 環境を設定する。
  • Dialogflow CX エージェントを作成してデプロイする。
  • Dialogflow CX エージェントを使用して Chat アプリを作成してデプロイします。
  • Chat アプリをテストします。

前提条件

アーキテクチャ

次の図は、Dialogflow で構築された Chat アプリのアーキテクチャを示しています。

Dialogflow を使用して実装された Chat アプリのアーキテクチャ。

上の図では、Dialogflow Chat アプリを操作するユーザーに次の情報のフローがあります。

  1. ユーザーが、Chat のダイレクト メッセージまたは Chat スペースで、Chat アプリにメッセージを送信します。
  2. Google Cloud にある Dialogflow 仮想エージェントがメッセージを受信して処理し、レスポンスを生成します。
  3. 必要に応じて、Dialogflow エージェントは Dialogflow Webhook を使用して、プロジェクト管理システムやチケット発行ツールなどの外部のサードパーティ サービスを操作できます。
  4. Dialogflow エージェントは、Chat の Chat アプリサービスにレスポンスを返します。
  5. レスポンスが Chat スペースに配信されます。

環境を設定する

Google API を使用する前に、Google Cloud プロジェクトで有効にする必要があります。1 つの Google Cloud プロジェクトで 1 つ以上の API を有効にできます。
  1. Google Cloud コンソールで、Google Chat API と Dialogflow API を有効にします。

    API を有効にする

  2. 正しい Cloud プロジェクトで API を有効にしていることを確認し、[次へ] をクリックします。

  3. 正しい API を有効にしていることを確認し、[有効にする] をクリックします。

Dialogflow CX エージェントを作成する

Dialogflow CX エージェントは、エンドユーザーとの同時会話を処理する仮想エージェントです。これは、人間の言語のニュアンスを理解する自然言語理解モジュールです。Dialogflow はエンドユーザーの会話中のテキストを、アプリやサービスが理解できる構造化データに変換します。システムに必要な種類の会話を処理するように Dialogflow エージェントを設計して作成します。

Dialogflow エージェントは、コールセンターの担当者のようなものです。予想される会話のシナリオに対処できるように、両方ともトレーニングします。トレーニングは、過度に行う必要はありません。

Dialogflow CX エージェントを作成する手順は次のとおりです。

  1. Dialogflow CX コンソールで、Dialogflow CX コンソールを開きます。メニュー アイコン > [Dialogflow CX] をクリックします。

    Dialogflow CX コンソールに移動

  2. Google Cloud プロジェクトを選択します。プロジェクトを見つけるには、[すべて] をクリックして検索する必要があります。

  3. ここで、ビルド済みエージェントを選択するか、独自のエージェントを作成できます。エージェントのカスタマイズを後で詳しく確認する場合は、いずれかのビルド済みエージェントを選択します。これは、エージェントの機能を理解するのにも役立ちます。

    ビルド済みエージェントを選択する手順は次のとおりです。

    1. [Use prebuilt agents] をクリックします。
    2. ビルド済みエージェントを選択します。このガイドでは、[旅行: レンタカー] を選択します。

      エージェントは、使用する機能の数と会話ロジックの洗練度に基づいて、初級、中級、上級のいずれかに分類されます。中間エージェントまたは高度なエージェントを選択するには、Google Cloud コンソールで機能と API を有効にするなど、エージェント固有のカスタマイズと設定が必要になる場合があります。

    3. [エージェントとしてインポート] をクリックします。

    独自のエージェントを作成する手順は次のとおりです。

    1. [Create Agent(エージェントを作成)] をクリックします。
    2. [自動生成] を選択してデータストア エージェントを作成するか、[独自のエージェントを構築する] を選択して他の種類のエージェントを作成します。

    エージェント構築プロセスの詳細なチュートリアルについては、Dialogflow CX エージェントを作成するをご覧ください。

  4. エージェントの基本設定を構成します。

    1. [表示名] に表示名を入力します。
    2. お好みのロケーションをお選びください位置情報の詳細設定を変更する場合は、[編集] をクリックします。
    3. 使用するタイムゾーンを選択します。
    4. エージェントのデフォルト言語を選択します。 エージェントの作成後に、デフォルトの言語を変更することはできません。
  5. [作成] をクリックします。Dialogflow CX がエージェントの作成を開始し、エージェントのデフォルトの起動フローが表示されます。

  6. 必要に応じて、エージェントをカスタマイズします。エージェントのカスタマイズ プロセスの詳細については、Dialogflow CX エージェントを作成するをご覧ください。

  7. エージェントをテストすることをおすすめします。

    1. [Test agent] をクリックします。
    2. [Test agent in environment] を選択します。
    3. [環境] で [ドラフト] を選択します。
    4. フローで、[Default Start Flow] を選択します。
    5. [ページ] で [スタートページ] を選択します。
    6. [Talk to agent] 入力バーに「Hello」と入力して Enter キーを押します。エージェントは自己紹介で応答します。
    7. テスト用の会話のサンプルを使用してテストを完了します。
  8. Dialogflow CX エージェントが作成されます。Dialogflow CX コンソールに戻ります。メニュー アイコン > [Dialogflow CX] をクリックします。

    Dialogflow CX コンソールに移動

  9. [エージェント] で、 > [名前をコピー] をクリックします。Chat アプリの構成時に使用するため、この名前を保存しておきます。

Chat アプリを作成して Dialogflow エージェントに接続する

Dialogflow CX エージェントを作成したら、次の手順で Chat アプリに変換します。

  1. Google Cloud コンソールで、[Google Chat API] に移動します。「Google Chat API」を検索して、[Google Chat API]、[管理] の順にクリックします。

    Chat API に移動

  2. [Configuration] をクリックして、Chat 用アプリを設定します。

    1. [アプリ名] に「Dialogflow App」と入力します。
    2. [アバターの URL] に「https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png」と入力します。
    3. [説明] に「Responds to real human conversation」と入力します。
    4. [機能] で、[1:1 のメッセージを受信する] と [スペースとグループの会話に参加する] を選択します。
    5. [接続設定] で [Dialogflow] を選択します。
    6. [Dialogflow の設定] で [Dialogflow CX] を選択します。
    7. [Agent or Environment resource name] に、Dialogflow CX エージェントを作成するの最後にコピーした Dialogflow CX エージェント名を貼り付けます。
    8. ドメイン内の特定のユーザーやグループにこの Chat 用アプリの使用を許可し、メールアドレスを入力します。
    9. [ログ] で、[エラーを Logging にロギング] を選択します。
  3. [保存] をクリックします。

Chat 用アプリで、Chat でメッセージを受信して応答する準備が整いました。

Chat アプリをテストする

Dialogflow CX Chat アプリを Google Chat でメッセージしてテストします。

  1. 自分自身を Trusted Tester として追加したときに指定した Google Workspace アカウントを使用して Google Chat を開きます。

    Google Chat にアクセス

  2. [ チャットを新規作成] をクリックします。
  3. [1 人以上のユーザーを追加] フィールドに、Chat アプリの名前を入力します。
  4. 結果から Chat 用アプリを選択します。ダイレクト メッセージが開きます。

  5. アプリとの新しいダイレクト メッセージで、「Hello」と入力して enter を押します。

    Dialogflow Chat アプリは自己紹介によって応答します。

  6. サンプルのテスト会話を使用してテストを完了します。

テスト用の会話の例

Dialogflow CX コンソールまたは Google Chat で Dialogflow CX Chat アプリをテストするには、次の会話を行います。この説明は、Dialogflow CX エージェントがユーザーの自然言語を解釈し、会話の各ステップで独自の自然言語レスポンスを生成する仕組みを理解するのに役立ちます。このサンプル会話は、Travel: レンタカーというビルド済みエージェントに基づいています。

ダイアログ 解説
エンドユーザー: お客様
エージェント:仮想レンタカーのエージェントです。新しいレンタカーの予約を開始するお手伝いをします。本日はどのようなご用件でしょうか?
  1. Default Start FlowDefault Welcome Intent ルートが呼び出されます。
  2. この状態ハンドラのフルフィルメント(「Hi!私は...」) レスポンス キューに追加されます。
  3. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: レンタカーを借りたいのですが、
エージェント: ご希望の車両の集荷場所を教えていただけますか?
  1. スタートページcar_rental.reservation_create インテント ルートが一致します。
  2. セッションが [Pickup Location](集荷場所)ページに移行します。
  3. [Pickup Location] ページフォームは未完成であるため、エージェントは pickup_location パラメータを使用してユーザーに「Where would you like to pick up...」のように促します。レスポンス キューに追加されます。
  4. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: Las Vegas
エージェント: お客様の集荷はラスベガスで行われます。
エージェント: 降車場所と乗車場所は異なりますか?
  1. エンドユーザー入力により、前の会話ターンでエージェントからリクエストされた pickup_location パラメータに値が入力されます。
  2. デフォルトの開始フローcar_rental.return_different_location インテント ルートが一致している。
  3. [Pickup Location] ページのフォームの入力ルートが評価され、呼び出されます。これにはフルフィルメント(「OK, your pickup...」)があり、レスポンス キューに追加され、パラメータ参照はエンドユーザーから提供される実際の値に解決されます。
  4. セッションが [Confirm Location] ページに移行します。
  5. [Confirm Location] ページに、エントリ フルフィルメント(降車場所は異なりますか?)が表示されます。レスポンス キューに追加されます。
  6. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: はい。ロサンゼルスに車を降ろします。
エージェント: 到着地はロサンゼルスです。
エージェント: ご希望の車両集荷の日時をお知らせください。
  1. デフォルトの開始フローcar_rental.return_different_location インテント ルートが一致している。
  2. セッションが [持ち込み場所] ページに移行します。
  3. エンドユーザー入力は、前の会話ターンでエージェントによって要求された drop_off_location パラメータに値を設定します。
  4. [持ち込み場所] ページのフォームの入力ルートが評価され、呼び出されます。これには、レスポンス キューに追加されるフルフィルメント(「OK, yourdrop off...」)が含まれています。
  5. セッションが [レンタル期間] ページに移動します。
  6. [Rental Duration](レンタル期間)ページのフォーム値が不完全であるため、pickup_date_time パラメータ(「What date and time would you like topickup...」など)の入力を求められます。レスポンス キューに追加されます。
  7. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: 3 月 5 日の正午に車を受け取りたいのですが、
エージェント: 車両をお預かりする日時をお知らせください。
  1. エンドユーザー入力により、前の会話ターンでエージェントによってリクエストされた pickup_date_time パラメータが設定されます。
  2. [レンタル期間] ページに、フォーム値がもう 1 つ欠落しているため、drop_off_date_time パラメータ(「返却する日時を指定してください」など)をユーザーに求めます。 レスポンス キューに追加されます。
  3. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: 3 月 15 日正午。
エージェント: 確認させていただきます。

ラスベガスで車両を預け、2024 年 3 月 15 日 12:00:00 にラスベガスで降車されますか? 2024-03-15 12:00:00

よろしいですか?
  1. エンドユーザー入力は、前の会話ターンでエージェントによって要求された drop_off_date_time パラメータに値を設定します。
  2. [レンタル期間を確認] ページに移行します。
  3. [Confirm Rental Duration](レンタル期間を確認する)ページに、エントリのフルフィルメント(たとえば「So to Confirm...」)が表示される。 レスポンス キューに追加されます。
  4. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: はい、ありがとうございます。
エージェント: ありがとうございます。では、車を選びます。
エージェント: エコノミー車と高級車、どちらをご希望ですか?
  1. [Confirm Rental Duration] ページの small_talk.confirmation.yes インテント ルートが一致しています。
  2. エージェントは、ユーザーの選択をメッセージで確認します(「ありがとうございます。今度は...」など)、 レスポンス キューに追加されます。
  3. セッションが [Vehicle Disambiguation] ページに移動します。
  4. [Vehicle Disambiguation] ページのフォームが未完成であるため、エージェントは vehicle_type パラメータを使用してユーザーにプロンプト(「エコノミーとラグジュアリーはいかがですか...」)、レスポンス キューに追加されます。
  5. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: エコノミー クラスを利用してください。
エージェント: Cymbal Car と Cymbal Truck のどちらをご希望ですか?
  1. $session.params.vehicle_type="economy_vehicle" インテント ルートが一致する。
  2. セッションが [エコノミー オプション] ページに移動します。
  3. [Economy Options] ページには、エントリのフルフィルメント(例: 「...」)が表示されます。レスポンス キューに追加されます。
  4. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: Cymbal Truck。
エージェント: Cymbal Truck は 1 日あたり $50.33 です。AM/FM ラジオが付属しており、4 名まで収容可能。 支払いに進みますか?
エンドユーザー: はい。
  1. $session.params.vehicle_type="Cymbal Truck" インテント ルートが一致し、vehicle_model パラメータが入力されています。
  2. セッションが [Cymbal Truck の確認] ページに移行します。
  3. [Confirm Cymbal Truck] ページに、エントリ フルフィルメント(Cymbal Truck は 1 日あたり $50.33)があります。レスポンス キューに追加されます。
  4. エージェントがレスポンス キューをエンドユーザーに送信します。
  5. ユーザーのレスポンスが small_talk.confirmation.yes ルートと一致します。
エージェント: どのカードをお使いですか?
エンドユーザー: Altostrat
エージェント: カード番号を入力してください。
エンドユーザー: 1234 1234 1234 1234
エージェント: カードに記載されているお名前を教えてください。
エンドユーザー: Charlie
エージェント: 請求先住所を教えてください。
エンドユーザー: 1800 Amphibious Blvd. Mountain View, CA
エージェント: 請求先の郵便番号を教えてください。
エンドユーザー: 94045
エージェント: 2024 年 3 月 5 日 12:00:00 にラスベガスで Cymbal Car を集荷し、2024 年 3 月 15 日 12:00:00 に降車します。このルートの合計は $175.38 になります。
エージェント: レンタルをご利用いただきありがとうございます。今後ともよろしくお願いいたします。
  1. セッションは [お支払い] ページに移動します。
  2. Payment フォームが不完全であるため、エージェントはユーザーに card_typecard_numberbilling_namebilling_street_addressbilling_zip_code の各パラメータ(「What card type will...」など)の入力を求めます。レスポンス キューに順次追加され、ユーザーの応答として送信されます。ユーザーのレスポンスによって各パラメータ値が設定されます。
  3. セッションが [Rental Confirmation] ページに移行します。
  4. [Rental Confirmation] ページに、エントリのフルフィルメント(例: 「承知いたしました。受け取りは...」)が表示されます。レスポンス キューに追加されます。
  5. エージェントがレスポンス キューをエンドユーザーに送信します。
  6. セッションが [End Session](セッションの終了)ページに移動します。

Dialogflow からカード メッセージを送信する

Dialogflow はテキストまたはカード メッセージで応答できます。カード メッセージで応答するには、フルフィルメントでそれをカスタム ペイロードとして指定します。

次の JSON は、フルフィルメントでカード メッセージをカスタム ペイロードとして送信する方法を示しています。

json

{
  'cardsV2': [{
    'cardId': 'createCardMessage',
    'card': {
      'header': {
        'title': 'A card message!',
        'subtitle': 'Sent from Dialogflow',
        'imageUrl': 'https://developers.google.com/chat/images/chat-product-icon.png',
        'imageType': 'CIRCLE'
      },
      'sections': [
        {
          'widgets': [
            {
              'buttonList': {
                'buttons': [
                  {
                    'text': 'Read the docs!',
                    'onClick': {
                      'openLink': {
                        'url': 'https://developers.google.com/workspace/chat'
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  }]
}

制限事項と考慮事項

  • チャット インタラクション イベントについては、サポートが限定的であり、次の点も考慮する必要があります。
    • 次のインタラクション イベントタイプがサポートされています。
      • MESSAGE
      • ADDED_TO_SPACE
      • CARD_CLICKED
    • MESSAGE イベントまたは ADDED_TO_SPACE イベントの場合、Dialogflow エージェントに送信されるクエリ入力は、Chat メッセージの argumentText フィールドの値に対応します。メッセージにスラッシュ コマンドが含まれている場合は、代わりに text フィールドの値が使用されます。
    • CARD_CLICKED イベントの場合、Dialogflow エージェントに送信されるクエリ入力は CARD_CLICKED.functionName としてフォーマットされます。ここで、functionName は、インタラクティブなカード要素(ボタンなど)にアタッチされた Action オブジェクトの function フィールドの値に対応します。
    • 各チャット インタラクション イベントの完全な JSON ペイロードは、クエリ パラメータのカスタム ペイロードとして Dialogflow に送信されます。Dialogflow WebhookWebhookRequest.payload フィールドの値をクエリしてアクセスできます。
  • スラッシュ コマンドへの応答と、カードまたはダイアログからのデータの受信に関する考慮事項:
    • Dialogflow Chat アプリがスラッシュ コマンドを含むメッセージを受信すると、クエリ入力には text フィールドの値のみが含まれます。text フィールドはスラッシュ コマンドの名前(/command など)で始まります。これを使用して、スラッシュ コマンドを検出するように Dialogflow エージェントのインテントを構成できます。
    • Dialogflow エージェントが Chat 操作イベントの JSON ペイロードを処理する必要がある場合は、Dialogflow Webhook を使用してクエリ パラメータのカスタム ペイロードを検査します。
    • Dialogflow エージェントからダイアログを表示するには、DIALOG アクション レスポンスを含むメッセージを含む単一のカスタム JSON ペイロードで応答します。
    • カードから入力されたデータを処理するため、Dialogflow エージェントは、テキスト CARD_CLICKED で始まるインテントを検出し、適切なアクションを含む単一のカスタム JSON ペイロードで応答できます。
  • リンク プレビューはサポートされていません。
  • Dialogflow エージェントが 1 つのメッセージのみで応答した場合、メッセージは同期的に Google Chat に送信されます。Dialogflow エージェントが複数のメッセージで応答した場合、Chat API の spaces.messages リソースに対する create メソッドをメッセージごとに 1 回呼び出すことで、すべてのメッセージが Chat に非同期的に送信されます。
  • Dialogflow CX と Chat の統合を使用する場合、Dialogflow エージェントと Chat アプリを同じ Google Cloud プロジェクトで設定する必要があります。Dialogflow と Chat を異なる Cloud プロジェクトで設定する必要がある場合は、接続を容易にするために中間サーバーを設定できます。方法については、GitHub の Dialogflow CX との Chat インテグレーションの例をご覧ください。

トラブルシューティング

Google Chat アプリまたはカードがエラーを返すと、Chat インターフェースに「エラーが発生しました」というメッセージが表示されます。または「リクエストを処理できません」が表示されます。Chat UI にエラー メッセージが表示されなくても、Chat アプリやカードが予期しない結果(カード メッセージが表示されないなど)を生成することがあります。

Chat UI にエラー メッセージが表示されない場合がありますが、Chat 用アプリのエラーロギングが有効になっている場合は、説明的なエラー メッセージとログデータを使用してエラーを修正できます。エラーの表示、デバッグ、修正については、Google Chat のエラーのトラブルシューティングと修正をご覧ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、Cloud プロジェクトを削除することをおすすめします。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。メニュー アイコン > [IAM と管理] > [リソースの管理] をクリックします。

    Resource Manager に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  • Dialogflow CX は、Dialogflow エージェントの設計にステートマシン アプローチを採用しています。これにより、会話を明確かつ明示的に制御し、エンドユーザー エクスペリエンスを改善し、開発ワークフローを改善できます。Dialogflow Chat アプリを作成する場合は、Dialogflow CX を使用することをおすすめします。
  • Dialogflow ES は、Chat アプリで Dialogflow を使用するもう 1 つの方法です。