こんにちは、株式会社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要素を含む各種データをデータソースから抽出します。
- テキスト情報(PDF、Word文書、HTMLなど)
- メタデータ属性(タイトル、作成日、最終更新日など)
- カスタム属性(各ドキュメントごとに属性の追加が可能)
① インデックス名と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」の紹介ページを使用します。
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などの検索機能と同様の機能があることがわかりました。複数のデータソースを組み合わせることで、より高い精度の情報検索が可能だと思いますが、調整や検証には時間がかかるかもしれません。
もし完全に一致する単語で情報検索するのであれば、割り切って使うこともありですね。