Amazon Web Services ブログ

Amazon Lex と Amazon Elasticsearch Service を使用してドキュメントサーチボットを構築する

私たちはドキュメントの検索に多大な時間を費やしています。ドキュメントストアにまずアクセスし、関連するドキュメントを検索します。ドキュメント内のテキストを検索するには、別の検索を行う必要があります。

このブログ記事では、音声やテキストを使用してドキュメントを検索する方法について説明します。  検索結果は、検索するドキュメントの中で一致する段落の最初のいくつかの文字も表示します。最後に、ボットをウェブアプリケーションと統合します。実践的な状況において、この検索機能は利用できます。例えば、顧客のビジネスで技術者が不完全なマシンで作業している場合、チャットボットを使用して必要なドキュメントを検索できます。チャットボットについては、QnA ボットブログで説明していますが、このブログ記事では、インテント抽出とインポート / エクスポート機能を使った対話管理を解説します。 さらに、Amazon S3 を使用してドキュメントストアを作成し、Amazon Elasticsearch Service (Amazon ES) でドキュメントをインデックスし、プロセス全体を自動化する方法についても説明します。 最終的なボットは、次のスクリーンショットのようになります。:

アーキテクチャ

アーキテクチャには、Amazon S3 を使って開発したドキュメントストアがあり、ドキュメントは Amazon ES を使用してインデックスを作成しています。インデックスは、Amazon S3 オブジェクト作成イベントに登録済みの AWS Lambda 関数を使って作成します。もう一つの AWS Lambda 関数は、Amazon Lex インテントを実行するのに使用します。最後に、ウェブアプリケーションと Amazon Lex を統合します。Amazon Cognito サービスは、ウェブアプリケーションから Amazon Lex サービスへの呼び出しを認証し、認可します。

使用するコンポーネント

  • Amazon Lex – サーチボットのための対話型インターフェースを構築します。
  • AWS Lambda – Amazon Lex サービスが提供するインテントを実行するのに、この関数を使用します。
  • Amazon Elasticsearch Service – 製品の FAQ、およびインストールのためのドキュメントのインデックスを作成します。
  • Amazon S3 – ドキュメントを保存します。プロダクトマネージャーまたは所有者は、このドキュメントリポジトリからドキュメントをアップロードできます。
  • AWS Lambda – ドキュメントのインデックスを作成します。インデックス作成関数は、ドキュメントを Amazon S3 にアップロードする時に起動します。統合は Amazon S3 通知を通じて行います。
  • Amazon CloudWatch – ソリューション全体をモニタリングします。
  • Amazon S3 – ボットが表示されるウェブサイトをホストします。
  • Amazon Cognito – ユーザーを認証します。
  • AWS Identity and Access Management (IAM) – AWS リソースへのアクセスを許可または拒否します。

では、ボットの構築を始めましょう。

サーチボットの作成

3 段階でボットを構築します。

ステージ 1 – ドキュメントのアップロードフローを自動化する

このソリューションでは、Amazon S3 を全ての製品ドキュメントのドキュメントストアとして利用できます。ユーザーが Amazon S3 にドキュメントをアップロードすると、AWS Lambda 関数が起動し、Amazon ES でドキュメントをインデックスします。

この AWS CloudFormation テンプレートを使用して、ステージ 1 を設定します。US-East-1 でこのテンプレートを起動するには、[Launch Stack]ボタンをクリックします。:

CloudFormation スタックは、Amazon Elasticsearch および Amazon S3 バケットにアクセスするために、Amazon S3 バケット、Amazon Elasticsearch クラスター、2 つの AWS Lambda 関数、および関連する IAM ロールを作成します。Amazon S3 バケットの作成には名前が必要なため、CloudFormation スタックに全て小文字で名前を付けます。

AWS CloudFormation スタックを実行する時、作成した全てのリソースが AWS CloudFormation コンソールの出力タブに表示されます。

サンプル PDF ドキュメントをこちらからダウンロードし、ドキュメントを DocumentStoreS3bucket S3 バケットにアップロードします。Word ドキュメントまたは PowerPoint プレゼンテーションをアップロードすることもできます。Amazon S3 バケット上のオブジェクト作成イベントは、IndexDocumentLambda 関数を通知します。この関数は Amazon ES 6.2 にあるビルトイン Tika ライブラリを使用して、ドキュメントを base64 エンコーディングし、Amazon ES でインデックス化します。IndexDocument Lambda 関数を詳しく見ると、Http リクエストが Amazon ES ドメイン上のドキュメントにインデックスを付ける様子を見ることができます。

次のコードスニペットは、putDocumentToES メソッドのものです。

var req = new AWS.HttpRequest(endpoint);
var attachKey = key + '?pipeline=attachment';

var bodyString = JSON.stringify({
"data": doc,
"filePath" : objURL
});

req.method = 'PUT';
req.path = path.join('/', esDomain.index, esDomain.doctype, attachKey);
req.region = esDomain.region;
req.body = bodyString;
req.headers['presigned-expires'] = false;
req.headers['Host'] = endpoint.host;
req.headers['content-type'] = 'application/json';

ステージ 2 – サーチボットの構築

Amazon Lex コンソールに移動し、ここにある zip ファイルを使用してボットをインポートします。

インポートした後、2 つのインテントがあることが分かります。「 Welcome 」と「 DocumentSearch 」です。最初のインテントはユーザーを迎えるために使用し、2 つ目はドキュメントを検索するためのものです。インポートメソッドを使って、時間を節約しつつ、最初にデフォルトテンプレートを提供するボットを作成しました。インテントを手動で追加する場合は、こちらにあるドキュメントに従って行い、zip ファイルから発声をコピーします。次に、ボットにある WelcomeIntent および DocumentSearch インテント用にステップ 1 で作成した DocumentSearch AWS Lambda 関数を設定します。左メニューから ‘WelcomeIntent’ インテントを選択し、その下の [Fulfillment] セクションで [AWS Lambda function] オプションを選択し、次に [fulfillment lambda 関数] を選択します。関数名は <your CloudFormation Stackname>-DocumentSearchBotFullfillment のようになります。そしてこのインテントを保存します。同じく、‘DocumentSearch’ インテント用に、同様の Lambda 関数の <your CloudFormation Stackname>-DocumentSearchBotFullfillment を構成し、インテントを保存します。

次に、[Build] をクリックして、ボットを構築します。モデルが構築するまで数秒かかります。構築に成功すると、次のメッセージが表示されます。

ボットをテストする準備が全て整いました。画面の右側にある [Test Bot] セクションに移動し、「こんにちは」と入力してみてください。変換は、次のスクリーンショットのようになります。ボットはドキュメント内のテキストを検索し、段落の最初のセンテンスを返します。この場合では Amazon S3 リンクである、完全なドキュメントリンクも送信します。

LexFullfillmentLambda 関数の queryES メソッドを見ると、検索の仕組みが分かります。Amazon ES は、どの関連する結果をユーザーに表示するかを決めることができるサーチスコアも送信します。

できました !Amazon Lex と Amazon ES を使って、ドキュメントサーチボットを作成しました。

ステージ 3 – ウェブ UI との統合

これで、ボットをデプロイする準備ができました。こちらのリンクにある説明に従えば、Facebook や Slack、Twilio といったモバイルアプリケーションやメッセージングプラットフォームにデプロイすることも可能です。 こちらのブログでは、Amazon Lex ボットをウェブアプリケーションに統合する方法が記載されていますので、ご参照ください。そのブログでは、ボットをデプロイするための AWS CloudFormation テンプレートを提供しています。

次のレベルに行くには ?

ボットを Amazon Connect に統合することが可能です。 Amazon Connect を使えば、クラウドベースのコンタクトセンターを迅速かつ簡単に構築できます。 Amazon Lex のような AWS サービスでは、統合を直接行うことが可能です。これにより、ユーザーは指定の電話番号に電話をかけることができ、通信全体をボットに送信することが可能になります。つまり、ユーザーが電話番号を呼び出し、音声でドキュメントを検索できるようになり、ボットが電子メールでドキュメントを送信できるといった興味深いユースケースが可能なのです。統合の手順に関しては、こちらをご参照ください。

考慮すべき事項

ここで紹介したソリューションを見ると、Amazon Lex そして AWS Lambda がいかにパワフルであることが分かったかと思いますが、これらを本番で使用するのに、事前に考慮すべきことが少しあります。

  • テキストベースの検索をするために複数のドキュメントを出力し、それに応じて出力を表示するというシナリオを考えてみましょう。
  • 匿名アクセスから保護し、さらにコンプライアンス要件を満たすためのソルーションに関するセキュリティを追加します。
  • 大規模なドキュメントをインデックスするため、ベストプラクティスに従ってください。

クリーンアップ

CloudFormation スタック全体を削除するには、AWS CloudFormation コンソールでスタックを選択し、[Delete Stack] オプションを選択します。これは[Action] メニューの中にあります。これで、このブログの中で作成したリソースは全て削除されます。

その他の参考資料

まとめ

今日のブログでは、Amazon ES を Amazon Lex に統合し、強力なドキュメントサーチチャットボットを構築する方法について解説しました。Amazon S3 と Amazon ES を使用してドキュメントストアを構築する方法と、複数のインテントでダイアログ管理を行う方法についてもご紹介しました。

ブログ投稿者について

Akash Jain と Rahul Kulkarni はパートナーソリューションアーキテクトです。パートナーとの協力のもと、AWS 上でのアプリケーションおよびシステム設計のベストプラクティスを広める仕事をしています。