Amazon Web Services ブログ

Knowledge Bases for Amazon Bedrock がメタデータフィルタリングをサポートし検索精度向上

AWS re:Invent 2023 にて、Knowledge Bases for Amazon Bedrock の一般提供を発表しました。Knowledge Bases for Amazon Bedrock では、Retrieval Augmented Generation (RAG) をマネージドで提供し、Amazon Bedrock の基盤モデル (Foundation Model; FM) を自社のデータに安全に接続できます。

RAG ベースのアプリケーションでは、生成された応答の正確性は、基盤モデルに提供されたコンテキストに依存します。基盤モデルに提供されるコンテキストは、ユーザーのクエリに基づきベクトルストアから取得されます。

Knowledge Bases for Amazon Bedrock で最近リリースされた機能であるハイブリッド検索では、セマンティック検索とキーワード検索を組み合わせることができます。しかしながら多くの場合、特定の期間内に作成されたドキュメントや、特定のカテゴリでタグ付けされたドキュメントを取得する必要があります。ドキュメントのメタデータに基づくフィルタリングを行うことで検索精度が向上し、より適切な回答の生成が可能になります。このブログでは、Knowledge Bases for Amazon Bedrock の新しいカスタムメタデータフィルタリング機能について説明します。

この機能を使えば、ベクトルストアからの取得結果を事前にフィルタリングして、検索結果を改善できます。

メタデータフィルタリングの概要

メタデータフィルタリング機能がリリースされる以前は、意味的に関連するチャンクが基盤モデルの応答生成のためのコンテキストとして事前に設定された最大数まで返されていました。メタデータフィルタリングを使うことで、意味的に関連するチャンクだけでなく、適用されたメタデータフィルタに基づきサブセットを取得できるようになりました。

この機能により、ナレッジベース内の各文書に対してカスタムメタデータファイル (最大 10KB まで) を指定できるようになりました。データ取得時にベクトルストアに対してメタデータに基づき事前にフィルタリングした上で、関連する文書を検索できます。この方法により取得される文書を制御することができ、特にクエリの解釈が曖昧な場合に有効に機能します。例えば、文脈の異なる法的文書や、異なる年に公開された映画について、同様の用語が使われていても区別できます。さらに、検索対象となるチャンクの数を減らすことでパフォーマンスと正確性も向上します。

メタデータフィルタリング機能を使用するには、ソースデータファイルと同じ名前に .metadata.json のサフィックスを付けたメタデータファイルをソースデータファイルと一緒に提供する必要があります。メタデータは文字列、数値、ブール値のいずれかです。以下は、メタデータファイルの例です。

{
    "metadataAttributes" : { 
        "tag" : "project EVE",
        "year" :  2016,
        "team": "ninjas"
    }
}

Knowledge Bases for Amazon Bedrock のメタデータフィルタリング機能は、米国東部 (バージニア北部) と米国西部 (オレゴン) リージョンで利用可能です。

メタデータフィルタリングのよくあるユースケースは以下の通りです。

  • ソフトウェア企業のドキュメントチャットボット – このユースケースにおいては、ユーザーは製品情報やトラブルシューティングガイドを検索できます。オペレーティングシステムやアプリケーションのバージョンなどでフィルタリングすることで、古くて使われなくなったまたは関連性の低い文書を取得しないようにできます。
  • 組織のアプリケーションの会話型検索 – このユースケースにおいては、ユーザーはドキュメント、かんばん、会議の文字起こしなどのアセットを検索できます。部門、ビジネスユニット、プロジェクト ID などのメタデータフィルターを使って、チャット体験をパーソナライズしコラボレーションを向上させることができます。例えばプロジェクト「Sphinx」の状況やリスクについて尋ねると、ユーザーは特定のプロジェクトやソースタイプ (メールや会議文書など) に基づいてドキュメントを絞り込めます。
  • ソフトウェア開発者向けのインテリジェント検索 – このユースケースにおいては、開発者は特定のリリースに関する情報を探すことができます。リリースバージョン、文書タイプ (コード、API リファレンス、問題報告書など) によってフィルタリングすれば関連するドキュメントを絞り込めます。

ソリューションの概要

次のセクションでは、ナレッジベースとして使用するデータセットの準備方法、そしてメタデータフィルタリングを使用したクエリ実行方法を示します。AWS マネジメントコンソールまたは SDK を使用してクエリができます。

Knowledge Bases for Amazon Bedrock のデータセットの準備

この記事では、架空のゲームを題材にしたサンプルデータセットを使用して、Knowledge Bases for Amazon Bedrock でメタデータを取り込み・取得する方法を説明します。ご自身の AWS アカウントで実際に試す場合は、このファイルをダウンロードしてください。

既存のナレッジベースにメタデータを追加したい場合は、該当のファイル名とスキーマでメタデータファイルを作成し、「データとナレッジベースの同期」セクションに進んでデータの取り込みを開始してください。

サンプルデータセットでは、各ゲームのドキュメントは別々の CSV ファイル (例: s3://$bucket_name/video_game/$game_id.csv) で表され、次のカラムが含まれています。

titledescriptiongenresyearpublisherscore

各ゲームのメタデータには、.metadata.json というサフィックス (例: s3://$bucket_name/video_game/$game_id.csv.metadata.json) が付き、以下のスキーマを持っています。

{
  "metadataAttributes": {
    "id": number, 
    "genres": string,
    "year": number,
    "publisher": string,
    "score": number 
  }
}

ナレッジベースの作成

新しいナレッジベースを作成する手順については、ナレッジベースの作成を参照してください。
この例では、次の設定を使用します。

  • 「データソースを設定」ページにて、「チャンキング戦略」の項目で「チャンキングなし」を選択してください。前のステップで既に文書の前処理を行っているためです。
  • 「埋め込みモデル」セクションで、「Titan Embeddings G1 – Text」を選択します。
  • 「ベクトルデータベース」セクションで、「新しいベクトルストアをクイック作成」を選択します。メタデータフィルタリング機能は、サポートされているすべてのベクトルストアで利用できます。

データセットとナレッジベースの同期

ナレッジベースを作成した後、データファイルとメタデータファイルが Amazon Simple Storage Service (Amazon S3) バケットに入っていれば、データの取り込みを開始できます。手順については、ナレッジベースへのデータソースの同期と取り込み をご覧ください。

Amazon Bedrock コンソールからメタデータフィルタリングを用いたクエリ

Amazon Bedrock コンソールのメタデータフィルタリングオプションを利用するには、以下のステップを実行してください:

  1. Amazon Bedrock のコンソールにて、ナビゲーションペインからナレッジベースを選択します。
  2. 作成したナレッジベースを選択します。
  3. テストを選択します。
  4. 設定アイコンを押し、Filters セクションを開きます。
  5. genres = Strategy のように key = value という形式で条件を入力し Enter を押します。
  6. Key, Value, 演算子を変えるには条件を選択します。
  7. 残りの条件も同様に設定します。(例えば、(genres = Strategy AND year >= 2023) OR (rating >= 9))
  8. 完了したらクエリをテキストボックスに入力し、実行を選択します。

この記事では、“A strategy game with cool graphic released after 2023.” というクエリを入力します。

SDK からメタデータフィルタリングを用いたクエリ

SDK の Agents for Amazon Bedrock ランタイムを利用するには、まず以下のようにクライアントを作成します。

import boto3 

 bedrock_agent_runtime = boto3.client(
    service_name = "bedrock-agent-runtime"
)

次に、フィルタリング条件を記述します。(以下は一例です)

# genres = Strategy 
 single_filter = {
    "equals": {
        "key": "genres",
        "value": "Strategy"
    }
}

# genres = Strategy AND year >= 2023 
 one_group_filter = {
    "andAll": [ 
        {
            "equals": {
                "key": "genres",
                "value": "Strategy"
            }
        },
        {
            "GreaterThanOrEquals": {
                "key": "year",
                "value": 2023 
            }
        }
    ] 
}

# (genres = Strategy AND year >= 2023) OR score >= 9 
 two_group_filter = {
    "orAll": [ 
        {
            "andAll": [ 
                {
                    "equals": {
                        "key": "genres",
                        "value": "Strategy"
                    }
                },
                {
                    "GreaterThanOrEquals": {
                        "key": "year",
                        "value": 2023 
                    }
                }
            ] 
        },
        {
            "GreaterThanOrEquals": {
                "key": "score",
                "value": "9"
            }
        }
    ] 
}

Retrieval APIまたはRetrieveAndGenerate API のretrievalConfigurationにフィルターを渡してください:

retrievalConfiguration ={
        "vectorSearchConfiguration": {
            "filter": metadata_filter 
        }
    }

次の表に、メタデータフィルタリングの有無による応答例を示します。

クエリ メタデータフィルタリング 検索されたドキュメント 観察
“A strategy game with cool graphic released after 2023” オフ * Viking Saga: The Sea Raider, year:2023, genres: Strategy
* Medieval Castle: Siege and Conquest, year:2022, genres: Strategy
* Fantasy Kingdoms: Chronicles of Eldoria, year:2023, genres: Strategy
* Cybernetic Revolution: Rise of the Machines, year:2022, genres: Strategy
* Steampunk Chronicles: Clockwork Empires, year:2021, genres: City-Building
条件 (genres = Strategy and year >= 2023) を満たすゲームは 2/5
オン * Viking Saga: The Sea Raider, year:2023, genres: Strategy
* Fantasy Kingdoms: Chronicles of Eldoria, year:2023, genres: Strategy
条件 (genres = Strategy and year >= 2023) を満たすゲームは 2/2

カスタムメタデータに加えて、S3 プレフィックスを使ってフィルタリングすることも可能です (組み込みのメタデータなので、メタデータファイルを提供する必要はありません)。例えば、ゲーム文書をパブリッシャーごとにプレフィックスを切って整理している場合 (例: s3://$bucket_name/video_game/$publisher/$ game_id.csv)、以下の構文で特定のパブリッシャー (例: neo_tokyo_games) をフィルタリングできます。

publisher_filter = {
    "startsWith": {
                    "key": "x-amz-bedrock-kb-source-uri",
                    "value": "s3://$bucket_name/video_game/neo_tokyo_games/"
                }
}

後片付け

リソースを片付けるには、以下の手順を実行してください。

  1. ナレッジベースを削除する:
    1. Amazon Bedrock コンソールで、ナビゲーションペインの オーケストレーション の下にある ナレッジベース を選択します。
    2. 作成したナレッジベースを選択します。
    3. ナレッジベースの概要 セクションで、AWS Identity and Access Management (IAM) サービスロール名を確認します。
    4. ベクトルデータベース セクションで、コレクションの ARN を確認します。
    5. 削除 を選択し、”delete” と入力して確認します。
  2. ベクトルデータベースを削除する:
    1. Amazon OpenSearch Service コンソールで、ナビゲーションペインの サーバレス の下にある コレクション を選択します。
    2. 保存したコレクションの ARN を検索バーに入力します。
    3. コレクションを選択し、Delete を選択します。
    4. 確認プロンプトで「確認」と入力し、削除 を選択します。
  3. IAM サービスロールを削除する:
    1. IAM コンソールで、ナビゲーションペインの ロール を選択します。
    2. 先程確認したロール名を検索します。
    3. ロールを選択し、削除 を選択します。
    4. 確認プロンプトでロール名を入力し、削除します。
  4. サンプルデータセットを削除する:
    1. Amazon S3 コンソールで、使用した S3 バケットに移動します。
    2. プレフィックスとファイルを選択し、削除 を選択します。
    3. 確認プロンプトで「完全に削除」と入力して削除します。

まとめ

この記事では、Knowledge Bases for Amazon Bedrock におけるメタデータフィルタリング機能について説明しました。カスタムメタデータを追加し、Amazon Bedrock コンソールと SDK を使ってドキュメントの取得とクエリ実行時にそれらをフィルタとして使用する方法を説明しました。これにより、コンテキストの正確性が向上し、クエリ応答のさらなる関連性向上と、ベクトルデータベースのクエリコスト削減が実現できます。

その他のリソースについては、以下を参照してください。

翻訳は Solutions Architect 合田が担当しました。原文は こちらをご覧ください。