Amazon Bedrockのマルチモーダルを利用して、画像検索アプリを作ってみる

記事タイトルとURLをコピーする

こんにちは。AWS CLIが福島です。

今回は、Amazon Bedrockのマルチモーダルを利用して、画像検索アプリを作ってみます。

画像検索のイメージ

先に画像検索のイメージを載せておきます。

画像は、AWSのサンプルアプリで使われている猫の画像を使わせてもらいました。

構成図

Webアプリの概要

画像追加

  • ①ユーザーがWebアプリに画像をアップロード
  • ②Webアプリが画像をS3にアップロード
  • ③WebアプリでBedrockを使い、画像のベクトル化
  • ④WebアプリでベクトルしたデータなどをAuroraに保存

画像検索

  • ①ユーザーがWebアプリに画像をアップロード
  • ②WebアプリでBedrockを使い、画像のベクトル化
  • ③WebアプリがAuroraから画像(ベクトル)検索

データベースのカラム

カラム名 データ型 説明
id uuid 一意の識別子
title text 画像のタイトル
embeddings vector(1024) ベクトル化したデータ
image_path text S3に保存している画像へのURL

手順

①メインリソースのデプロイ

  • Git から Clone
git clone https://github.com/kazuya9831/blog-sample.git
  • ディレクトリの移動
cd blog-sample/image-search
  • 変数の設定
STACK_NAME="image-search"
  • スタックのビルド
sam build --use-container --build-image public.ecr.aws/sam/build-python3.11
  • スタックのデプロイ
sam deploy

※デプロイには15分程度かかります。

②ALBへのターゲット(S3のVPCエンドポイントのIP)登録

  • S3のVPCエンドポイントのARNをCloudFormationのOutputから取得
S3_VPC_ENDPOINT_ARN=$(aws cloudformation describe-stacks \
    --stack-name "${STACK_NAME}" \
    --query "Stacks[].Outputs[?OutputKey=='S3VpcEndpointId'].OutputValue" \
    --output text
)
  • S3のVPCエンドポイントのIPアドレスを取得
S3_VPC_ENDPOINT_IP=$(aws ec2 describe-network-interfaces \
--network-interface-ids "${S3_VPC_ENDPOINT_ARN}" \
--query "NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress" \
--output text)
  • ELBのターゲットグループのARNをCloudFormationのOutputから取得
ELB_TARGET_GROUP_ARN=$(aws cloudformation describe-stacks \
    --stack-name "${STACK_NAME}" \
    --query "Stacks[].Outputs[?OutputKey=='ApplicationLoadBalancerTargetGroupArn'].OutputValue" \
    --output text
)
  • S3のVPCエンドポイントのIPアドレスをALBのターゲットに登録
aws elbv2 register-targets \
--target-group-arn "${ELB_TARGET_GROUP_ARN}" \
--targets Id="${S3_VPC_ENDPOINT_IP}",Port=443

③Auroraのセットアップ

Auroraのセットアップとして以下を実施します。

  • pgvectorの追加
  • bedrock_integrationのスキーマ作成
  • bedrock_kbのテーブル作成
  • インデックスの作成
  • bedrockユーザーの作成
  • bedrockユーザーへの権限設定
./tools/setup.sh

④Webアプリへアクセス

WebアプリのURLを確認し、ブラウザからアクセスします。

aws cloudformation describe-stacks \
    --stack-name "${STACK_NAME}" \
    --query "Stacks[].Outputs[?OutputKey=='ApplicationLoadBalancerDNSName'].OutputValue" \
    --output text

まずは画像を追加するため、「データの挿入」を押下します。

画像は今回、AWSのサンプルアプリで使っている猫の画像を使わせてもらいます。

wget https://d1.awsstatic.com/Developer%20Marketing/jp/magazine/sample/2024/images.2dd13d52369e3b347b9450315d69d7e819e55834.zip \
-O images.zip

「ファイルを選択」を押下し、画像を追加します。

1度に1枚しか追加できないため、繰り返して何枚か追加します。 何枚か追加できたら、トップページに戻り「画像検索」を押下します。

「ファイルを選択」を押下し、画像をアップロードし、「search」を押下します。

その後、検索結果が表示されます。

終わりに

今回は、Amazon Bedrockのマルチモーダルを利用して、画像検索アプリを作ってみました。 KnowledgeBase for Amazon Bedrockでも、マルチモーダルがサポートされると作り込みの部分が減るため、サポートされるのが待ち遠しいですね。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。