はじめに
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
builders.flash メールメンバー登録
builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。
1. Amazon BedrockとAmazon OpenSearch Serverless をどう使うか
みなさまご存知の ChatGPT の裏側では大規模言語モデル (LLM) と呼ばれる基盤モデルが使われていますが、基盤モデルを API で簡単に使うことができる AWS の機械学習サービスである Amazon Bedrock は、AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon の LLM や画像生成モデルを取り揃えています。
中でも Amazon が提供している Titan という基盤モデルのラインナップの中に Titan Multimodal Embeddings (Titan マルチモーダル埋め込み) というモデルがあり、これが今回の立役者となります。
1-1. Embeddings (埋め込み) とは
まずは、Embeddings (埋め込み) ってなんなの ? という疑問にお答えしていこうと思います。
こちらに、テキストを埋め込みモデルでベクトルにした際のイメージ図を示します。天気に関するテキストが 2 つと富士山に関するテキストが 1 つあり、それぞれをベクトルに変換して二次元にプロットしました。
右側のプロットを見ると、天気に関するテキスト同士は近くにありますが、富士山のテキストはそれらとは離れてプロットされています。このように、埋め込みによって意味的に近いデータ同士は似たベクトルに変換されるため、ベクトル間の距離が近くなります。この特性を利用して、類似するデータを検索することができます。

1-2. Multimodal Embeddings (マルチモーダル埋め込み) とは
次は Amazon Titan で使えるマルチモーダル埋め込みです。
上図はテキスト埋め込みの例でしたが、Titan Multimodal Embeddings は、画像とテキストをまとめてベクトルにすることができます。こちらの図は、Titan Multimodal Embeddings でベクトルを作成するイメージ図です。
画像とテキストの両方、もしくはいずれか一方を入力として推論を行うと、サイズ 1024 のベクトルがひとつ出力されます。
埋め込みモデルを使ってデータをベクトルに変換できたら、次は距離が近いベクトルを探す「ベクトル検索」の方法を考える必要があります。
今回は Amazon OpenSearch Serverless のベクトル検索機能を使います。Amazon OpenSearch Serverless は、複数の近似 k-NN ライブラリやアルゴリズムに対応しているため、データ量や必要な精度に応じて適切な方法を選択することができます。詳細は こちらの記事 や こちらのスライド をご参照ください。
ところで、画像とテキストをまとめてベクトルにすることが、ほしい写真を検索することにどう効果があるのでしょうか?百聞は一見にしかず、実際に試して確認していきましょう !

2. 写真検索アプリのデプロイ
というわけで、以下のような構成の検索アプリのサンプルコードを用意しました。こちらをデプロイしてどのように写真検索ができるかみてみましょう。
AWS CDK と React を使って実装
この写真検索アプリは AWS CDK と React を使って実装されているため、各種設定をしたのちデプロイコマンドを実行するだけで、みなさまの AWS 環境にアプリをデプロイすることができます。遊び終わったらリソースを削除するのも簡単です。
それでは、以下の手順で写真検索アプリをデプロイしていきます。
2-1. Step 1 : AWS CDK スタックデプロイ環境の準備
まずは写真検索アプリをデプロイするための環境を準備します。
Docker、Node.js、AWS CLI 実行環境が整っていれば、みなさまが普段お使いの PC から CDK スタックをデプロイすることが可能です。
ご自身の環境を変えたくない場合や、ライブラリの依存関係などでうまくデプロイできない場合は、AWS Cloud9 をデプロイ環境として使うのが便利です。AWS Cloud9 のセットアップは こちらの AWS CloudShell を使う方法 が簡単でおすすめです。
AWS Cloud9 が利用できない場合、こちらのブログ をご参考に AWS IDE Toolkits または AWS CloudShell をご利用ください。
2-2. Step 2 : サンプルコードを GitHub から取得
ファイル一式を取得
コマンド
$ git clone https://github.com/aws-samples/image-search-titan-multimodal-cdk
2-3. Step 3 : 手順に従って AWS CDK スタックをデプロイ
2-4. Step 4 : 写真検索アプリで遊ぼう !
2-5. Step 5 : リソースの削除
遊び終わったら、不要になったリソースを削除することをおすすめします。今回使用しているサービスのほとんどは使った際に料金が発生する従量課金ですが、Amazon OpenSearch Serverless のみリソースを削除するまで課金が継続発生するため、不要になったら必ず CDK スタックの削除を実行して下さい。
以下のコマンドを実行するとすべてのリソースを削除することができます。コマンドを実行後、リソースを削除するかどうか聞かれたら y を入力して削除を実行してください。
CDK スタックの削除
コマンド
$ npm run cdk:destroy
3. さいごに
この記事では、Amazon Bedrock で使える Titan Multimodal Embeddings モデルと、Amazon OpenSearch Serverless のベクトル検索機能を使った写真検索アプリをご紹介しました。これらのサービスを活用することで、シンプルな構成で写真検索アプリを作ることができました。また、マルチモーダルの埋め込みを使うことで、テキストのみを検索キーとして写真を検索できるなどその効果をお伝えできたと思います。
この記事が、みなさまの検索機能の強化に役立てば幸いです。
~ 後日談 ~

CDK スタックをデプロイ・・・。カチャカチャカチャ・・・ッターン !

ミケ、何してるにゃ ?

タマの普通の顔の写真を指定しつつ、このキーワードと一緒に検索・・・ッターン !!

・・・聞こえてないみたいにゃ

やりました ! 探してたタマの笑顔の写真が見つかりました !

ミケ談 : タマの爽やかな笑顔を切り取った奇跡の一枚です。
参考情報
筆者プロフィール
大渕 麻莉
アマゾン ウェブ サービス ジャパン合同会社
機械学習ソリューションアーキテクト
組込みソフトウェア開発から画像処理アルゴリズム開発を経てクラウドに到達し、2019 年にアマゾン ウェブ サービス ジャパン合同会社に入社。以来、社内外のイベントで機械学習セッションをしたりサンプルコードを書いたりしながら、お客様の機械学習導入・運用の技術サポートに従事。
脳内 CPU の半分が猫のことで占められており、視界に入るすべての生き物がうちの猫に見えるという日々を過ごしている。
