Amazon Connect AIエージェントで Bedrock Knowledge Base の S3 ドキュメントメタデータを使って回答を出し分けてみた

Amazon Connect AIエージェントで Bedrock Knowledge Base の S3 ドキュメントメタデータを使って回答を出し分けてみた

Amazon Connect AIエージェントと Bedrock Knowledge Base を組み合わせ、S3 メタデータを使ったナレッジのフィルタリングを検証しました。同一の Knowledge Base から会員グレードに応じた回答を出し分ける手法について紹介します。
2026.08.14

はじめに

Amazon Connect AIエージェントから Amazon Bedrock Knowledge Base を利用する構成で、検索対象のナレッジを条件に応じて分けたいケースがあります。

たとえば、問い合わせ内容、顧客属性、製品カテゴリ、契約プランなどに応じて、参照するナレッジを絞り込みたい場合です。

今回はその一例として、S3 に配置したナレッジファイルへ customer_segment メタデータを付与し、以下のように回答を出し分けられるか試しました。

  • customer_segment = premium のナレッジを検索し、専用サポート窓口の営業時間を回答する
  • customer_segment = standard のナレッジを検索し、通常サポート窓口の営業時間を回答する

Amazon Connect AIエージェント側では、Retrieve tool に customer_segment のフィルターを設定し、プレミアム会員向けナレッジとスタンダード会員向けナレッジを出し分けられるか確認しました。

ポイントは、ナレッジ本文ではなく、S3 側のメタデータで検索対象を分けることです。
今回の検証では、ナレッジ本文から会員種別を表す見出しや文言をできるだけ除外し、メタデータフィルターによって該当ファイルだけが返っていることをログで確認しました。

Amazon Connect のコンテンツタグと Bedrock Knowledge Base のメタデータの違い

以前、Amazon Q in Connect のコンテンツタグを使ってコンテンツセグメンテーションを試しました。

https://dev.classmethod.jp/articles/amazon-q-in-connect-content-tagging-segmentation/

現在は名称が変わり、Amazon Connect AIエージェントとして扱います。

Amazon Connect のドキュメントでは、コンテンツセグメンテーションについて、データソースタイプごとにタグ付け方法が異なることが説明されています。S3、Salesforce、SharePoint、Zendesk、ServiceNow の場合は、ナレッジベース作成後に個々のコンテンツへ Amazon Connect の TagResource API でタグを付けます。

一方、Bedrock Knowledge Base データソースの場合、コンテンツは Amazon Connect リソースとして保存されないため、TagResource API でのタグ付けは使用できず、Bedrock Knowledge Base データソース側でメタデータフィールドを定義する必要があります。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/multiple-knowledge-base-setup-and-content-segmentation.html#w2aac28c54c15

今回の違いを整理すると以下です。

データソース 分類情報の付け方 Retrieve tool での指定
Amazon Connect の S3、Salesforce、SharePoint、Zendesk、ServiceNow Amazon Connect の TagResource API でコンテンツにタグを付ける retrievalConfiguration.filter でタグを指定する
Bedrock Knowledge Base Bedrock Knowledge Base 側のメタデータフィールドとして定義する retrievalConfiguration.filter でメタデータフィールドを指定する

Retrieve tool 側のフィルター指定は似ていますが、分類情報をどこに持たせるかが異なります。

今回扱うのは後者です。
Bedrock Knowledge Base の S3 データソースに .metadata.json を置き、customer_segment をメタデータとして取り込ませます。

Bedrock Knowledge Base の S3 データソースでは、各ファイルに対応するメタデータファイルを fileName.extension.metadata.json という名前で、対象ファイルと同じ S3 フォルダに配置する必要があります。
includeForEmbedding により、メタデータを埋め込み時のテキストに含めるかも制御できます。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/s3-data-source-connector.html

前提

今回は以下を前提とします。

  • Amazon Bedrock Knowledge Base は作成済み
  • Knowledge Base のデータソースは S3
  • S3 バケット名は hirai-connect-knowledge-bases-test
  • 検証用の S3 プレフィックスは connect-ai-agent-test
  • Amazon Connect インスタンスは作成済み
  • 検証リージョンは ap-northeast-1

ナレッジベースは作成済みの状態から始めます。

cm-hirai-screenshot 2026-06-11 17.06.43
作成済みの Bedrock Knowledge Base

全体像

今回は、1 つの Bedrock Knowledge Base に 2 つのナレッジを登録し、Amazon Connect AIエージェントの Retrieve tool で検索対象を分けます。

検索対象を分けるために、S3 上の各ナレッジファイルに customer_segment メタデータを付与します。

ナレッジファイル customer_segment 想定する質問 期待する回答
premium-support-faq.txt premium プレミアム会員の営業時間 平日 9:00 から 20:00
standard-support-faq.txt standard スタンダード会員の営業時間 平日 10:00 から 17:00

Amazon Connect AIエージェント側では、Retrieve tool を 2 つ作成し、それぞれ異なるメタデータフィルターを設定します。

Retrieve tool フィルター 検索対象
RetrievePremiumKnowledge customer_segment = premium premium-support-faq.txt
RetrieveStandardKnowledge customer_segment = standard standard-support-faq.txt

この構成により、同じ Bedrock Knowledge Base を使いながら、ユーザーの質問内容に応じて検索対象のナレッジを分けられるかを確認します。

S3 に検証用ファイルを配置する

AWS CloudShell で以下のコマンドを実行し、S3 バケットに検証用のファイルを配置します。

今回は、ナレッジ本文だけを見ても会員種別が分かりにくいようにしています。
分類情報は本文ではなく .metadata.jsoncustomer_segment に持たせます。

BUCKET="hirai-connect-knowledge-bases-test"
PREFIX="connect-ai-agent-test"

mkdir -p kb-test-files
cd kb-test-files

cat > premium-support-faq.txt <<'EOF'
お客様は、専用サポート窓口を利用できます。
受付時間は平日 9:00 から 20:00 までです。

通常より優先的にオペレーターへ接続されます。
返金、契約変更、優先配送に関する問い合わせにも対応します。
EOF

cat > standard-support-faq.txt <<'EOF'
お客様は、通常サポート窓口を利用できます。
受付時間は平日 10:00 から 17:00 までです。

配送状況、アカウント情報、一般的なサービス利用方法について案内します。
優先対応や専用窓口は上位プラン向けサービスです。
EOF

cat > premium-support-faq.txt.metadata.json <<'EOF'
{
  "metadataAttributes": {
    "customer_segment": {
      "value": {
        "type": "STRING",
        "stringValue": "premium"
      },
      "includeForEmbedding": false
    },
    "document_type": {
      "value": {
        "type": "STRING",
        "stringValue": "faq"
      },
      "includeForEmbedding": false
    },
    "locale": {
      "value": {
        "type": "STRING",
        "stringValue": "ja_JP"
      },
      "includeForEmbedding": false
    }
  }
}
EOF

cat > standard-support-faq.txt.metadata.json <<'EOF'
{
  "metadataAttributes": {
    "customer_segment": {
      "value": {
        "type": "STRING",
        "stringValue": "standard"
      },
      "includeForEmbedding": false
    },
    "document_type": {
      "value": {
        "type": "STRING",
        "stringValue": "faq"
      },
      "includeForEmbedding": false
    },
    "locale": {
      "value": {
        "type": "STRING",
        "stringValue": "ja_JP"
      },
      "includeForEmbedding": false
    }
  }
}
EOF

aws s3 cp premium-support-faq.txt s3://$BUCKET/$PREFIX/premium-support-faq.txt
aws s3 cp premium-support-faq.txt.metadata.json s3://$BUCKET/$PREFIX/premium-support-faq.txt.metadata.json

aws s3 cp standard-support-faq.txt s3://$BUCKET/$PREFIX/standard-support-faq.txt
aws s3 cp standard-support-faq.txt.metadata.json s3://$BUCKET/$PREFIX/standard-support-faq.txt.metadata.json

aws s3 ls s3://$BUCKET/$PREFIX/

アップロード後、S3 には以下のように配置されます。

s3://hirai-connect-knowledge-bases-test/connect-ai-agent-test/
├── premium-support-faq.txt
├── premium-support-faq.txt.metadata.json
├── standard-support-faq.txt
└── standard-support-faq.txt.metadata.json

今回使うメタデータは以下です。

ファイル customer_segment document_type locale
premium-support-faq.txt premium faq ja_JP
standard-support-faq.txt standard faq ja_JP

ファイルを配置したあとは、Bedrock Knowledge Base のデータソースを同期します。同期しないと、追加したファイルやメタデータが Knowledge Base の検索対象に入りません。

Bedrock Knowledge Base 単体でフィルターを確認する

Amazon Connect AIエージェントに組み込む前に、Bedrock Knowledge Base のテスト画面でメタデータフィルターが効くか確認しました。

手動フィルターに以下を指定します。

customer_segment = premium

この状態で「営業時間を教えてください」と質問すると、premium-support-faq.txt 側の内容に基づく回答が返りました。

cm-hirai-screenshot 2026-06-11 13.07.00
Bedrock Knowledge Base のテスト画面で customer_segment = premium を指定している例

同様に、以下のフィルターに変更すると、standard-support-faq.txt 側のナレッジを検索できます。

customer_segment = standard

Bedrock Knowledge Base 単体でメタデータフィルターが効くことを確認できたため、次に Amazon Connect AIエージェントへ組み込みます。

Bedrock Knowledge Base を Amazon Connect と統合する

Amazon Connect 側で、作成済みの Bedrock Knowledge Base を利用できるように統合します。

cm-hirai-screenshot 2026-06-11 15.49.26
Amazon Connect から Bedrock Knowledge Base を利用できるように設定している画面

この統合により、Amazon Connect AIエージェントの Retrieve tool から Bedrock Knowledge Base を検索できるようになります。

Amazon Connect AIエージェントを作成する

Amazon Connect AIエージェントは以下の名前で作成しました。

SelfServiceOrchestratorVoice_KnowledgeFilterTestAgent

cm-hirai-screenshot 2026-06-11 15.58.34
Amazon Connect AIエージェントの設定画面

AI Prompt はデフォルトのまま変更していません。

今回検証した2つの質問では、デフォルトの AI Prompt のまま、Retrieve tool の指示テキストと Override Input Values によって検索対象を分けられました。
なお、複数の Retrieve tool を質問内容に応じて確実に選択させる場合、AWS ドキュメントではオーケストレーションプロンプトにもツール選択ルールを追加する方法が案内されています。

RetrievePremiumKnowledge

customer_segment = premium のナレッジを検索する Retrieve tool として、RetrievePremiumKnowledge を作成しました。

cm-hirai-screenshot 2026-06-11 15.59.06
RetrievePremiumKnowledge の設定画面

ツールの指示テキストは以下です。

プレミアム会員向けのナレッジを検索するツールです。
ユーザーがプレミアム会員、専用サポート、優先対応、プレミアム会員の営業時間、プレミアム会員の受付時間について質問した場合に使用してください。
このツールは customer_segment が premium のナレッジのみを検索します。
スタンダード会員や一般会員に関する質問には使用しないでください。

Override Input Values には以下を設定しました。

Key Value
retrievalConfiguration.filter.equals.key customer_segment
retrievalConfiguration.filter.equals.value premium

Bedrock Knowledge Base のテスト画面では customer_segment = premium と入力しましたが、Amazon Connect AIエージェントの Retrieve tool では、retrievalConfiguration.filter.equals.keyretrievalConfiguration.filter.equals.value に分けて指定します。

RetrieveStandardKnowledge

customer_segment = standard のナレッジを検索する Retrieve tool として、RetrieveStandardKnowledge を作成しました。

cm-hirai-screenshot 2026-06-11 15.59.21
RetrieveStandardKnowledge の設定画面

ツールの指示テキストは以下です。

スタンダード会員向けのナレッジを検索するツールです。
ユーザーがスタンダード会員、通常サポート、一般会員、スタンダード会員の営業時間、スタンダード会員の受付時間について質問した場合に使用してください。
このツールは customer_segment が standard のナレッジのみを検索します。
プレミアム会員や専用サポートに関する質問には使用しないでください。

Override Input Values には以下を設定しました。

Key Value
retrievalConfiguration.filter.equals.key customer_segment
retrievalConfiguration.filter.equals.value standard

これで、同じ Bedrock Knowledge Base を使いながら、Retrieve tool ごとに検索対象のメタデータを固定できます。

Amazon Connect フローに AI エージェントを組み込む

作成した Amazon Connect AIエージェントを、問い合わせフローから呼び出せるようにしました。

今回の主題は Retrieve tool のメタデータフィルターなので、問い合わせフローの詳細説明は省略します。

cm-hirai-SelfServiceOrchestration
問い合わせフローから Amazon Connect AIエージェントを呼び出している例

この状態で問い合わせフローを実行し、AI エージェントが Bedrock Knowledge Base を検索する際に customer_segment フィルターを使えるか確認します。

動作確認

設定後、Amazon Connect AIエージェントを呼び出して動作確認しました。

まず、ユーザーが以下のように質問しました。

プレミアム会員の営業時間を教えてください

回答は以下でした。

プレミアム会員の受付時間は平日の午前九時から午後八時までです。

期待通り、premium-support-faq.txt の内容に基づく回答が返っています。

次に、ユーザーが以下のように質問しました。

スタンダード会員の営業時間を教えてください

回答は以下でした。

スタンダード会員の受付時間は平日の午前十時から午後五時までです。

こちらも期待通り、standard-support-faq.txt の内容に基づく回答が返っています。

この時点で、Amazon Connect AIエージェントの回答としては、プレミアム会員向けとスタンダード会員向けでナレッジを出し分けられていることを確認できました。

使用モデルと応答時間

今回の検証ログでは、Orchestration のモデルとして以下が使われていました。

jp.anthropic.claude-haiku-4-5-20251001-v1:0

応答時間は、ユーザー発話を受け取ってから最終回答メッセージが出力されるまでの時間で確認しました。
今回のログでは以下でした。

質問 最終回答までの時間
プレミアム会員の営業時間を教えてください 約 5.3 秒
スタンダード会員の営業時間を教えてください 約 4.5 秒

プレミアム会員のケースでは、ユーザー発話を受け取った時刻と最終回答が出た時刻の差分は以下でした。

1781160932004 - 1781160926740 = 5264 ms

スタンダード会員のケースでは、以下でした。

1781160940006 - 1781160935511 = 4495 ms

今回の検証では、Bedrock Knowledge Base の検索と回答生成を含めて、数秒程度で回答が返ることを確認できました。
ただし、この時間は検証環境、問い合わせフロー、モデル、ナレッジ量、リージョン、実行タイミングなどによって変わるため、性能値として一般化するものではありません。

ログでフィルタリングを確認する

画面上の回答だけでなく、Amazon Connect AIエージェントのログでもフィルタリングされていることを確認しました。

見るポイントは以下の 2 つです。

  • tool_useargumentsretrievalConfiguration.filter が含まれていること
  • tool_result で該当する S3 ファイルだけが返っていること

プレミアム会員向けツールのログ

プレミアム会員の営業時間を質問したとき、ログでは RetrievePremiumKnowledge が呼び出されていました。

ログの tool_use には、以下のように customer_segment = premium のフィルターが含まれています。

{
  "type": "tool_use",
  "tool_id": "RetrievePremiumKnowledge",
  "name": "RetrievePremiumKnowledge",
  "arguments": {
    "retrievalConfiguration": {
      "knowledgeSource": {
        "assistantAssociationIds": [
          "76c5d546-4cf5-4104-be6b-136e5b52d192"
        ]
      },
      "filter": {
        "equals": {
          "key": "customer_segment",
          "value": "premium"
        }
      }
    },
    "retrievalQuery": "プレミアム会員営業時間"
  }
}

このログから、Amazon Connect AIエージェントが Bedrock Knowledge Base に対して、以下のフィルター条件を指定して検索していることが分かります。

customer_segment = premium

さらに、tool_result では以下の S3 ファイルが返っていました。

s3://hirai-connect-knowledge-bases-test/connect-ai-agent-test/premium-support-faq.txt

回答ログも以下のとおりです。

プレミアム会員の受付時間は平日の午前九時から午後八時までです。

この一連のログから、RetrievePremiumKnowledge の呼び出し時に customer_segment = premium が指定され、premium-support-faq.txt が返っていることを確認できました。

スタンダード会員向けも同様に確認できた

スタンダード会員の営業時間を質問した場合も、同様に RetrieveStandardKnowledge が呼び出され、customer_segment = standard のフィルターが含まれていました。

ログ上では、以下の条件で検索していることを確認できました。

{
  "filter": {
    "equals": {
      "key": "customer_segment",
      "value": "standard"
    }
  },
  "retrievalQuery": "スタンダード会員営業時間"
}

tool_result では、スタンダード会員向けの S3 ファイルが返っていました。

s3://hirai-connect-knowledge-bases-test/connect-ai-agent-test/standard-support-faq.txt

回答ログも以下のとおりです。

スタンダード会員の受付時間は平日の午前十時から午後五時までです。

これにより、プレミアム会員向けだけでなく、スタンダード会員向けでもメタデータフィルターが適用されていることを確認できました。

まとめ

Amazon Connect AIエージェントから Bedrock Knowledge Base を利用する構成で、S3 メタデータ customer_segment によるナレッジのフィルタリングを確認しました。

Bedrock Knowledge Base 側では .metadata.jsoncustomer_segment を設定し、Amazon Connect AIエージェント側では Retrieve tool の Override Input Values に retrievalConfiguration.filter.equals.keyretrievalConfiguration.filter.equals.value を設定しました。

ログ上でも、Retrieve tool の呼び出し時に customer_segment = premium または customer_segment = standard のフィルターが含まれ、対応する S3 ファイルだけが返っていることを確認できました。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事