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

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

たとえば、レンタカーの利用者を支援する Chat アプリについて考えてみましょう。ユーザーが「レンタカーを借りたい」と書いたり、Chat アプリは「どこで車両をピックアップしますか?」のような質問で応答します。これにより、レンタカーを予約する際に Chat アプリが人間の音声を理解して応答するという人間のような会話が開始します。

これは一例にすぎません。Dialogflow Chat アプリはあらゆるインタラクションで役立ちます。自然な人間の音声が必要な場合は、Dialogflow Chat アプリが必要になります。ビルド済みエージェントを使用すると、迅速に作業を開始し、Dialogflow ができることを紹介します。

  • フライトを予約
  • 診察を予約する
  • 料理の宅配を注文する
  • 小売商品カタログに関する質問に答える(商品に他の色があるかどうかなど)
  • 事前に構築された Dialogflow エージェントの選択ページ。
    図 1: Dialogflow Chat アプリ用にビルド済みエージェントを選択する
  • Dialogflow CX でエージェントをテストする。
    図 2.Dialogflow CX でエージェントをテストして、エージェントのロジックと構成が意図したとおりに機能することを確認します。この図は、会話の特定のステップ(レンタカーの乗車場所と返却場所の設定など)に関するトピック ページを順番に示し、それらのページを接続するロジックを構成しています。会話はシミュレータでテストされます。
  • Dialogflow チャットアプリを構成する。
    図 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 Webhook を使用して、Dialogflow エージェントはプロジェクト管理システムやチケット発行ツールなどの外部のサードパーティ サービスとやり取りできます。
  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 agent] をクリックします。
    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. [Flow] で [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. [設定] をクリックし、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 アプリをテストする

Google Chat でメッセージを送信して Dialogflow CX 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. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: ラスベガス
エージェント: 了解いたしました。集荷はラスベガスでございます。
エージェント: 下車場所は乗車場所とは異なりますか?
  1. エンドユーザー入力により、前の会話ターンでエージェントによってリクエストされた pickup_location パラメータが設定されます。
  2. car_rental.return_different_locationcar_rental.return_different_location インテント ルートが一致します。
  3. [Pickup Location] ページのフォーム入力ルートが評価され、呼び出されます。これにはフルフィルメント(「Ok, your pickup...」)があり、これはレスポンス キューに追加され、パラメータ参照はエンドユーザーが指定した実際の値に解決されます。
  4. セッションが [Confirm Location] ページに移行します。
  5. [Confirm Location] ページに、入力フルフィルメント(「降車場所は異なるか...」)がある。レスポンス キューに追加されます。
  6. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: はい。私はロサンゼルスに車を降ろします。
エージェント: では、下車場所はロサンゼルスです。
エージェント: 車両の受け取りをご希望の日時を教えていただけますか?
  1. car_rental.return_different_locationcar_rental.return_different_location インテント ルートが一致します。
  2. セッションが [Drop Off Location] ページに移行します。
  3. エンドユーザー入力により、前の会話ターンでエージェントによってリクエストされた drop_off_location パラメータが設定されます。
  4. [持ち込み場所] ページのフォーム入力ルートが評価され、呼び出されます。フルフィルメント(「Ok, your drop off...」)があり、これがレスポンス キューに追加されます。
  5. セッションが [レンタル期間] ページに移行します。
  6. [Rental Duration] ページのフォームの値が不完全であるため、ユーザーに pickup_date_time パラメータ(“What date and time would you like to take up...”)を入力するよう促されます。 レスポンス キューに追加されます。
  7. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: 3 月 5 日の正午に車の受け取りを希望します。
エージェント: ご希望の下車日時はいつですか?
  1. エンドユーザー入力により、前の会話ターンでエージェントによってリクエストされた pickup_date_time パラメータが設定されます。
  2. [Rental Duration] ページにもう 1 つ欠落しているフォーム値があるため、ユーザーに drop_off_date_time パラメータ(「What date and time would you like to take off...」)を入力するよう求めるメッセージが表示されます。 レスポンス キューに追加されます。
  3. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: 3 月 15 日正午。
エージェント: 確認させていただきたいのですが、

車両は 2024-03-05 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] ページには、エントリのフルフィルメント(「Would you like the...」)があります。レスポンス キューに追加されます。
  4. エージェントがレスポンス キューをエンドユーザーに送信します。
エンドユーザー: Cymbal Truck。
エージェント: Cymbal Truck の料金は 1 日あたり $50.33 です。 定員 4 名で、AM/FM ラジオを完備。 支払いに進みますか?
エンドユーザー: はい。
  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-03-05 12:00:00 に Cymbal Car に乗り、2024-03-15 12:00:00 に降車します。このルートの合計は $175.38 になります。
エージェント: 今後ともよろしくお願いいたします。
  1. セッションが [お支払い] ページに移行します。
  2. お支払いフォームが未入力のため、エージェントはユーザーに card_typecard_numberbilling_namebilling_street_addressbilling_zip_code のパラメータ(カードの種類は...)の入力を求めます。これらは順次レスポンス キューに追加され、ユーザーの応答に応じて送信されます。ユーザーのレスポンスで各パラメータ値が設定されます。
  3. セッションが [レンタルの確認] ページに移行します。
  4. [Rental Confirmation] ページに、エントリ フルフィルメント(「Ok, your pickup will...」)がある。レスポンス キューに追加されます。
  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
    • Dialogflow エージェントに送信されるクエリ入力は、Chat メッセージの argumentText フィールドの値に対応しています。メッセージにスラッシュ コマンドが含まれている場合は、代わりに text フィールドの値が使用されます。
    • 各チャット操作イベントの完全な JSON ペイロードが、クエリ パラメータのカスタム ペイロードとして Dialogflow に送信されます。WebhookRequest.payload フィールドの値をクエリすることで、Dialogflow Webhook でアクセスできます。
  • スラッシュ コマンドのサポートは限定的です。
    • ダイアログを開くスラッシュ コマンドは、Dialogflow Chat アプリではサポートされていません。
    • Dialogflow Chat アプリがスラッシュ コマンドを含むメッセージを受信した場合、クエリ入力には text フィールドの値のみが含まれます。text フィールドはスラッシュ コマンドの名前で始まります(例: /command)。これにより、スラッシュ コマンドを検出するように Dialogflow エージェントのインテントを構成できます。
    • Dialogflow エージェントがスラッシュ コマンドのチャット操作イベントの JSON ペイロードを処理する必要がある場合は、Dialogflow Webhook を使用してクエリ パラメータのカスタム ペイロードを検査します。
  • リンク プレビューはサポートされていません。
  • Dialogflow エージェントが 1 つのメッセージのみで応答した場合、そのメッセージは Google Chat に同期して送信されます。Dialogflow エージェントが複数のメッセージで応答した場合、Chat API の spaces.messages リソースの create メソッドをメッセージごとに 1 回呼び出すことで、すべてのメッセージが非同期で 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 チャットアプリを作成する場合は、Dialogflow CX を使用することをおすすめします。
  • Dialogflow ES は、Chat アプリで Dialogflow を使用するもう 1 つの方法です。