多言語対応のチャットボットを簡単作成 ! QnABot on AWS を試してみる

2023-06-01
AWS ソリューション紹介

川島 拓海 (監修 : 佐藤 裕介)

皆さん、こんにちは!ソリューションアーキテクトの川島拓海です。

皆さんは「AWS ソリューションライブラリ」をご存知でしょうか?
AWS ソリューションズライブラリでは、世界中のユーザーが直面する一般的な問題の解決策を提供しております。実装には AWS CloudFormation のテンプレートが提供されており、ダウンロードした CloudFormation テンプレートをお客様の環境で実行することで、実装にかかる時間と労力を節約できます。

今回紹介するのは、多言語対応のチャットボットを作成できる「QnABot on AWS」(以下 QnABot) というソリューションです。皆さんは Web ページを利用する際に、利用者の質問に答えてくれるチャットボットが画面の右下にある仕組みを見たことがありますか?そのチャットボットを自分で実装するとしたらどうするでしょうか?いつ来るか分からない質問を常に待ち受けておき、質問に対して適切な答えを返す必要があります。同じ内容の質問でも利用者によって全く違う質問文になるかもしれませんし、想定外の質問が来ることもあるかもしれません。QnABot を使えば、上に挙げた面倒な問題を全て解決するソリューションを簡単にデプロイできます。

それでは早速、本ソリューションの概要をご紹介します。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 

1. QnABot on AWS とは?

QnABot は、多言語対応の対話型インターフェース (チャットボット) です。「QnA」とは「Q&A」、つまり「Questions and Answers」のことです。エンドユーザーから見た UI は右の画像のようになっています。下の欄に質問を入力して投稿でき、チャットボットとの会話は画面上に表示されます。概要とデモの公式動画 にも多言語対応しているデモがあるので、ぜひご覧ください。

クリックすると拡大します

このソリューションにより、チャットボットの管理者は下記のようなメリットを得られます。

  • 多言語翻訳機能を備えた自動のカスタマーサポート機能がデプロイされるので、顧客体験の向上に役立てられます。
  • Web ページで質問と回答を編集できるので、簡単に質問と回答のペアを追加・管理できます。
  • AWS のマネジメントコンソールにアクセスせずに管理できるので、AWS アカウントや IAM ロールを持っていない運用管理者に権限移譲できます。

また、エンドユーザーは下記のようなメリットを得られます。

  • 自分の好きな言語で、テキストでも音声でもチャットボットとやりとりできます。
  • 個人の用途に合わせたチュートリアルや人間らしいインタラクションが実装されたチャットボットを利用できます。

2. 使用している AWS サービスは?

本ソリューションの内部では、多くのサービスが CloudFormation によりデプロイされています。下図は、アーキテクチャの概観です。灰色の網掛け部分が、CloudFormation によりデプロイされる部分です。興味があれば、本ソリューションについて説明した公式動画 もご覧ください。

このなかでもチャットの翻訳機能の核を担うのは Amazon TranslateAmazon Lex の 2 つです。

  • Amazon Translate は深層学習モデルを用いた言語翻訳を行うサービスです。QnABot が提供する多くの機能において、ユーザーからの英語以外のリクエストを英語に翻訳します。
  • Amazon Lex は、テキストや音声を用いた対話インターフェースを構築するためのサービスです。ここでは、ユーザーの質問に対して、深層学習をベースにした自然言語理解や自動音声認識を行います。そして、自然言語理解や自動音声認識の結果を Amazon Lex から AWS Lambda を介して他サービスに送信し、他サービスからのレスポンスをユーザーに送信します。

上で説明した以外のサービスが QnABot で何を担っているのか、それぞれ簡単に説明したのが下の表です。

Amazon Cognito ウェブアプリケーション上での管理者の認証を担う。
Amazon API Gateway ウェブコンテンツの表示や質問と回答の登録の API リクエストを受け付ける。
Amazon Polly テキストの音声化を担う。
Amazon S3 ウェブコンテンツの保持 (図上) および分析用ログの保持 (図右下) を行う。
Amazon CloudFront ウェブコンテンツを配信する。
AWS Lambda 質問に対する回答の検索 (図下) を担ったり、質問と回答の保存 (図上) をしたりする。
Parameter Store AWS Systems Manager の一機能で、設定値を保管する。
Amazon DynamoDB ユーザーの情報を保持する。
Amazon OpenSearch Service 自然言語検索の機能をサポートする。
Amazon Comprehend テキストの理解を担う。
Amazon Kinesis Data Firehose ログやメトリクスのデータを AWS Lambda から Amazon S3 に送信する。
Amazon Connect 任意。コンタクトセンターを設定して連携できる。
Alexa Skill 任意。AI 音声認識サービス Alexa が有効化されたデバイスと連携できる。
Amazon Kendra 任意。Web ページのクローリングによる検索機能を追加できる。
Kibana AWS 外の無料のサービス。ダッシュボード上でユーザーの利用状況が視覚化される。

3. デプロイ方法・設定方法

ここからは、実際のデプロイ方法を見ていきましょう。

まずは、QnABot のランディングページ にアクセスします。

ここから「AWS コンソールで起動する」を押すと、マネジメントコンソール内で CloudFormation スタックを起動することができます。

このとき、マネジメントコンソール内の画面右上からリージョンを選択することで、ソリューションを展開するリージョンを決められます。リージョンの選択に迷う場合は、このソリューションを使うエンドユーザーに近い場所を選ぶといいでしょう。

※本記事にマネジメントコンソール内の CloudFormation のページへのリンクを貼る際は、すべて東京リージョンにしています。東京リージョン以外でスタックをデプロイする際はご注意ください。

クリックすると拡大します

ステップ 1 テンプレートの指定」ではそのまま「次へ」を選択します。

ステップ 2 スタックの詳細を指定」で、いくつかのパラメータを指定します。

多くのパラメータが並んでいますが、ご自身で最低限指定するパラメータはスタック名と Email のアドレスのみです。スタック名は今回「QnABot」としました。Email のアドレスは、設定完了の確認メールが届く宛先です。

また、ユーザー名はデフォルトでは Admin になっています。ここは自由に変えられますが、設定値はログイン時に使うので覚えておきましょう。

Amazon Lex での音声入出力に日本語を用いる場合は、LexV2BotLocaleIds に ja_JP を追加します。

また、FulfillmentConcurrency はデフォルトで 0 ですが、 1 にするとチャットボットの応答が高速化します。これは、顧客のアクセスを処理する AWS Lambda の関数が同時実行数 1 として常にプロビジョニングされるためです。この場合、追加の料金が発生することに注意してください。

パラメータの一覧とその説明は以下の通りです。

  パラメータ デフォルト値 説明
認証 Email <必須> 初期パスワードを受け取るための自身のメールアドレス。
Username Admin 管理者としてログインするときの名前。
PublicOrPrivate PRIVATE PUBLIC なら登録済みのユーザー以外もクライアントの機能を使える。
Amazon Kendra との統合 DefaultKendraIndexId <任意> Amazon Kendra と統合する場合の既存の Kendra の Index ID。
Amazon OpenSearch Service ElasticSearchNodeCount 4 Amazon OpenSearch Service のノード数。耐障害性を持つ本番環境では 4 を推奨。
Encryption ENCRYPTED Amazon S3 と AmazonOpenSearchService の暗号化。本番環境では暗号化が推奨されるが、しない場合に比べて大きな Amazon OpenSearch Service インスタンスが適用される。
KibanaDashboardRetentionMinutes 43,200 Kibana ダッシュボードに用いられたログやメトリクスのデータの保持分数。デフォルトでは 30 日 (43,200 分)。
Amazon LexV2 LexV2BotLocaleIds en_US,es_US,fr_CA 音声入力に用いる言語のコード。日本語なら ja_JP と入力する。それ以外は下記リンクを参照。
https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html
意味に基づいた検索機能 EmbeddingsApi DISABLED 有効化することで、Amazon SageMaker 上の Hugging Face の言語処理モデルか AWS Lambda のカスタム関数のいずれかを用いて意味に基づいた検索ができる。
SagemakerInitialInstanceCount 1 Amazon SageMaker を用いる場合の SageMaker のインスタンス数。
EmbeddingsLambdaArn <任意> AWS Lambda を用いる場合の Lambda 関数の ARN。
EmbeddingsLambdaDimensions 4096 AWS Lambda を用いる場合の、自然言語の意味を射影する空間の次元。
その他 LexBotVersion LexV2 Only Amazon Lex のバージョン。
InstallLexResponseBots true Amazon Lex のサンプルの応答をインストールするか。
FulfillmentConcurrency 0 顧客のアクセスを処理する AWS Lambda の関数のプロビジョニングする同時実行数。
XraySetting FALSE AWS Lambda に対する AWS X-Ray を有効化するか。

ステップ 3 スタックオプションの指定」では、CloudFormation のデプロイに関する設定を指定します。ここではそのまま「次へ」をクリックします。

最後に設定した内容を確認し、確認事項を読んでチェックボックスを埋めたうえで「 スタックの作成」をクリックします。

クリックすると拡大します

デプロイには 30 分以上かかる場合もあります。デプロイ完了後に、CloudFormation のパラメータ「Email」で指定したメールアドレスにメールが届くので、確認してみましょう。


4. 管理者ページを触ってみよう

4-1. 管理者ページへのログイン

デプロイできたら、まずは管理者として質問と回答の組み合わせを登録してみましょう。

まずは、CloudFormation のスタック一覧画面 から、作成したスタックをクリックします。今回は QnABot という名前で作成したので、そのスタックをクリックします。

クリックすると拡大します

その後、「出力」というタブを開きます。

出力タブには、ユーザー用の URL (ClientURL) 、質問と回答を登録する管理者用ページの URL (ContentDesignerURL) などのパラメータが出力されます。

まずは、管理者用ページにアクセスしてみましょう。出力タブの一覧から、ContentDesignerURL のリンクをコピーし、ブラウザからアクセスします。なお、ContentDesignerURL は、スタック作成時に送られてきたメールにも記載されています。

クリックすると拡大します

CloudFormation のパラメータ (Username) で設定したユーザー名 (デフォルトでは Admin) と、メールで送られてきたパスワードを入力し、新たなパスワードを設定するとログイン完了です。

クリックすると拡大します

ログインすると、質問の一覧ページが表示されます。しかし、まだ質問と回答を登録していないため、なにも表示されていません。左上にハンバーガーメニュー (横 3 本線のアイコン) があり、ここから各種機能を利用出来ます

クリックすると拡大します

4-2. 多言語対応のための設定

QnABot のデフォルトの設定では英語で対話が行われます。この章では、他言語も対応できるように設定を変更しておきます。多言語対応の機能は管理者ページから有効化する必要があります。管理者ページ左上のハンバーガーメニューをクリックして「Settings」を選択します。ここでは、こちら にあるような設定値を参照・変更できます。

この章ではこのなかから、「ENABLE_MULTI_LANGUAGE_SUPPORT」を選んで「true」に設定します。一番下までスクロールし、「SAVE」のボタンを押しておきましょう。これにより多言語対応の設定は完了します。

この設定により、5-3 章 で実際に日本語で質問して回答を受け取ることができるようになります。また、8 章 ではより発展的な多言語の機能を紹介します。

クリックすると拡大します

4-3. サンプルの登録

まずは、質問と回答の登録のために、あらかじめ用意されたサンプルをインポートしてみます。管理者画面左上のハンバーガーメニューをクリックして、「Import」を選択します。

クリックすると拡大します

Import 機能では、JSON や Excel ファイルを利用して質問と回答のペアを登録できます。自分で質問や回答を登録する方法は 7 章 で紹介します。この章では基本的な仕組みを理解するため、用意されているサンプルを登録してみます。

Examples/Extensions」をクリックしてタブを開くことにより、利用可能なサンプルの一覧が表示されます。

クリックすると拡大します

下にスクロールして blog-samples を見つけ、「LOAD」をクリックしましょう。

クリックすると拡大します

これにより、選択したファイル blog-samples の質問と回答が登録されます。blog-samples は単純な質問と回答のペアが登録されたチュートリアル用のインポートファイルです。

クリックすると拡大します

左上のハンバーガーメニューから「Edit」を選択して押すと、ログインした最初の質問一覧画面に戻ります。

このとき、今追加した質問が表示されています。いずれも英語ですが、例えば一番上の Admin.001 では、「どのように Q and A Bot のコンテンツを編集したら良いですか?」という質問とそれに対する回答が登録されています。なお、 Admin.001 の回答中にある「Content Designer」とは、今表示している管理者ページのことです。

こちらの画面では Id、Type、First Question という 3 つの列があります。Id は、質問と回答の組を示す一意な名前です。Type は 3 種類あり、qna、quiz、slottype があります。こちらの画像で見られる qna は、ユーザーが質問して QnABot が回答を返すものです。quiz は本記事では詳しく紹介しませんが、QnABot が出題してユーザーがそれに答える形式のクイズを楽しめる機能です。slottype については 6-2 章 で詳しく触れます。一番右側の列 First Question は、最初の質問文です。

この画面でそれぞれの行をクリックすると詳細が見られます。この画像では赤枠で囲ってある部分 Admin.001 の詳細を開いています。

クリックすると拡大します

4-4. ツールの一覧

ここで、管理者画面左上のハンバーガーメニューをクリックすると出てくるツールの一覧でどのようなことができるか確認しましょう。ここまでで触れたのは EditSettingsImport の 3 項目です。

本記事では詳しく触れないものもあるので、各ツールの概要を表にまとめておきます。他のサービスとの連携方法もツールから読めます。

Edit 質問と回答の一覧が表示されるページに遷移します。
Settings 設定一覧のページに遷移します。
Import 質問や回答などを登録します。6 章 や 7 章 でより詳しく紹介します。
Export 登録した質問や回答などの一覧を JSON ファイルで取得してダウンロードできます。
Import Custom Terminology カスタム語彙の設定ができます。8-2 章 で詳しく紹介します。
Kendra Web Crawler Amazon Kendra で Web ページをクローリングして回答を返すための設定ができます。
Alexa Alexa 経由で QnABot を利用するための Alexa Skill を設定する方法を読めます。
Connect コンタクトセンターを設定するためのサービスである Amazon Connect と組み合わせる方法を読めます。
Genesys Cloud コールセンターを設定するための AWS 外のサービスである Genesys Cloud と組み合わせる方法を読めます。
Lambda Hooks AWS Lambda の関数を質問文に関連づけるための設定方法を読めます。Lambda Hooks については 6-1 章 でも触れます。
QnABot Client ユーザーページに遷移できます。5-1 章 でも触れます。
Kibana Dashboard 可視化ツール Kibana で様々な統計情報が見られます。
QnABot Help クリックするとバージョン情報や参考リンクなどが表示されます。

5. ユーザーページを使ってみよう

5-1. ユーザーページへのログイン

質問と回答が登録できたら、今度はユーザーとして使ってみましょう。

まずは、管理者ページにアクセスしたときと同様に、CloudFormation のスタック一覧画面 から qnabot というスタックを開き、出力のタブを確認します。 ClientURL のリンクをコピーしてブラウザでアクセスしてみましょう。

クリックすると拡大します

なお、管理者ページからハンバーガーアイコンをクリックし、QnABot Client を選択することでもユーザーページにアクセスできます。

クリックすると拡大します

CloudFormation のパラメータ PublicOrPrivatePRIVATE を指定しているため、こちらの画像のような認証画面が表示される場合があります。

その場合は「Sign In as Admin」をクリックして続行します。パスワードの入力を求められないのは、管理者ページにログインした際の情報がデバイスに残っているためです。一定時間が経ったら再度ログインを求められます。

5-2. 英語での対話の確認

まずは、英語で登録した質問をそのまま投げかけてみましょう。QnABot が答えてくれます。

クリックすると拡大します

続いて、登録していない質問を投げてみましょう。QnABot は内部で登録済みの質問文との関連性をランク付けしているため、多少言い方が違っても質問に正しく答えてくれます。一方で、まったく分からない質問であれば QnABot がその旨を答えてくれます。

クリックすると拡大します

音声入力も可能です。下の画像で赤く囲った画面右下のマイクボタンを押してから喋ると、音声が認識されて回答が返ってきます。このときにブラウザのマイクへのアクセス許可が求められたら、許可してください。回答はテキストだけでなく音声でも聞けます。右の画像の例では、1 回目は微妙に違う認識結果となりましたが、QnABot が類推して正しい回答を返しています。

クリックすると拡大します

5-3. 日本語での対話の確認

続いて日本語でも同様のことを試します。4-2 章 で多言語機能の設定をしたことにより、英語と同様に日本語で対話ができます。QnABot がユーザーの言語を自動で検出して翻訳し、ユーザーの言語で回答します。少しの言葉の違いには正しく答えてくれますが、まったく分からない質問の場合、QnABot が英語の場合と同様の返答を返します。

※まったくわからない質問に対するデフォルトの返答内容は英語なので、6-1 章 で日本語で返すための設定を紹介します。

クリックすると拡大します

日本語の音声入力も可能です。テキスト入力では QnABot が自動で言語を検出してくれたのに対し、音声入力の際は、ユーザーページから言語を設定する必要があります。ユーザーページ左上のハンバーガーメニューを押すと、設定した言語の一覧が出てきます。そこから ja_JP を選択すると、ユーザーページ右上の言語の表記が「ja_JP」に変わります。

クリックすると拡大します

画面右下のマイクボタンを押して「どのように Q アンド A ボットの内容を編集したらいいですか?」と聞いてみましょう。音声は正しく認識される一方で、日本語の表記が「キューアンドエーボット」と片仮名になっています。このせいで、チャットボットは質問の内容を正しく理解してくれませんでした。

※この問題の修正方法は 8-3 章でご紹介します。

クリックすると拡大します


6. いろいろなサンプルを使ってみよう

この章では、QnABot のより詳細な機能を理解するため、管理者ページの Import から見ることのできる blog-samples 以外のサンプルを確認します。本記事でピックアップするのは、画像内で囲ってある blog-samples-finalIntentSloatMatchingLanguage です。
 
それ以外のサンプルでも質問や回答の例をダウンロードできるので、興味があれば確認してみてください。

クリックすると拡大します

6-1. 便利な機能の確認:blog-samples-final

まずは、blog-samples-final をインポートします。blog-samples-final は、QnABot の様々な基本機能を確認できるサンプルです。インポートしたあとに質問と回答の一覧画面に戻ってくると、質問が増えていることが分かります。それぞれの質問をクリックして詳細を開いてみてください。

ここではいくつかの質問を取り上げてみます。

クリックすると拡大します

まずは、GreetingHookExample という質問を開いてみてください。この質問には Lambda Hook が関連づけられています。GreetingHookExample の質問が QnABot に投げられた場合には、登録された AWS Lambda の関数が呼ばれます。AWS Lambda との関連付けにより動的な処理が可能です。

クリックすると拡大します

GreetingHookExample に関連づけられた Lambda 関数は、動的に挨拶を変えるためのもので、GitHub から内容が見られます。挨拶は現在から 16 時間進んだ時刻を元に決定されています。

こちらの画像が実際の利用例です。冒頭の挨拶が「こんばんは」となっていることがわかります。時刻によっては、「おはようございます」などに変わります。

なお、管理者ページのハンバーガーメニューから「Lambda Hooks」をクリックすると、Lambda Hooks についての詳しい説明が読めます。

クリックすると拡大します

次に Alexa.001 を開いてみましょう。

クリックすると拡大します

Response card の項目に画像の URL やボタンのテキストが定義されており、画像やボタンの設定方法が分かります。

クリックすると拡大します

画像やボタンがどのように見えるかユーザーページで確認してみましょう。

Alexa.001 で定義された質問「 What is an Amazon Echo Show ? 」を入力すると、設定した Amazon Echo Show の画像やボタンが表示されていることがわかります。

クリックすると拡大します

また、Alexa.001 の質問をした下の画像において、右上の「?」マークと、回答内の Good ボタン・Bad ボタンに注目してみましょう。「?」マーク・Good ボタン・Bad ボタンを押すとそれぞれ、 Help・Thumbs up・Thumbs down というコメントを入力したことになります。

クリックすると拡大します

これらのコメントに対する返答も、今追加した blog-samples-final に含まれています。それぞれ、HelpFeedback.001Feedback.002 というタイトルで登録されています。

クリックすると拡大します

続いてもう一つ、CustomNoMatches という Id の質問を開いてください。no_hits という質問に対する返答が登録されています。これは、ユーザーの質問にマッチするものがなかったときに返す回答です。この行が追加されたことにより、 意図しないユーザーの質問に対して、QnABot はユーザーの言語に対応しつつ柔軟に返答できるようになります。

せっかくなので、こちらの画像の赤枠で囲ったペンマークをクリックして、回答を編集してみましょう。

クリックすると拡大します

Answer の部分を編集したあと、画面右下の「update」をクリックします。

クリックすると拡大します

これにより、ユーザーからの意図しない質問に自在に答えられるようになりました。

クリックすると拡大します

6-2. Slot の登録:IntentSlotMatching

次に、サンプル IntentSlotMatching をインポートしてみます。IntentSlotMatching は、slot という対話の機能を確認できるサンプルです。

インポートしたら、質問一覧からIntentSlotMatching.Example.Q1 を開いてみてください。これはレンタカーの予約をするためのサンプルです。ユーザーが車の予約をしようとすると、QnABot が予約のための情報を対話形式で収集します。対話的に収集される情報の一覧が、画像の赤枠の部分で登録されています。このときの対話の例は こちら から確認できます。

クリックすると拡大します

上の画像赤枠内の右端 Slot prompt は、情報収集のために QnABot がユーザーに投げかける質問です。このときのユーザーの返答が、Slot name の変数に保存されます。Slot type は変数の型で、公式で用意されているもの から選べます。

しかし、公式にあるものだけでは不十分な場合があります。そのときにはカスタムの Slot type の登録もできます。上の画像の例では、CarType とConfirmationSlot がカスタムの Slot type です。

改めて質問一覧画面を見ると、IntentSlotMatching.Example_slottype_CartypeIntentSlotMatching.Example_slottype_Confirmation も追加されていることが分かります。こちらの画像のように、これらの Type 列の値は slottype です。Value で書かれているのが選択肢の一覧です。

クリックすると拡大します

実際にユーザーページから試すには、まず管理者画面右上の縦三点リーダーをクリックし、「LEX REBUILD」を選択します。これは slot や slottype の情報の登録に Amazon Lex を使っているためであり、LEX REBUILD をクリックすることで slot や slottype の情報が読み込まれます。そのため、slot に関する情報を編集した後には、必ず LEX REBUILD をクリックする必要があります。

LEX REBUILD については、8-3 章 でも説明します。

クリックすると拡大します

なお、slot の機能を使う際には、ユーザーページ左上のハンバーガーメニューから適切な言語を選択する必要があります。選択した言語は右上に表示されます。

こちらの画像は、日本語でこの機能を利用するときの例です。

※economy を英語で入力しているのは、日本語で「エコノミー」と入力しても認識されないためです。こちらについては 8-3 章で触れます。

クリックすると拡大します

6-3. 言語検出機能の有効化・無効化:Language

最後に、サンプル Language を登録してみます。Language は、ユーザーの言語を自動で検出してその言語で回答する QnABot の機能を有効化・無効化するサンプルです。

Language のインポートにより追加される質問は、Language.000Language.001 です。これらは言語検出機能を有効化・無効化するもので、handlebars の記法を用いています。

これまでは、QnABot がユーザーの言語を検出してその言語で回答を返していましたが、ここでは、この機能を無効化して言語を固定する方法を紹介します。

まずは Language.000 を開いてみましょう。このサンプルの Answer の項に書かれているように、setLang を使えば言語を固定できます。しかしこのサンプルには日本語がないので、追加しましょう。

6-1 章 で紹介したのと同様に、ペンマークをクリックして編集します。

クリックすると拡大します

ADD QUESTIONS/UTTERANCE」をクリックして行を追加し、Japanese と入力します。

そのあと、Answer に赤枠で囲った行を挿入します。行の挿入位置は、最後の行より前ならどこでも問題ないです。最後の行はデフォルトの挙動を示すもので、この行まで見てマッチするものがなければ「Sorry, the requested language is not available.」という返事が返されます。

編集を終えたら画面右下の「UPDATE」をクリックしましょう。これにより、日本語への固定ができるようになります。

クリックすると拡大します

一方で Language.001 は、言語検出機能を有効化するためのものです。ユーザーが「Reset language」もしくは「Detect language」と送ると、言語検出機能が有効化されます。

実際に言語検出機能の有効化・無効化を使ってみた例がこちらです。

「Japanese」と送ったあとは英語の質問でも日本語で返答する仕組みになっていますが、「言語を検出」と送信すると、元の挙動に戻ります。

クリックすると拡大します


7. 自分で質問と回答を登録してみよう

7-1. 手動での登録

ここからは、自分で質問を登録してみましょう。まずは、質問を 1 つ登録してみます。管理者画面の質問と回答の一覧から、「ADD」をクリックします。

クリックすると拡大します

ポップアップが開いた状態から、Item ID・Question/Utterance・Answer を入力して、右下の「CREATE」を押します。

今回は、Amazon EC2 のよくある質問ページ の一番上の質問を登録してみます。

※なお、こちらの画像の上部の document type では、4-3 章 で触れた quiz や、6-2 章 で紹介した slottype の登録もできます。また、画像下部の Advanced をクリックすると様々な設定が開き、6-1 章 で登録した Lambda Hook の追加や画像の追加などができます。

クリックすると拡大します

これで問題の登録は完了です。ユーザーページで実際に日本語や英語で質問して、登録できているのを確認しましょう。

クリックすると拡大します

今回の例では英語版の回答を自動で翻訳して日本語版の回答が提供されていますが、それでは不十分な場合があるかもしれません。その場合は、6-1 章 や 6-3 章 でやったのと同じように、ペンマークから編集して、日本語版の回答も直接併記します。

クリックすると拡大します

複数の言語を用いるには、6-3 章 のサンプルでも用いた handlebars の記法を用います。ifLang で検出言語ごとの回答を定義し、対応する言語が定義されていない場合の返答を defaultLang に定義します。

クリックすると拡大します

設定したらユーザーページから動作を確認してみましょう。

クリックすると拡大します

7-2. ファイルからのインポート

質問をまとめて登録する場合、Excel や JSON ファイルで登録できます。は GitHub に Excel のフォーマットサンプル があるので、質問と回答を書き換えて登録することが出来ます。JSON のフォーマットの例も GitHub から見られます。

また、管理者ページの左上のハンバーガーメニューから「Export」を選択して現状の設定を反映した JSON ファイルをダウンロードすることもできるので、そのフォーマットを参考にしてもいいでしょう。


8. 翻訳機能

ここまで、QnABot の翻訳機能について

  • 言語検出・自動翻訳機能 (5-3 章)
  • 言語検出機能の有効化・無効化 (6-3 章)
  • 言語ごとの回答の個別定義 (7-1 章)

を紹介してきました。この章では、今までに紹介してこなかった機能について紹介します。

8-1. デバッグによる翻訳結果の確認

まずはこちらの画像を見てみてください。Admin.001 の質問「How do I modify Q and A Bot content」に対応する日本語の質問を、ユーザーが 2 回しました。

似たような質問を 2 回していますが、異なる回答が返ってきています。この問題の原因は翻訳にありそうですが、どこを直せばいいかすぐには分からない場合もあるでしょう。このようなケースに役立つデバッグ機能をご紹介します。

クリックすると拡大します

まずは管理者ページ左上のハンバーガーメニューから「Settings」を選択し、ENABLE_DEBUG_RESPONSES を true にします。

その後、下までスクロールして「SAVE」をクリックします。

クリックすると拡大します

それからユーザーページに入り、上の画像と同様の質問をしてみましょう。質問の英訳が回答に含まれていることが分かります。

クリックすると拡大します

質問の英訳に fix という単語が含まれていることにより、fix が質問文に入っている他の質問 (Admin.004) と混同されたことが間違いの原因だとわかります。

この問題を解消するため、管理者ページで Admin.001Question/Utternance に fix を含む質問文を書き足します。

クリックすると拡大します

これにより、意図した回答が返ってくるようになります。

クリックすると拡大します

8-2. カスタム語彙の登録

続いて、カスタム語彙の登録を紹介します。

まずは、6-1 章 で紹介した blog-samples-final に含まれる QnABot.001 を確認して、ユーザーページから日本語で質問してみましょう。

クリックすると拡大します

質問に対して QnABot が Markdown で定義された回答を返してくれますが、タイトルが「ナボット」になっています。これは、英語で書かれた「QnaBot」を無理やり日本語に翻訳しているためです。

ここは本来なら、日本語でも「QnABot」と表記してほしいところですね。

クリックすると拡大します

この問題はカスタム語彙の追加により解決します。まずカスタム語彙を有効化するため、管理者ページ左上のハンバーガーマークから「Settings」を選択します。

画面内の ENABLE_CUSTOM_TERMINOLOGY を true にしてから、下までスクロールして「SAVE」をクリックします。

クリックすると拡大します

続いてカスタム語彙を定義した csv ファイルをローカルで作ります。ファイルの形式は こちら を参照してください。今回は、英語と日本語を定義した下の表のような csv ファイルを作ります。

なお、カスタム語彙においては大文字と小文字は別の文字とみなされる点に注意してください。また、日本語の文字は登録できない点も注意が必要です。

en ja
QnaBot QnABot

続いて、csv ファイルを QnABot に登録します。

管理者ページのハンバーガーメニューから「Import Custom Terminology」をクリックします。

Description に説明を書いて、「ファイルを選択」から先ほど作った csv をアップロードします。

クリックすると拡大します

ファイルが正しくアップロードされたら、このように登録済みのファイルが表示されます。

表示されない場合はファイルの形式などを確認してみてください。

クリックすると拡大します

ファイルの登録が終わったら、ユーザーページから改めて同じ質問をしてみましょう。正しい回答が返ってくることが確認できます。

クリックすると拡大します

8-3. Amazon Lex を用いた翻訳機能

5 章 で登場した音声認識と 6-2 章 で紹介した slot の機能では、Amazon Lex が用いられています。そのため、音声認識と slot の機能は、一般的なテキストの対話と異なる挙動を示します。

この章では、Amazon Lex にまつわる機能の注意点を改めてご紹介します。

第一に、音声認識や slot を日本語で利用する場合は、ユーザーページ右上の言語が ja_JP となっていることを確認する必要があります。設定言語はユーザーページ左上のハンバーガーメニューから変更できます。

第二に、8-1 章 の翻訳のデバッグの利用や 8-2 章 のカスタム語彙の登録は、slot ではできません。

そのため、6-2 章 で「エコノミー」という単語が認識されなかったような翻訳時の問題には、誤訳が起こる語彙を避けることで対処する必要があります。

なお、5-3 章 のように音声認識での対話がうまくいかなかった場合、2 種類の対処方法があります。

1 つ目は、登録された文章で Amazon Lex の再学習を行う方法です。再学習は管理者画面右上の縦三点リーダーから LEX REBUILD を選択することで完了します。LEX REBUILD は、slot の再学習と音声認識の再学習のいずれでも使う機能です。

ただし、QnABot の質問文には英語しか登録されていないので、翻訳が絡む問題には LEX REBUILD では対処できない場合があります。その場合は 2 つ目の方法として、誤認識結果になりそうな質問も QnABot に登録しておくことが考えられます。その例として、ここでは 5-3 章 の問題を取り上げてみましょう。まずは 8-1 章 で紹介したデバッグ機能をオンにして、テキストでの質問と音声での質問を比べてみます。

画像の 2 回の質問のうち、後者が音声で質問した結果です。「キューアンドエーボット」と片仮名で書かれているので、「Queue and Abot」と誤訳されています。

クリックすると拡大します

この問題を解消するため、誤訳結果も QnABot に登録しておきます。

管理者ページから書き換えましょう。書き換えたら右下の「UPDATE」を忘れずに押します。

クリックすると拡大します

これにより、音声認識における誤訳にも QnABot が対応できるようになりました。

クリックすると拡大します

8-4. 翻訳機能においてできないこと

最後に、2023 年 2 月現在の QnABot ではできない翻訳機能をまとめます。既に紹介したものの再掲も含みます。

  • ユーザーページにおいて、複数言語を切り替えながら音声入力のあとにテキスト入力をすると、翻訳機能が上手く作動しない場合があります。そのような場合はユーザーページを再度読み込んでください。
  • 8-2 章 で紹介したカスタム語彙において、csv に日本語の文字を書くことはできません。

9. リソースの削除方法

QnABot の削除はマネジメントコンソールからできます。

マネジメントコンソールの CloudFormation において、作成したテンプレートを選択して「削除」をクリックすればリソースの削除が可能です。削除には少し時間がかかります。

クリックすると拡大します


10. 料金

QnABot は多くのサービスを組み合わせたソリューションのため、利用料金が不安な方も多いかと思います。加えて、CloudFormation でデプロイすると、お手軽な代わりに実際の規模感が分かりにくいという点を懸念される方もいるかもしれません。

そこで、このソリューションを実行するのにかかるコスト試算をご紹介します。

下の表は、2023 年 2 月現在、米国東部 (バージニア北部) の AWS リージョンにデフォルトの設定でソリューションをデプロイした場合の、月ごとのコスト試算の一例です。なお、本ソリューションの CloudFormation テンプレートでは Amazon KendraAmazon Connect は自動では作成されないので、コスト概算からは省いています。

サービス名 仮定 コスト
Amazon API Gateway 1,000,000 件の RESTAPI リクエスト $3.50
Amazon Cognito 1,000 人のアクティブユーザー、アドバンストセキュリティなし $0
Amazon CloudFront 1,000,000 件のリクエスト $8.50
Amazon S3 100GB のデータ転送、1,000,000 件のリクエスト。 $3.27
AWS Lambda 実行時間 0.2 秒のリクエストが 2,000,000 件 $1.23
Systems Manager Parameter Store 2,000,000 件のリクエスト $0
Amazon Lex 100,000 テキストのリクエスト $75
Kinesis Data Firehose 100KB のレコードが 100,000 件 $0.28
Amazon DynamoDB 1GB のストレージ、1秒あたり1回の読み込みと書き込み、20時間のアクセスのピーク $11.41
Amazon Polly 50 文字のリクエストが 10,000 件 $4
Amazon Translate (英語以外の利用で) 50 文字のリクエストが 10,000 件 $75
Amazon Comprehend 50 文字のリクエストが 100,000 件 $5
Amazon OpenSearch Service 4つの M6g.large インスタンスを常時稼働 $368.64
合計   $552.83

11. まとめ

今回の記事では「QnABot on AWS」ソリューションの概要や使い方を紹介しました。CloudFormation テンプレートを使ってセットアップするだけで、管理者としての質問文登録、ユーザとしての利用がいずれも簡単に実現できることをご理解いただけたのではないかと思います。

本ソリューションは、今回お伝えした機能以外にも、Amazon Connect や Amazon Kendra といった他サービスとの連携、より細かい設定といった多くの機能を提供しています。詳しく知りたい方は、管理者ページ左上のハンバーガーメニューから読める説明や デプロイガイド も参照してください。

builders.flash では、他にもさまざまな AWS ソリューションの紹介記事を投稿しています。これまでの記事は こちら の記事カテゴリーで「AWSソリューション紹介」に絞ってご覧ください。それでは、次回の記事もぜひお楽しみに!


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

川島 拓海 (Takumi Kawashima)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

2022 年 4 月に入社したソリューションアーキテクトです。好きなサービスは Amazon Translate。食べることが大好きです。あと、ちょっとだけお笑いが好きです。

監修者プロフィール

佐藤 裕介 (Yusuke Sato)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

ソリューションアーキテクトとして、製造業分野のお客様を中心に様々なお客様を支援させて頂いています。AWS と出会いクラウドの楽しさを知り、お客様にもクラウドの楽しさを知ってほしいと思い日々働いています。
好きなサービスは、AWS Lambda と Amazon Connect で、難しいことを考えずにシュッと使えるサービスが好きです。
プライベートでは双子男児の父で日々育児に翻弄されています。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する