Amazon Kendra による機械学習を活用した情報検索を試してみた
2023-12-25
azblob://2023/12/25/eyecatch/2023-12-25-amazon-kendra-tutorials-000.png

こんにちは、株式会社FIXERの村上です。

社内の業務データを基にして、Amazon Bedrock(TitanやClaudeなどのLLMを含む)を使用し、生成される回答に独自データの要素を含めたい場合があります。効率的かつ高精度な独自データを含む回答を生成するためには、RAG(検索拡張生成)という手法を利用することができます。このRAGを用いることで、検索結果を大規模言語モデル(LLM)の生成結果に組み込み、より正確な回答を生成することが可能になります。

本ブログでは、AWS上でRAGを実装する場合によく利用される『Amazon Kendra』を用いて、特定のデータセットに対する検索結果の検証を行います。

■ Amazon Kendra とは

Amazon Kendra は、機械学習を用いた企業向けの情報検索サービスです。このサービスは主に以下の2つの機能を提供します。 

(1)あいまい検索機能:利用者の検索意図を理解し、関連する情報を提供します。 
(2)他サービスとの統合機能:様々な業務アプリケーションやデータベースと連携します。 

これらの機能により、企業や組織が蓄積した大量のドキュメントやマニュアルを学習し、従業員が必要な情報を迅速に検索することが可能になります。

■ Amazon Kendra の基本料金

このサービスはエンタープライズ向けに設計されており、機械学習機能を提供するためのコストがかかるため、料金は比較的高額になります💸


 デベロッパー版は月額810ドル、エンタープライズ版は月額1,008ドルの固定費用が必要です。デベロッパー版の場合、最初の30日間は最大750時間まで無料で利用できるので、まずはこの枠内で試すことをお勧めします。なお、無料利用枠を使用しても、他のサービスとの接続にかかるコネクト費用は従量課金されます。

【参考】Amazon Kendraの料金 - アマゾン ウェブ サービス

■ 事前準備

Amazon Kendra に独自データを取り込ませるためには外部ストレージやデータベースを事前に用意する必要があります。今回はシンプルにS3バケットを作成して、独自データを取り込ませてみます。

S3バケット名:techblog-kendra-datasorce-bucket 

オブジェクト(フォルダ):document 

※バケット内部のフォルダは必須ではありませんが、Kendraに分析させたいデータ量を調整するために作成することを推奨します。

■ Amazon Kendra を構築してみる

(1)インデックスの作成

Amazon Kendraを利用するためには、インデックス と呼ばれる独自データを管理するデータの集合体 を作成する必要があります。

インデックスでは、下記の3要素を含む各種データをデータソースから抽出します。

  1. テキスト情報(PDF、Word文書、HTMLなど)
  2. メタデータ属性(タイトル、作成日、最終更新日など)
  3. カスタム属性(各ドキュメントごとに属性の追加が可能)

① インデックス名とCloudWatchにログを収集するためのIAMロールを設定します。

② 『Developer Edition』 を選択します。

作成ボタンをポチッと押して、30秒ほど待つとインデックスが作成されます。


(2)データソースの作成

③ S3やRDS/Aurora、外部サービスから独自データをAmazon Kendraに同期させるため、データソースを構成します。

④ 今回は、S3バケットを使ってみます。

⑤ データソース名とデータソースの言語(日本語)を選択します。

⑥ S3サービスとAmazon Kendraを連携するためのIAMロールを新規作成します。

⑦ 独自データを保管することになるS3バケットの指定とAmazon Kendraとの同期タイミングを設定します。

データソースの作成が完了しました。

Amazon Kendraの構築は以上です。

■ Amazon Kendra に独自データをインポートする

今回の独自データは、Microsoftの「Contoso Corporation」の紹介ページを使用します。

【参考】Contoso Corporation の概要

S3バケットに評価用のPDFデータをインポートします。

Amazon KendraのデータソースとS3バケットを同期します。『Sync now』をポチッと押します。Current sync stateを確認すると、crawling(情報の読込み)とindexing(索引付け)を Amazon Kendraは実施しています。

PDFファイル3枚のデータ容量で10分ほどかかりました。

■ Amazon Kendra による情報検索を試してみる


コンソールからSearch indexed contentを選択することでテストすることができます。また、データソースの作成時に言語を日本語に設定したため、クエリの言語も必ず日本語に切り替えてください。他の言語でクエリを実行しても、検索されません。

ドキュメント内の単語を使って質問してみました。
Q1. Contoso Corporationはどのような企業ですか?
A. [一部抜粋] Contoso Corporation は、パリに本社を置く多国籍企業です。 同社は、100,000 を超える製品を持つ製造、販売、およびサポート組織です。

正解ですね。抽出してほしい情報を抜き出すことに成功しました。

ドキュメント内の単語ではワーカーと表示されているが、日本語(労働者)で質問してみました。
Q2. Contoso Corporationの本社には何人の労働者がいますか?
A. [一部抜粋] サテライトオフィスには平均250⼈の労働者がいます。

これは間違いですね。本社には25,000人いるため、250人ではないです。ワーカー=労働者と認識はしてくれませんでした。

念の為、「ワーカー」に置換して質問してみました。
Q3. Contoso Corporationの本社には何人のワーカーがいますか?
A. [一部抜粋] 本社には 25,000 ⼈のワーカーがいます。

正解です。

最後に企業全体の労働者を計算させてみます。
Q4. Contoso Corporationに所属するHeadquarters、地域ハブ、およびサテライトオフィスのワーカーの総数は何人ですか?
A. 回答不能

コンテンツ情報の悪い可能性がありますが、複雑な質問はダメなようです(AIでどうにかしてくれないかな・・・)。

■ 最後に

最後まで読んでいただき、大変ありがとうございます。
Amazon Kendraを試してみた結果、1つのデータソースを使用する場合、SharePointやTeamsなどの検索機能と同様の機能があることがわかりました。複数のデータソースを組み合わせることで、より高い精度の情報検索が可能だと思いますが、調整や検証には時間がかかるかもしれません。

もし完全に一致する単語で情報検索するのであれば、割り切って使うこともありですね。

■ 参考サイト