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

環境を設定する

Google API を使用する前に、Google Cloud プロジェクトで API を有効にする必要があります。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. [ページ] で [Start Page] を選択します。
    6. [エージェントに問い合わせる] 作成バーに「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. [構成] をクリックして、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. [エージェントまたは環境リソース名] に、Dialogflow CX エージェントを作成するの末尾にコピーした Dialogflow CX エージェント名を貼り付けます。
    8. ドメイン内の特定のユーザーやグループにこの Chat 用アプリの使用を許可し、メールアドレスを入力します。
    9. [ログ] で [エラーを Logging にロギング] を選択します。
  3. [保存] をクリックします。

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

Chat アプリをテストする

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

  1. 信頼できるテスターとして自分自身を追加したときに指定した 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 エージェントがユーザーの自然言語を解釈し、会話の各ステップで独自の自然言語レスポンスを生成する仕組みを理解するのに役立ちます。この会話のサンプルは、旅行: レンタカーというビルド済みエージェントに基づいています。

ダイアログ 説明
エンドユーザー: こんにちは
エージェント: こんにちは。私は仮想レンタカー エージェントです。新しいレンタカー予約をお手伝いいたします。本日はどのようなご用件でしょうか?
  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. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: ラスベガス
エージェント: 承知しました。集荷場所はラスベガスとなります。
エージェント: 降車場所と乗車場所は異なりますか?
  1. エンドユーザー入力により、前の会話ターンでエージェントからリクエストされた pickup_location パラメータに値が入力されます。
  2. デフォルトの開始フローcar_rental.return_different_location インテント ルートが一致している。
  3. [Pickup Location] ページのフォーム補完ルートが評価され、呼び出されます。 フルフィルメント(「集荷の...」)があり、レスポンス キューに追加されます。このレスポンスのパラメータ参照は、エンドユーザーによって指定された実際の値に解決されます。
  4. セッションが [Confirm Location] ページに移行します。
  5. [場所の確認] ページには、エントリのフルフィルメント(「配送先住所が異なる場合は...」)が表示され、レスポンス キューに追加されます。
  6. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: はい。ロサンゼルスで車を返却します。
エージェント: ロサンゼルスで降車となります。
エージェント: 車の受け取り日時をお知らせください。
  1. デフォルトの開始フローcar_rental.return_different_location インテント ルートが一致します。
  2. セッションが [集荷場所] ページに移行します。
  3. エンドユーザー入力は、前の会話ターンでエージェントによって要求された drop_off_location パラメータを満たします。
  4. [Drop Off Location] ページのフォーム補完ルートが評価され、呼び出されます。 これには、レスポンス キューに追加されるフルフィルメント(「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 月 5 日午前 00 時 00 分(太平洋標準時)にラスベガスで車両を受け取り、2024 年 3 月 15 日午前 00 時 00 分(太平洋標準時)にロサンゼルスで返却される予定でよろしいでしょうか?

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

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'
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  }]
}

制限と考慮事項

  • 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 プロジェクトに設定する必要があります。異なる Cloud プロジェクトで Dialogflow と Chat を設定する必要がある場合は、中間サーバーを設定して接続を容易にできます。方法については、GitHub の Dialogflow CX との Chat インテグレーションの例をご覧ください。

トラブルシューティング

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

チャット UI にエラー メッセージが表示されない場合でも、チャットアプリのエラー ロギングがオンになっている場合は、エラーの修正に役立つ説明的なエラー メッセージとログデータが利用できます。エラーの表示、デバッグ、修正については、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 つの方法です。