Amazon Web Services ブログ
Amazon Kendraによる検索結果のチューニング
Amazon Kendra は、機械学習 (ML) を利用した、非常に正確で使いやすいエンタープライズ検索サービスです。ユーザーが Amazon Kendra で検索する時、表示される検索結果をチューニングできます。たとえば、より積極的にキュレーションされていたり、より信頼できる特定のデータソースからの結果を優先することができます。また、ユーザーが四半期レポートなどのドキュメントを頻繁に検索する場合は、最新の四半期レポートを最初に表示したほうが良いでしょう。
検索結果のチューニングにより、Amazon Kendra が検索結果の特定のフィールドまたは属性の重要性を処理する方法を変更できます。この投稿では、最良の結果を得るためにインデックスを手動で調整する方法について説明します。以下のビデオでは、どのように検索結果をチューニングするかについて簡易的に実演しています。
Amazon Kendra の 3 つの主な応答タイプ (FAQとのマッチング、提案された回答を引き出すための読解力、およびドキュメントのランキング) を理解することが重要です。検索結果のチューニングはドキュメントのランキングに影響します。加えて、検索結果のチューニングは、ユーザーの検索結果に影響する多くの要因の1つにすぎません。特定の結果を変更することはできませんが、Amazon Kendra が特定のフィールドや属性に適用する重要度を変更することはできます。
ファセット
フィールドに基づいてチューニングするので、それらのフィールドをインデックスにファセットする必要があります。たとえば、 author
フィールドの認知度を高めたい場合は、 author
フィールドをインデックスの検索可能なファセットにする必要があります。ファセットテーブルフィールドをインデックスに追加する方法の詳細については、カスタムドキュメント属性の作成 を参照してください。
検索結果チューニングの実行
検索結果のチューニングは、Amazon Kendra 検索コンソール、または Amazon Kendra API を使用して AWS マネジメントコンソールで行うなど、さまざまな方法で実行できます。チューニング時には、いくつかの異なるタイプのフィールドを使用することもできます。
- 日付フィールド – より最新の結果をブーストさせる。
- 数値フィールド – 再生回数のような数値フィールドに基づいてコンテンツを強調する。
- 文字列フィールド – より信頼できる情報源からのものであることなどを示すタグ付け等の文字列フィールドに基づき、結果を昇格させる。
前提条件
本投稿の手順を進めるためには、環境のセットアップが完了していること、サンプルデータセットのアップロードが完了していること、インデックスが作成済みであること、が前提条件になります。
環境のセットアップ
AWS CLIがインストール済みであることを確認してください。ターミナルを開き、新しい作業ディレクトリを作成してください。作業ディレクトリへ以下のファイルをダウンロードしてください。
- サンプルデータセット:
s3://aws-ml-blog/artifacts/kendra-relevance-tuning/ml-blogs.tar.gz
- インデックスを作成するサンプルスクリプト:
s3://aws-ml-blog/artifacts/kendra-relevance-tuning/create-index.py
データセットとスクリプトのダウンロードは以下のスクリーンショットをご参照ください。
データセットのアップロード
このユースケースでは AWS Machine Learning ブログの投稿から抜粋したデータセットを使用します。独自のデータセットを使用する場合は、さまざまなメタデータがあることを確認してください。可変文字列フィールドと日付フィールドがあることが理想的です。サンプルデータセットでは以下のようなフィールドがあります。
- 投稿者名 – その投稿の投稿者
- コンテンツタイプ – ブログ投稿またはホワイトペーパー
- トピックとサブトピック – トピックは
Machine Learning
サブトピックはComputer Vision
かML at the Edge
- コンテンツの言語 – 英語、日本語、またはフランス語
- 科学誌の引用数 – 本投稿においてはランダムに設定された数値
まず、Amazon Simple Stprage Service (Amazon S3) バケットを 2 つ作成します。必ずインデックスと同じリージョンに作成してください。このインデックスには 2 つのデータソースがあります。
ml-blogs.tar.gz
ファイルには 2 つのディレクトリがあります。ml-blogs.tar.gz ファイルを展開し、最初のディレクトリ bucket1
の中身を最初の S3 バケットに同期します。次に、2 つ目のディレクトリ bucket2
の内容を 2 つ目の S3 バケットに同期します。
データセットのダウンロードと S3 バケットへの同期は以下のスクリーンショットをご参照ください。
インデックスの作成
お好みのコードエディタで、冒頭にダウンロードした Python スクリプト create-index.py
を開きます。バケット名変数は、前の手順で作成した Amazon S3 バケットの名前を設定する必要があります。これらの行はコメントを消してください。
上記が完了したら python create-index.py
でスクリプトを実行してください。このスクリプトは以下を実行します。
- Amazon Kendra インデックスが Amazon S3 からデータを読み込み、Amazon CloudWatch Logsにログを書き込めるよう、AWS Identity and Access Management (IAM) ロールを作成します。
- Amazon Kendra インデックスを作成します。
- インデックスに2つの Amazon S3 データソースを追加します。
- インデックスにデータセットの異なるフィールドでの検索を許可する新しいファセットを追加します。
- データ同期ジョブを開始します。
検索結果チューニングの利用
データが適切にインデックス化され、メタデータによるファセットが利用可能になりました。検索結果チューニングがどのように検索結果に影響するか理解するための様々な設定をテストできます。
以下の例では、データソース、ドキュメントタイプ、新着順、人気を含む、様々な属性に基づいてチューニングを行っています。
信頼できるデータソースのブースト
最初に検討するチューニングは、データソースに基づくものです。たとえば、1 つのデータソースが適切にメンテナンスおよびキュレーションされ、もう 1 つは情報の正確性が低く古くなっている場合があります。ユーザーが検索を実行したときに最も関連性の高い結果が得られるように、信頼できるデータソースからの結果に優先順位を付ける必要があります。
インデックスを作成した時、2つのデータソースを作成しました。1つにはすべてのブログ投稿が含まれており、こちらがプライマリのデータソースになります。もう1つにはレガシーデータソースとして扱っているファイルが1つだけ含まれています。
インデックス作成スクリプトでは、_data_source_id
フィールドをファセット可能、検索可能、表示可能に設定しました。これは特定のデータソースでチューニングする上で必要なステップです。
以下のスクリーンショットは Amazon Kendra インデックスのインデックスフィールドです。
-
-
-
- Amazon Kendra 検索コンソールで
Textract
を検索してください。
- Amazon Kendra 検索コンソールで
結果はスキャンした文書からテキストとデータを自動的に抽出できるサービスである、 Amazon Textract に関する投稿を参照する必要があります。
以下のスクリーンショットはTextract
の検索結果です。検索結果には
Test_File.txt
というファイルがあるはずです。これは、あまりキュレーションされていないセカンダリのデータソースからのファイルです。この結果が検索結果のどこに表示されるかを書き留めておきます。この結果の優先順位を下げて、プライマリデータソースからの結果を増やしたいと考えています。- 検索結果チューニング ( Relevance tuning )を開くため、Tuning を選択します。
- Text fields の下で data source を展開します。
- プライマリのデータソースのスライダーを右にドラッグするとこのソースからの結果を増やすことができます。本投稿ではまず、8 にセットします。
- もう一度
Textract
で検索します。
セカンダリのデータソースのファイルが検索結果の下の方に移動していることが確認できます。
- スライダーを一番右にドラッグしブーストを 10 に設定したら、もう一度検索を実行します。
セカンダリデータソースの結果が検索結果の最初のページから消えていることがわかります。
以下のスクリーンショットは、あるデータソースにセカンダリブーストを適用した検索結果チューニングパネルと、セカンダリデータソースからの結果を排除した検索結果を示します。 -
- S3 バケットをデータソースとしてこのアプローチを使用しましたが、Amazon Kendra で利用可能などのデータソースにも優先順位を付けることができます。Amazon S3 データレイクからの結果を向上させて、Microsoft SharePoint システムからの結果の優先順位を下げることやその逆も可能です。
特定の文書タイプのブースト
このユースケースでは、AWS Machine Learning ブログの結果よりもホワイトペーパーの結果を重視しています。まず、ベースとなる検索結果を確認します。
- Amazon Kendra 検索コンソールを開き、
What is machine learning?
を検索します。
一番上の結果はホワイトペーパーからの回答ですが、次の結果はブログからのものです。
以下のスクリーンショットはWhat is machine learning?
の検索結果を示しします。
Amazon Kendra にホワイトペーパーを検索結果の上位に表示させるにはどうすればよいでしょうか?
まず、コンテンツのType
フィールドに基づいて検索結果を調整します。- Amazon Kendra コンソールで Relevance tuning パネルを開きます。
- Custom fields の下で Type を展開します。
- Type フィールドブーストスライダーを一番右までドラッグして、このフィールドの関連性を 10 に設定します。
また、特定の
Type
値、すなわちWhitepapers
の値を高めたいと考えます。- Advanced boostingを展開し、Add value を選択します。
- ホワイトペーパーはメタデータタイプの
“Type”: “Whitepaper”
で示されるので、値をWhitepaper
と入力し、ブースト値を 10 に設定します。 - Save を選択します。
次のスクリーンショットは、Whitepaperドキュメントタイプにタイプフィールドブーストを適用した検索結果チューニングパネルを示しています。
10 秒ほど待ってから、検索を再実行してください。上位の結果はすべてホワイトペーパーで、ブログ投稿の結果はリストのさらに下に表示されるはずです。
次のスクリーンショットは、What is machine learning? (機械学習とは ?)
の検索結果を示しています。タイプフィールドブーストが適用されています。- Type field boost の値を通常に戻してください。
ドキュメントの新着順によるブースト
数十年にわたるドキュメントの大規模なアーカイブがあったとしても、最新の回答の方が役に立ちます。たとえば、ユーザーが
Where is the IT helpdesk?(IT ヘルプデスクはどこ ?)
と尋ねたとします。彼らに最新の回答が与えられていることを確認したいです。これを実現するため、日付の属性に基づく新着順によるブーストが可能です。- Amazon Kendra 検索コンソールで
medical
を検索してください。
最初の検索結果は 2019 年 3 月 19 日に公開された、De-identify medical images with the help of Amazon Comprehend Medical and Amazon Rekognitionです。
以下のスクリーンショットは
medical
の検索結果です。
- 再度 Relevance tuning パネルを開いてください。
- Date タブで Custom fields を開いてください。
- PublishDate の Freshness boost を 10 に調整してください。
- 再度
medical
で検索してください。
今度は 2020 年 5 月 15 日に公開された Enhancing speech-to-text accuracy of COVID-19-related terms with Amazon Transcribe Medical が最初の検索結果となりました。
以下のスクリーンショットは新着順ブーストが適用されたのmedical
の検索結果です。 - Amazon Kendra 検索コンソールを開き、
- Advanced boosting を拡張して、特定の期間の結果を向上させることもできます。たとえば、四半期ごとの業績を発表する場合、Sensitivity range を過去 3 か月間に設定するとよいでしょう。これにより、直帰の四半期にリリースされたドキュメントが増え、ユーザーがそのドキュメントを見つけやすくなります。以下のスクリーンショットは検索結果チューニングパネルの新着順ブーストに関する部分で、 Sensitivity range を調整するスライダーを示します。
ドキュメントの人気度に基づくブースト
最後のシナリオは、数値に基づくチューニングです。このユースケースでは、科学雑誌からの引用数を表す乱数を各投稿に割り当てました。 (繰り返しになりますが、これらは単なる乱数であり、実際の引用番号ではありません !) 最も頻繁に引用される投稿を表示させたいです。
- よく使われているMLライブラリである
keras
の名前で検索します。
Amazon Kendra から提案される回答が表示される場合がありますが、上位の検索結果 (および引用数) は以下のようになるかと思います。
- Amazon SageMaker Keras – 81 件の参照
- Deploy trained Keras or TensorFlow models using Amazon SageMaker – 57 件の参照
- Train Deep Learning Models on GPUs using Amazon EC2 Spot Instances – 68 件の参照
- Relevance tuning パネルの Numeric タブで Citationsスライダーを 10 に設定してください。
- 引用数が多いものをブーストするよう、Ascending を選択してください。
次のスクリーンショットは、Citations カスタムフィールドに数値ブーストが適用された関連性チューニングパネルを示しています。
- よく使われているMLライブラリである
-
-
- 再度
keras
を検索し、結果を確認してください。
上位の検索結果は以下のようになっているはずです。
- Train and deploy Keras models with TensorFlow and Apache MXNet on Amazon SageMaker – 1,197 件の引用
- Using TensorFlow eager execution with Amazon SageMaker script mode – 2,434 件の引用
Amazon Kendra は、引用回数が多いドキュメントを優先して結果を表示しました。
結論
この投稿では、検索結果チューニングを使用してユーザーの Amazon Kendra 検索結果を調整する方法を説明しました。検索結果チューニングの仕組みを理解するために、小規模でやや合成的なデータセットを使用しました。実際のデータセットはもっと複雑なため、どのタイプの検索結果を優先させたいかをユーザーと協力して理解することが重要です。検索結果をチューニングすれば、Amazon Kendra のエンタープライズ検索から最大限の価値を引き出すことができます。Amazon Kendra の詳細については、YouTubeに公開されている AWS re:Invent 2019 – Keynote with Andy Jassy や Amazon Kendra FAQs’ , ‘What is Amazon Kendra? を参照してください。
サンプルデータセットとテクニカルレビューを提供してくれたTapodipta Ghoshに感謝します。この投稿は彼の助けなしには書けなかったでしょう。
この記事は Relevance tuning with Amazon Kendraを翻訳したものです。
著者について
James Kingsmill は、オーストラリア公共部門チームのソリューションアーキテクトです。彼は長年にわたり、公共部門の顧客がトランスフォーメーション、自動化、セキュリティの目標を達成できるよう支援することに興味を持っています。余暇には、シドニー近郊のブルー・マウンテンズでキャニオニングをしています。
- 再度