RevComm Tech Blog

コミュニケーションを再発明し 人が人を想う社会を創る

Amazon Bedrock で実現するユーザーごとの RAG 環境構築 - メタデータフィルタリングの活用法

はじめに

Full-stack チームの豊崎です。

RevComm では、MiiTel Analytics の議事録作成をはじめ、LLM を用いた機能開発が活発に行われています。

今回、社内ユーザーが誰でも利用できる RAG 環境を作成しました。これは、RAG 環境をユーザーに提供するための PoC として実施したものです。

構成

この PoC では、プロダクトへの直接的な機能の埋め込みは行わず、以下のような構成で実装しました。

  • Amazon Bedrock, Amazon Bedrock Knowledge Bases
  • ベクターストア: Pinecone
  • データソース: S3
  • dynamoDB
  • Python
    • langchain
    • streamlit
    • etc…

問題点

この PoC を開始した時点での主な課題は、次の疑問から生まれました。

"Amazon Bedrock Knowledge Basesを使って、どのようにユーザーごとにRAG環境を提供できるのか?"

各ユーザーに個別の Amazon Bedrock Knowledge Bases を作成することは現実的ではなく、この課題に苦心しました。

結論として、ベクトルストアからデータを取得する際のフィルタリング機能が不可欠だと判明しました。

メタデータフィルタリング

Amazon Bedrock Knowledge Bases にはメタデータフィルタリングという機能があります。

これこそが、私の課題を解決する機能でした。

使い方

Knowledge Bases のデータソースに配置される各文書に対して、カスタムメタデータファイル(.metadata.json)を作成する必要があります。

このメタデータを利用して、ベクトルデータのフィルタリングを行います。

今回の目的はユーザーごとの RAG 環境提供ですが、このフィルタリングにより検索対象のチャンク数を削減でき、パフォーマンスと正確性の向上も実現できます。

以下がmetadata.jsonのフォーマットです。

) miitel_analytics_dashboard_overview.pdf をデータソースに配置した場合
// miitel_analytics_dashboard_overview.pdf.metadata.json
{
  "metadataAttributes": {
      "session_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
      "user_id": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
  }
}

metadataAttributes配下には、フィルタリング時に利用したい key-value を設定できます。

私は、ユーザーがファイルをアップロードする際に、このメタデータファイルが自動生成されるように実装しました。

サンプル (Python)

今回、私はlangchain_community.retrievers.bedrockで提供されているAmazonKnowledgeBasesRetrieverを利用しました。以下にそのサンプルコードを掲載します。

先ほどのmetadata.jsonで設定したsession_iduser_idをここで指定しています。

retriever = AmazonKnowledgeBasesRetriever(
    knowledge_base_id=BEDROCK_KNOWLEDGE_BASE_ID,
    retrieval_config={
        "vectorSearchConfiguration": {
            "numberOfResults": 10,
            "filter": {
                "andAll": [
                    {
                        "equals": {
                            "key": "session_id",
                            "value": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
                        },
                    },
                    {
                        "equals": {
                            "key": "user_id",
                            "value": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
                        },
                    },
                ]
            },
        },
    },
)

まとめ

今回は、Amazon Bedrock Knowledge Bases のメタデータフィルタリング機能について紹介しました。この機能により、ユーザーごとに独自の RAG 環境を提供しながら、不要なベクトルデータを効率的に除外することが可能となりました。

当初目標とした「社内の人が誰でも使える RAG 環境」は実現できましたが、以下のような課題が残されています:

  • データソースとの連携間隔
  • 本番環境での実装の実現性
  • etc...

今後は、プロダクトへの RAG 環境の実装検討をさらに進め、MiiTel ユーザーの業務効率化により一層貢献できるよう取り組んでいきます。

ご清覧ありがとうございました。