[新機能]Amazon BedrockでAWSの新しい埋め込みモデル「Titan Multimodal Embeddings G1」が発表されました #AWSreInvent

2023.11.30

はじめに

現在開催中のAWS re:Invent 2023。 Amazon Bedrockで新しい埋め込みモデル「Titan Multimodal Embeddings G1」が発表されました! こちらの発表内容について紹介します。

3行まとめ

  • Amazon Bedrockで新しい埋め込みモデルの「Titan Multimodal Embeddings G1」が利用可能になりました
  • 画像検索システム構築などのユースケースに適しているマルチモーダルな埋め込みモデルです
  • テキスト、画像、またはテキストと画像の組み合わせによる埋め込みが可能です

埋め込みモデルとは何か

埋め込みモデルとは自然言語など高次元なデータを低次元なベクトルに変換する際に利用するモデルです。 ベクトルに変換することで、データの特徴を抽出しやすくなります。 例えば、自然言語の場合は単語をベクトルに変換することで、単語の意味を表現できます。 類似性の高い単語はベクトル空間上で近くに位置するため、ベクトルの計算によって類似性を判定することができます。

使ってみた

モデルの有効化

2023/11/29時点では、 バージニア北部リージョン(us-east-1)とオレゴン(us-west-2)で利用可能です。

今回は、AWSのマネジメントコンソールで、バージニア北部リージョン(us-west-1)のAmazon Bedrockのサービスページを開きます。

画面左袖から[Model access]をクリック後、画面右上の[Manage model access]を押下します。

[Amazon]の[Titan Multimodal Embeddings G1]にチェックを入れて、[Save changes]で設定を保存します。これによってモデルが有効化されます。

モデル概要の確認

Amazon Bedrockのサービスページの画面左袖から[Getting] > [started] > [Providers] にアクセスして、Model providersのタブの中から[Amazon]を選択します。

画面下部のタブの中から[Titan Multimodal Embeddings G1]を選択すると、下図のようなモデル概要が表示されます。

プログラムの実行

2023/11/29時点では、Titan Multimodal Embeddings G1に対応するプレイグラウンドは用意されていないようです。 今回は以下の公式ブログを参考にプログラムから実行します。 具体的には、テキストと画像の組み合わせによる埋め込みの生成をやっていきます。

Amazon Titan Image Generator, Multimodal Embeddings, and Text models are now available in Amazon Bedrock | AWS News Blog

フォルダの作成:

ローカルにコードを保存するためのフォルダを作成します。 今回は[tmp-amazon-titan-embed-image-v1]という名前で作成しました。

画像の準備:

適当な画像を用意して、ローカルのフォルダに保存します。 今回は上記公式ドキュメントにあったイグアナの画像を利用します。 [iguana.png]というファイル名で保存しましょう。

空のpythonファイルを作成する:

今回はローカルのフォルダに[sample.py]という名前で作成しました。

必要なライブラリのインストール:

作成したフォルダのディレクトリで以下のコマンドを実行します。 今回はPythonのパッケージ管理ツールであるpoetryを利用して、必要なライブラリをインストールします。

poetry init

上記のコマンドを実行すると、ターミナルに設定に関するプロンプトが表示されますが、今回は全てデフォルトのままにしました。 続いて必要ならライブラリを追加します。

poetry add boto3 -D

最終的に以下のファイルが作成されます。

Titan Multimodal Embeddings G1を動かすプログラム:

[sample.py]にTitan Multimodal Embeddings G1を動かすためのコードを書きます。

import base64
import json

import boto3


def main():
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime", region_name="us-east-1"
    )

    # Maximum image size supported is 2048 x 2048 pixels
    with open("iguana.png", "rb") as image_file:
        input_image = base64.b64encode(image_file.read()).decode("utf8")

    # You can specify either text or image or both
    body = json.dumps(
        {"inputText": "Green iguana on tree branch", "inputImage": input_image}
    )

    response = bedrock_runtime.invoke_model(
        body=body,
        modelId="amazon.titan-embed-image-v1",
        accept="application/json",
        contentType="application/json",
    )

    response_body = json.loads(response.get("body").read())
    print(response_body.get("embedding"))


if __name__ == "__main__":
    main()
  • [region_name]にはモデルを有効化したリージョンを指定しましょう。
  • with句で画像を読み込み、base64エンコードしています。ファイル名に注意してください。
  • Titan Multimodal Embeddings G1のモデルIDは[amazon.titan-embed-image-v1]になります。その他のTitanモデルは以下の公式ドキュメントを参照してください。

レスポンスを確認する:

ターミナルでAWSのプロファイルを切り替え後、以下のコマンドを実行するとレスポンスが表示されます。

python sample.py

以下に出力の一部を記載しています。

[-0.015633494, -0.011953583, -0.022617092, ..snip.. 0.01323885, 0.00934365]

テキストと画像の組み合わせによる埋め込みで、ベクトルが生成されていることがわかります。

補足

作成したべクトルの利用方法

作成したベクトルをデータベースに登録しておけば、ユーザーが入力した別のテキストと画像の組み合わせなどの情報からベクトルを計算し、類似度が高い順に画像を表示することで、画像検索のようなユースケースを実現できます。なお、クエリ時にinputTextを利用すれば、ユーザーが入力したテキストから検索ができ、inputImageを利用すれば、ユーザーにアップロードした画像から検索ができるようです。

さいごに

生成AIモデルを利用した画像検索のようなユースケースは今はまだ少ない印象ですが、今後のAIの発展によってどんどん活用されていくかもしれませんね。 それではまた!

その他参考