

# Amazon Nova 埋め込みの使用
<a name="embeddings"></a>

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

コンテンツの一部が Nova Embeddings に渡されると、モデルはそのコンテンツをベクトルと呼ばれる汎用数値形式に変換します。ベクトルは、さまざまな検索機能に使用できる数値のセットです。類似コンテンツには、類似していないコンテンツよりも近いベクトルが与えられます。

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

## 主な特徴
<a name="embeddings-features"></a>

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

## 埋め込みの生成
<a name="embeddings-examples"></a>

 埋め込みを生成するには、以下を実行します。

テキストの同期埋め込み: 

```
import boto3
import json

# 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))
```

 次を試してみましょう: 

```
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: 
    print(e) 
 
print('Request ID:', response.get('ResponseMetadata').get('RequestId')) 
response_body = json.loads(response.get('body').read()) 
print(json.dumps(response_body, indent=2))
```

 動画の非同期埋め込み: 

```
 import boto3 
 
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://my-bucket/path/to/video.mp4'} 
            }, 
            'segmentationConfig': { 
                'durationSeconds': 15  # Segment into 15 second chunks 
            }, 
        }, 
    }, 
}
```

 次を試してみましょう: 

```
response = bedrock_runtime.start_async_invoke( 
        modelId='amazon.nova-2-multimodal-embeddings-v1:0', 
        modelInput=model_input, 
        outputDataConfig={ 
            's3OutputDataConfig': { 
                's3Uri': 's3://my-bucket' 
            } 
        }, 
    ) 
except Exception as e: 
    print(e) 
 
print('Request ID:', response.get('ResponseMetadata').get('RequestId')) 
print('Invocation ARN:', response.get('invocationArn'))
```

**バッチ推論**

 バッチ推論では、複数のリクエストを送信し、非同期で埋め込みを生成できます。バッチ推論は、単一のリクエストを送信し Amazon S3 バケットにレスポンスを生成することで、多数のリクエストを効率的に処理するのに役立ちます。
+  作成するファイルでモデル入力を定義したら、ファイルを S3 バケットにアップロードします。
+  次に、バッチ推論リクエストを送信し、S3 バケットを指定します。
+ ジョブが完了したら、S3 から出力ファイルを取得できます。
+  バッチ推論を使用すると、大規模なデータセットでのモデル推論のパフォーマンスを向上させることができます。

**バッチ推論データをフォーマットしてアップロードする**

モデル呼び出しジョブを送信するときに選択または指定する S3 の場所にバッチ推論データを追加する必要があります。S3 の場所には、次の項目が含まれている必要があります。

 モデル入力を定義する少なくとも 1 つの JSONL ファイル。JSONL には JSON オブジェクトの行が含まれています。JSONL ファイルは拡張子 .jsonl で終わり、次の形式である必要があります。

```
{
    "recordId": "record001",
    "modelInput": {
        "taskType": "SINGLE_EMBEDDING",
        "singleEmbeddingParams": {
            "embeddingPurpose": "GENERIC_INDEX",
            "embeddingDimension": 3072,
            "text": {
                "source": {
                    "s3Location": {
                        "uri": "s3://batch-inference-input-bucket/text_001.txt",
                        "bucketOwner": "111122223333"
                    }
                },
                "truncationMode": "END"
            }
        }
    }
}
```

**サポートされている入力ファイルタイプ**
+ 画像形式: PNG、JPEG、WEBP、GIF
+ オーディオ形式: MP3、WAV、OGG
+ 動画形式: MP4、MOV、MKV、WEBM、FLV、MPEG、MPG、WMV、3GP