

# Nova Embeddings の使用
<a name="nova-embeddings"></a>

Amazon Nova Multimodal Embeddings は、エージェント RAG およびセマンティック検索アプリケーション向けの最先端のマルチモーダル埋め込みモデルです。これは、テキスト、ドキュメント、画像、動画、オーディオを 1 つのモデルでサポートする最初の統合埋め込みモデルであり、優れた精度でクロスモーダル検索を可能にします。Nova Multimodal Embeddings は、これらの各コンテンツタイプを統一されたセマンティックスペースにマッピングし、デベロッパーが単一モーダル、クロスモーダル、マルチモーダルのベクトルオペレーションを実行できるようにします。

Nova Embeddings API は、次のようなさまざまなアプリケーションで活用できます。
+ セマンティックコンテンツの取得とレコメンデーション: コンテンツの埋め込みを生成し、それらを使用して類似アイテムを検索したり、パーソナライズされたレコメンデーションをユーザーに提供します。
+ マルチモーダル検索: さまざまなコンテンツタイプの埋め込みを組み合わせて、強力なクロスモーダル検索機能を有効にします。
+ RAG: インターリーブテキストや画像を含むドキュメントなどのマルチモーダルコンテンツから埋め込みを生成し、GenAI アプリケーションの取り出しワークフローを強化します。

# 主な機能

+ 統合されたセマンティックスペースでのテキスト、イメージ、ドキュメントイメージ、動画、オーディオのサポート。最大コンテキスト長は、8K トークンまたは 30秒の動画と 30秒のオーディオです。
+ 同期 API と非同期 API: API は、同期と非同期の両方の使用をサポートしています。
+ 大規模なファイルセグメンテーション: 非同期 API では、ユーザー定義のパラメータで制御されるロングテキスト、動画、オーディオ用に API で構築されたセグメンテーションを提供することで、大規模な入力を簡単に操作できます。モデルは、セグメントごとに 1 つの埋め込みを生成します。
+ 音声付き動画: 音声付き動画を同時に処理します。API を使用すると、両方のモダリティを表す 1 つの埋め込みか、動画ストリームとオーディオストリームをそれぞれ表す 2 つの別々の埋め込みかを指定できます。
+ 埋め込み目的: Nova Multimodal Embeddings を使用すると、意図したダウンストリームアプリケーションに応じて埋め込みを最適化できます。サポートされているユースケースには、取得 (RAG/Search)、分類、クラスタリングなどがあります。特定の値はアプリケーションによって異なります (「ベストプラクティス」を参照)。
+ ディメンションサイズ: 埋め込み精度とベクトルストレージコストをトレードオフする 4 つのディメンションサイズ: 3072、1024、384、256。
+ 入力方法: S3 URI を指定するか、base64 エンコーディングとしてインラインを指定して、埋め込むコンテンツを渡すことができます。

# Nova Multimodal Embeddings の仕組み

+ コンテンツの一部が Nova Embeddings に渡されると、モデルはそのコンテンツをベクトルと呼ばれる汎用数値形式に変換します。ベクトルは、さまざまな検索機能に使用できる任意の数値のセットです。類似コンテンツには、類似していないコンテンツよりも近いベクトルが与えられます。たとえば、「ハッピー」と表現できるコンテンツには、「悲しみ」のようなベクトルではなく、「嬉しい」のようなベクトルに近いベクトルが与えられます。

## 前提条件
<a name="w2aac25c13"></a>

Multimodal Embeddings を使用するには、以下が必要です。
+ Python のインストール
+ AWS CLI のインストール
+ ‬AWS CLI は AWS アカウントのアクセス認証情報で構成されています。
+ AWS アカウントで有効になっている Nova Multimodal Embeddings モデル

これらを有効にすると、非同期または同期の埋め込みリクエストを実行できます。

## 埋め込みを同期的に生成する
<a name="w2aac25c15"></a>

より小さなコンテンツ項目の場合は、Bedrock Runtime InvokeModel API を使用できます。これは、テキスト、イメージ、または短いオーディオ/動画ファイルの埋め込みをすばやく生成する優れたオプションです。

次の例では、「Hello World\!」というテキストの同期埋め込みを生成します。

```
import json
import boto3

# Create the Bedrock Runtime client.
bedrock_runtime = boto3.client(
    service_name="bedrock-runtime",
    region_name="us-east-1",
)

# Define the request body.
request_body = {
    "taskType": "SINGLE_EMBEDDING",
    "singleEmbeddingParams": {
        "embeddingPurpose": "GENERIC_INDEX",
        "embeddingDimension": 3072,
        "text": {"truncationMode": "END", "value": "Hello, World!"},
    },
}

try:
    # Invoke the Nova Embeddings model.
    response = bedrock_runtime.invoke_model(
        body=json.dumps(request_body, indent=2),
        modelId="amazon.nova-2-multimodal-embeddings-v1:0",
        accept="application/json",
        contentType="application/json",
    )
    
except Exception as e:
    # Add your own exception handling here.
    print(e)
    
# Print the request ID.
print("Request ID:", response.get("ResponseMetadata").get("RequestId"))

# Print the response body.
response_body = json.loads(response.get("body").read())
print(json.dumps(response_body, indent=2))
```

出力は次のようになります。

```
   Request ID: fde55db5-c129-423b-c62d-7a8b36cf2859
{
  "embeddings": [
    {
      "embeddingType": "TEXT",
      "embedding": [
        0.031115104,
        0.032478657,
        0.10006265,
        ...
      ]
    }
  ]
}
```

## 非同期的に埋め込みを生成する
<a name="w2aac25c17"></a>

より大きなコンテンツファイルの場合は、Bedrock Runtime StartAsyncInvoke 関数を使用して、埋め込みを非同期的に生成できます。これにより、アプリケーションの実行をブロックすることなく、ジョブを送信し、後で結果を取得できます。結果は Amazon S3 に保存されます。

次の例では、動画ファイルの非同期埋め込み生成ジョブを開始します。

```
import boto3

# Create the Bedrock Runtime client.
bedrock_runtime = boto3.client(
    service_name="bedrock-runtime",
    region_name="us-east-1",
)

model_input = {
    "taskType": "SEGMENTED_EMBEDDING",
    "segmentedEmbeddingParams": {
        "embeddingPurpose": "GENERIC_INDEX",
        "embeddingDimension": 3072,
        "video": {
            "format": "mp4",
            "embeddingMode": "AUDIO_VIDEO_COMBINED",
            "source": {
                "s3Location": {"uri": "s3://amzn-s3-demo-bucket/path/to/video.mp4"}
            },
            "segmentationConfig": {
                "durationSeconds": 15  # Segment into 15 second chunks
            },
        },
    },
}

try:
    # Invoke the Nova Embeddings model.
    response = bedrock_runtime.start_async_invoke(
        modelId="amazon.nova-2-multimodal-embeddings-v1:0",
        modelInput=model_input,
        outputDataConfig={
            "s3OutputDataConfig": {
                "s3Uri": "s3://amzn-s3-demo-bucket"
            }
        },
    )

except Exception as e:
    # Add your own exception handling here.
    print(e)

# Print the request ID.
print("Request ID:", response.get("ResponseMetadata").get("RequestId"))

# Print the invocation ARN.
print("Invocation ARN:", response.get("invocationArn"))
```

出力は次のようになります。

```
   Request ID: 07681e80-5ce0-4723-cf52-68bf699cd23e
   Invocation ARN: arn:aws:bedrock:us-east-1:{{111122223333}}:async-invoke/g7ur3b32a10n
```

非同期ジョブを開始したら、invocationArn を使用して GetAsyncInvoke 関数でジョブのステータスを確認します。最近の非同期呼び出しとそのステータスを表示するには、ListAsyncInvokes 関数を使用します。

 非同期埋め込みの生成が完了すると、アーティファクトは出力先として指定した S3 バケットに書き込まれます。このファイルは次の構造になります。

```
   {{amzn-s3-demo-bucket}}/
    {{job-id}}/
        segmented-embedding-result.json
        embedding-audio.jsonl
        embedding-image.json
        embedding-text.jsonl
        embedding-video.jsonl
        manifest.json
```