Amazon Web Services ブログ

AWS Amplify を使用して AWS と対話する会話型 AI アプリケーションを構築する

会話型アプリケーションの開発には、認証ワークフロー、API インターフェース、データ管理、ビジネスロジックを実現するインテントなど、複数の複雑なコンポーネントが含まれます。これらの要素を適切に統合し、セットアップすることは、特に会話型アプリケーションを構築するのが初めての開発者や、AWS サービスでの豊富な経験がない開発者にとっては、難易度が髙いです。

この記事では、AWS Amplify のパワーの活用と Amazon Lex のシームレスな統合によって会話型アプリケーションを構築する方法を紹介します。この記事では、認証ワークフロー、API インターフェース、データ管理、ビジネスロジックを実現するインテントなどの重要なバックエンドコンポーネントの確立に焦点を当て、会話型アプリケーションをシームレスに構築するための実用的なソリューションを提供します。

ソリューションの概要

このソリューションは、ユーザーが自然言語のクエリや発話を使用して AWS のサービスと対話できるようにする高度な仮想アシスタントアプリケーションのデモを行います。この仮想アシスタントは自然言語理解(NLU)のために Lex を利用し、強力な会話 AI として振る舞います。

仮想アシスタントに簡単なクエリを送信することで、AWS アカウント内のタスクを自動化することができます。Amplify の幅広いツールとサービスのセットを使用することで、仮想アシスタントのコア機能に集中しながら、簡単に堅牢なフルスタックの Web アプリケーションを作成することができます。

図1: アプリケーションアーキテクチャ

このソリューションは、以下のコンポーネントで構成されています(図1):

  1. React フレームワーク: React のコンポーネントベースのアーキテクチャは、UI 要素の作成を簡素化し、開発者が仮想アシスタントのインターフェースのために再利用可能でモジュール化されたコンポーネントを構築することを可能にします。状態を管理する機能により、アシスタントとのインタラクション中にシームレスなユーザー体験を保証します。
  2. Amplify: Amplifyは、開発プロセスを効率化する一連のツールとサービスを提供し、開発者が認証や API といった AWS の必須サービスにフロントエンドを迅速につなぎこめるようにします。これにより、ユーザー管理やデータアクセス制御などの機能の実装が簡素化されます。
  3. AWS AppSyncAWS AppSync は GraphQL API 開発を簡素化し、バックエンドに問い合わせるための単一のエンドポイントを提供します。これにより、仮想アシスタントはバックエンドのサービスとセキュアにやり取りを行うことができ、会話の管理や、ユーザーのセッションデータと応答を効率的に取得することができます。
  4. Amazon DynamoDB: DynamoDB は、仮想アシスタントのバックエンドにスケーラブルで柔軟なデータストレージソリューションを提供します。DynamoDB は、効率的なデータ検索と永続化を可能にし、ユーザーとのやり取りを後で使用するために確実に保存し、シームレスな会話履歴の実装を容易にします。
  5. Amazon Lex: Lex を使用すると、開発者は、インテント、スロット、およびサンプル発話を定義することによって、カスタム会話インターフェースを作成することができます。これにより、仮想アシスタントはユーザーのクエリを理解し、それを特定のインテントにマッピングすることができ、ユーザーのリクエストに応え、AWS のタスクを自動化することができるようになります。
  6. AWS LambdaAWS Lambda は、Lex によって検出されたユーザークエリに基づいてアクションを実行し、インテントを充足させるロジックを処理します。ユーザーのリクエストに応じてバックエンドロジックをスケーラブルに実行できます。仮想アシスタントがユーザーに代わって様々な AWS サービスとやりとりし、AWS のオペレーションを効率的に自動化することができます。

オープンソースのコードとデプロイ手順はこの GitHub リポジトリにあります。このソリューションでは、以下のような簡単なクエリ/発話を送信することで、AWS アカウントの様々なワークフローや操作を自動化することができます。

  • t3 microで 2 台の Red Hat インスタンスを起動
  • すべての Red Hat インスタンスを検索
  • パブリックサブネットにデプロイされたインスタンスの有無の確認
  • ワイドオープンなセキュリティグループルールの有無の確認
  • 10.11.12.13 からのトラフィックを許可するようにセキュリティグループのルールの変更
  • S3 バケットのリストアップ
  • バケット XYZ で “ppt ” の検索

自然言語を使用することは、様々な AWS のサービスを操作する必要がある非技術者の AWS ユーザーが AWS を簡単に利用できるようにします。彼らは、コマンドラインインタフェース(CLI)ツールやソフトウェア開発キット(SDK)の専門的な知識に精通していない可能性があります。

さらに重要な点として、このアプリケーションはアシスタントを搭載した色々な種類の Web アプリケーションを Amplify を活用して構築するためのガイドとしても使用することができます。

図2:ユーザーがアシスタントにクエリを送信しているアプリケーションのスクリーンショット

ソリューションのコンポーネント

このソリューションは、AWS サービスと相互に作用する強力なバーチャル・アシスタントを形成するいくつかの主要コンポーネントで構成されている。以下はコンポーネントとその利点です。

フロントエンド

フロントエンドはインタラクティブな会話型ウェブアプリケーションの重要なコンポーネントです。私たちは create-react-app Node パッケージを使用してプロジェクトの構造をセットアップし、最新の JavaScript で開発環境を準備します。メインの App コンポーネントは App.js に含まれており、関連する React コンポーネントをインポートし、Amplify バックエンドを設定します。App コンポーネントは基本的な React ルーターで構成され、他の React コンポーネントへの主要なルートがいくつかあります:

  • Conversations コンポーネント: このコンポーネントは、現在のユーザーとアシスタントの会話を一覧表示し、ユーザーが新しい会話を作成したり、既存の会話を削除したりできるようにします。Material UI カードが各会話を表し、会話の説明といくつかのアクションボタンを含んでいます。
  • Interact コンポーネント: このコンポーネントは、特定のユーザーの会話をハイライトし、ユーザーが会話の履歴を表示したり、アシスタントに新しいクエリ/発話を送信することを可能にします。また、このコンポーネントは、テキスト、アラート、表、またはその他の形式のものを、アシスタントから受信して表示します(図2)。

バックエンド – 認証

Amplify を使用して Amazon Cognito ユーザープールを作成します。ユーザープールはフルマネージドなユーザーディレクトリとして機能し、ユーザー登録、認証、アカウントの回復、およびその他の操作をすぐに処理します。アプリケーションに認証を追加するには、“amplify add auth” コマンドを使用し、App コンポーネントのエクスポートを “withAuthenticator” コンポーネントでラップするだけです。詳しくはこちらを参照してください。

バックエンド – GraphQL API

AppSync と DynamoDB による GraphQL API は、アプリケーションのフロントエンドとバックエンド間の効率的なデータ管理とコミュニケーションを可能にします。また、ユーザーは以前の会話を再開したり、アシスタントから返された以前の回答/データを取得したりできるようにする必要があります。これらの機能を実現するために、Amplify を使用して DynamoDB テーブルでバックアップされた AppSync GraphQL API を作成します。必要なのは、“amplify add api” コマンドを実行し、GraphQL スキーマを定義することだけです。デプロイされると、Amplify は自動的にスキーマを完全に機能する GraphQL API に変換します。

図3:GraphQL APIスキーマ

GraphQL スキーマ – モデル

API はユーザーの会話データ(ユーザーによって開始された会話とその属性)、および発話データ(ユーザーによって送信された実際のクエリ、またはアシスタントによって生成された応答)を永続化するので、2つのモデルタイプでアプリケーションをモデル化できます: 会話タイプと発話タイプです。Amplify はそれぞれのモデルタイプを独自の DynamoDB テーブルにマッピングします。以下の GraphQL スキーマは、@model ディレクティブを使用してこれら2つのモデルタイプを定義する方法を示しています(図3)。

GraphQL スキーマ – 属性とリレーションシップ

スキーマでは、モデルタイプごとに他の属性に加えて主キーを定義することもできます。両方のモデルタイプの主キーは、自動的に生成される「id」フィールドで構成されます。会話モデルの追加属性の例としては、会話の名前と説明、会話を作成したユーザー、createdAt のタイムスタンプなどがあります(図3)。会話は多くの発言から構成されるため、スキーマでこの関係をモデル化する方法が必要です。そのために、@hasMany ディレクティブを使用して、Conversation モデルと Utterance モデルの間に一方向の1対多のリレーションシップを作成します(図3)。このリレーションシップを使用すると、会話データを API に問い合わせることができ、オプションで会話に含まれる発話のリストを含めることができます。

GraphQL スキーマ – アクセスパターン

API が重要なアプリケーションのアクセスパターンに対応できていることを確認する必要があります。例えば、前述の “Conversations” React コンポーネントでは、そのユーザーに固有の会話のリストを表示する必要があります。これを行うには、@index ディレクティブを使用して、Conversation モデルの “user” 属性にセカンダリインデックスを設定します(図3)。

GraphQL スキーマ – 認証ルール

ユーザーデータを保護し、ユーザーごとのデータアクセスを許可するために、認可レイヤーを追加する必要があります。このアプリケーションのデータの機密性を考慮すると、DynamoDB のテーブルレコード(上記で定義したいずれかのモデル)には、それぞれの所有者のみがアクセスできるようにする必要があります。そのために、スキーマで定義された各モデルに対して@auth ディレクティブを使用し、認可ストラテジーとして “allow:owner” を指定します(図3)。この認可戦略は、サインインした各ユーザー(オーナーとも呼ばれる)が、自分自身の会話や発話のみを作成/読み取り/更新/削除できることを意味します。裏側では、Amplify は先に作成された Cognito ユーザープールを活用して、レコード作成時のレコード所有者の身元を含む所有者フィールドを保存します。このオーナーフィールドは、アクセスを承認する前にユーザーの JWT トークンのクレームと照合されます。

アプリケーションバックエンド: Amazon Lex bot

Lexを使って、ユーザーのリクエストに関連するインテントを識別できるボットを作成します。まず、希望するインテントとスロットのリストを作成していきます。各インテントに対して、ボットがインテントを認識できるように訓練するための発話例のリストを提供します。以下は、このボットの一部として定義されたいくつかのインテント例です。完全なリストは GitHub のリポジトリを参照してください。

  • EC2-list:異なるタイプのユーザーフィルター(タイプ、ami、サブネットタイプ)に基づいてインスタンスの一覧表示
  • EC2-create:異なる設定(count、type、ami)に基づいてインスタンスを作成
  • S3-search:バケットまたは複数のバケットから特定のパターンに一致するオブジェクトを検索
  • S3-copy-to-bucket: 検索結果から特定したオブジェクトを新しいバケットにコピー
  • Sg-rule-list: 制限されていないセキュリティグループのルールをリストアップ

ユーザーのインテントが正常に検出されると、ボットはカスタム Lambda 関数を利用してインテント処理を実行する。この Lambda 関数は、ユーザーのクエリを処理するビジネスロジックが含まれているアプリケーションのバックエンドとして機能する。

例えば、ユーザーが「 Find all Red Hat instances 」というクエリを送信すると、Lex ボットは「 EC2-list 」というインテントを識別し、Lambda 関数を呼び出します。Lambda 関数内では、カスタムロジックが実行され、ユーザーが提供した条件に一致する Amazon Elastic Compute Cloud(Amazon EC2)インスタンスのリストを特定して返します。Lambda 関数の柔軟性を活かし、必要に応じて特定のカスタムインテントを満たすようにコードをカスタマイズすることもできます。

アプリケーションのホスティング

アプリケーションをホストするには、AWS Amplify Hosting を使用することをお勧めします。AWS Amplify Hosting は、フルスタックの CI/CD ワークフローをすぐに利用できます。これにより、コードのコミットに応じてフロントエンドとバックエンドの変更を単一のワークフローで継続的にデプロイすることができます。これを行うには、まず Amplify コンソールから git ブランチに接続する必要があります。あるいは、プロジェクトのバックエンドとフロントエンドの両方をビルドして公開する amplify publish コマンドを使って、手動デプロイでアプリケーションをホストすることもできます。

アプリケーションのビルドとデプロイ

GitHub リポジトリには、前提条件のリスト、詳細なデプロイ手順、使用コマンド例、クリーンアップ手順が掲載されています。

まとめ

この記事では、Lex チャットボット、リクエスト処理用の Lambda、データ管理用の GraphQL API 、認証用の Cognito を備えた、アシスタント機能付きの Web アプリケーションをに Amplify を使用して構築する方法を記載しました。具体的には、ユーザが自然言語を使用して AWS と対話し、AWS の操作/設定を自動化することを可能にする “Cloud Assistant” アプリケーションを構築しました。この特定のアプリケーションは、新規 AWS ユーザーの学習曲線をフラットにしてくれますが、それは同時に、一般的なアシスタントを搭載した Web アプリケーションを構築することの有用性と価値も示しています。

Amplify を使ったフルスタックのウェブとモバイルアプリケーションの作成と、それが提供する様々なツールと機能の詳細については、AWS Amplify をご覧ください。

この記事は、Build a Conversational AI app to Interact with AWS using AWS Amplify を翻訳したものです。

翻訳は Solutions Architect の Takuya Setaka が担当しました。