Amazon Bedrock Knowledge BasesとAmazon S3 Vectorsを用いて、画像とメタデータによる部品検索を試してみた #AWSreInvent

Amazon Bedrock Knowledge BasesとAmazon S3 Vectorsを用いて、画像とメタデータによる部品検索を試してみた #AWSreInvent

部品の画像と属性情報を組み合わせた部品検索をAmazon Bedrock Knowledge BasesとAmazon S3 Vectorsで試してみました。
2025.12.08

この記事はクラスメソッド発 製造業 Advent Calendar 2025の8日目です。

製造業のユースケースを想定して、画像とメタデータを組み合わせた部品検索をAmazon Bedrock Knowledge BasesとAmazon S3 Vectorsを用いて試してみます。

先日、Amazon Bedrock Knowledge BasesでAmazon Nova Multimodal Embeddingsを使った画像埋め込みによるマルチモーダル検索がサポートされました。これまでは、Amazon Bedrock Data Automation(BDA)で画像やPDFなどをテキストに変換してから検索するアプローチが中心でしたが、今回のアップデートにより、画像そのものをベクトル化して検索で使えるようになりました。

一方で、Amazon S3 Vectorsは、S3上にベクトルインデックスを管理できるベクトルストアで、低コストかつマネージドで利用できます。元々プレビューとして利用可能でしたが、先日のアップデートによりGAになり、東京リージョンでも利用可能となりました。機能としては、キーワードでの部分一致検索とのハイブリッド検索はできないものの、ベクトル類似度検索とメタデータによるフィルタリングには対応しています。シンプルなRAG / ナレッジベース用途など小さく始める場合に向いています。

製造業の現場では、たとえば「このネジは何か?」「似たようなネジを探したい」といった、画像から部品を特定・類似検索したいケースがありそうです。このとき、画像だけに頼るのではなく、事前に測定した「ねじの呼び径(例: M6)」「長さ(例: 20mm)」「材質」「表面処理」といった情報をメタデータとして持たせておくと、より効率よく候補を絞り込めます。また、リクエストしているユーザーの部署や拠点といったメタデータで検索対象を制限すると、ユーザーごとに閲覧すべきデータに絞ることもできます。

そこで本記事では、こうしたユースケースを想定して、

  • 部品の属性情報をメタデータとして登録し、
  • 画像+メタデータを組み合わせて部品検索を行う

という流れを、Amazon Bedrock Knowledge BasesとAmazon S3 Vectorsを使って試してみます。

なお、Nova Multimodal Embeddingsは2025年12月8日時点ではus-east-1(バージニア北部)のみ利用可能なため、検証はus-east-1リージョンで行います。

やってみる

今回は画像データとして、家にあったネジを写真で撮り、それを用います。今回は機能の検証が目的なので、簡易的に2種類のネジを撮影し、そのうちの1つに対して写真を2枚撮り、長さが異なるネジとして登録します。

Pythonを用いてCSVからJSON形式のメタデータファイルを作成し、その後、マネジメントコンソールを中心に各リソースの作成や検証を行います。

メタデータの作成

まずは、エクセルなどでメタデータを作成し、CSVに出力します。今回利用するCSVは次のようなものです。

image_file,part_number,thread_size,length_mm
m4-20.jpg,SCREW-TAP-M4-20,M4,20
m4-30.jpg,SCREW-TAP-M4-30,M4,30
m3-6.jpg,SCREW-PAN-M3-6-BK,M3,6

以下のPythonスクリプトを用いて、CSVからJSON形式のメタデータファイルを作成します。

import csv
import json
from pathlib import Path

DATA_DIR = Path("data")
CSV_PATH = DATA_DIR / "parts.csv"

def main():
    with CSV_PATH.open(encoding="utf-8-sig") as f:
        reader = csv.DictReader(f)
        for row in reader:
            print(row)
            image_file = row["image_file"].strip()
            meta = {
                "metadataAttributes": {
                    "part_number": row["part_number"].strip(),
                    "thread_size": row["thread_size"].strip(),
                    "length_mm": int(row["length_mm"]),
                }
            }

            # 画像ファイルと同じ場所に <filename>.metadata.json を作成
            meta_path = DATA_DIR / f"{image_file}.metadata.json"
            print(f"write {meta_path}")
            with meta_path.open("w", encoding="utf-8") as out:
                json.dump(meta, out, ensure_ascii=False, indent=2)

if __name__ == "__main__":
    main()

画像ファイルとparts.csvをdata/に配置し、pythonスクリプトを実行します。

python3 main.py

実行後、data/に画像ファイルごとに画像ファイル名.metadata.jsonが作成されます。
1つ中身を見てみると、各属性ごとにCSVで指定した値が入っています。

{
  "metadataAttributes": {
    "part_number": "SCREW-PAN-M3-6-BK",
    "thread_size": "M3",
    "length_mm": 6
  }
}

S3バケットの作成とデータのアップロード

まずは2つのS3バケットを作成します。

  • データソース用のS3バケット
  • マルチモーダルストレージ用のS3バケット: データソース用とは異なるバケットを利用することが推奨されます
    • ナレッジベース作成時にマルチモーダルストレージ用S3 URIに、s3://バケット名/パスプレフィックス/ のように指定すると、エラーになったため、バケットを直接指定する必要があるようです。

参考: Prerequisites for multimodal knowledge bases - Amazon Bedrock

マネジメントコンソールからS3バケットを開き、2つのS3バケットをそれぞれデフォルト設定で作成します。その際、リージョンがus-east-1になっていることを確認してください。

alt text

データソース用のS3バケットにdata/内のファイルをアップロードします。
S3バケットを選択して、オブジェクト一覧ページを開き、そこからアップロード画面に移動します。フォルダの追加をクリックし、data/を選択しアップロードします。
一覧にアップロード対象のファイルが表示されるので、不要なparts.csvは選択して削除します。
右下のアップロードボタンからアップロードします。

alt text

ナレッジベースの作成

次にナレッジベースを作成します。Bedrockのナレッジベースの画面を開き、作成ボタンから"ベクトルストアを含むナレッジベース"を選択します。

alt text

ナレッジベース名を入力し、Bedrockのサービスロールを作成して使用を選択します。

alt text

データソースにはデフォルトのS3を選択し、次に進みます。

alt text

データソース名を入力し、S3のURIには先程データをアップロードした場所のURIを入力します。
alt text

チャンキング(分割)などは不要なので、解析戦略にはデフォルトパーサー、チャンキング戦略にはチャンキングなしを選びます。

alt text

埋め込みモデルにはAmazon Nova Multimodal Embeddingsを選択し、ベクトルデータベースはクイック作成とS3 Vectorsを選択します。

alt text

マルチモーダルストレージの保存先に、先程作成したS3バケットを指定して次に進みます。
alt text

最後に確認画面で設定内容を確認し、問題なければ右下から作成します。
数十秒から数分で作成が完了します。

作成後、ナレッジベースの画面に自動的に遷移されるので、データソース一覧のところから"同期"します。

alt text

しばらくして、同期が完了すると、同期が完了した旨の表示とデータソースのステータスが利用可能になります。

alt text

画像検索の検証

ナレッジベースページの右側の"ナレッジベースをテスト"からナレッジベースの動作を確認することができるため、試してみます。

alt text

テスト画面が開いたら、まずは画像をフィルタ無しで画像を検索してみます。応答生成には対応していないため、取得応答生成で取得のみを選択します。次に右下のチャット欄でクリップアイコンから画像を添付します。この時、画像の拡張子がjpgには対応していないようで、jpegに変更してアップロードする必要があります。(ちなみに、ナレッジベースのデータソースにはjpgが含まれていても動作していました。テスト画面の入力としてjpgに対応していないようです。)

alt text

右下の送信アイコンのボタンを押すと、検索結果が表示されます。詳細ボタンを押すとスコアも表示されます。

alt text

では、次にメタデータで絞り込んでみます。

左側のフィルターから手動フィルターを有効にし、length_mm <= 20 を入力して指定します。その後、再度検索を実行します。

alt text

検索結果として、メタデータのlength_mmが20以下のものに制限して表示されました。
alt text

<=の演算子以外にも一致=や配列に含まれるかどうか:などの演算子も利用できるようです。詳細は以下のドキュメントを参照してください。

さいごに

今回はBedrock Knowledge BasesとS3 Vectorsを使って、簡単に画像とメタデータからの部品検索を試すことができました。今回試した内容以外でも、Bedrock Knowledge Basesでは音声や動画などもベクトル化して検索したり、音声やPDF、動画、画像などをテキストに変換し、検索できます。製造業に限らずですが、さまざまなユースケースで活用できそうです。費用も安く始めることができるため、まずは小さな検証から色々試してみてください!

参考

この記事をシェアする

FacebookHatena blogX

関連記事