

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

Amazon Nova Multimodal Embeddings 是適用於 RAG 和語義搜尋應用程式的最先進多模態嵌入模型。它是第一個透過單一模型支援文字、文件、影像、影片和音訊的統一嵌入模型，能夠以領先的準確性實現跨模式擷取。Nova Multimodal Embeddings 會將這些內容類型對應至統一的語義空間，讓開發人員能夠執行單模態、跨模態和多模態向量作業。

Nova Embeddings API 可用於各種應用程式，例如：
+ 語義內容擷取和建議：為您的內容產生嵌入，然後使用它們來尋找類似的項目或為您的使用者提供個人化的建議。
+ 多模態搜尋：結合來自不同內容類型的嵌入，以啟用強大的跨模態搜尋功能。
+ RAG：從多模態內容，例如具有交錯文字和影像的文件產生嵌入，以強化 GenAI 應用程式的擷取工作流程。

# 主要功能

+ 在統一語意空間中支援文字、影像、文件影像、影片和音訊。上下文長度上限為 8K 個詞元或 30 秒的影片和 30 秒的音訊。
+ 同步和非同步 API：該 API 支援同步和非同步使用。
+ 大型檔案分割：非同步 API 透過為長文字、影片和音訊提供由使用者定義參數控制的 API 內建分割，讓您輕鬆使用大型輸入。模型會為每個區段產生單一嵌入。
+ 含音訊的影片：同時處理影片與音訊。API 可讓您指定要同時代表兩個模態的單一嵌入，還是分別代表影片和音訊串流的兩個個別嵌入。
+ 嵌入目的：Nova Multimodal Embeddings 可讓您根據預期的下游應用程式最佳化嵌入。支援的使用案例包括擷取 (RAG/搜尋)、分類和叢集。特定值取決於應用程式 (請參閱最佳實務)。
+ 維度大小：4 個維度大小，用於權衡嵌入準確度和向量儲存成本：3072；1024；384；256。
+ 輸入方法：您可以透過指定 S3 URI 或 Base64 編碼格式的嵌入來傳遞要嵌入的內容。

# Nova Multimodal Embeddings 的運作方式

+ 當一段內容透過 Nova 嵌入傳遞時，模型會將該內容轉換為通用數值格式，也稱為向量。向量是一組任意數值，然後可用於各種搜尋功能。為類似內容指定的向量比為非類似內容指定的向量更接近。例如，為可描述為「高興」的內容指定的向量與為「悲傷」等內容指定的向量相比，更接近於「愉快」等向量。

## 先決條件
<a name="w2aac25c13"></a>

若要使用多模態嵌入，您需要滿足下列條件：
+ 已安裝 Python
+ 已安裝的 AWS CLI
+ 使用 AWS 您帳戶的存取憑證設定的 AWS CLI
+  AWS 您的帳戶上啟用的 Nova Multimodal Embeddings 模型

啟用這些項目後，您可以執行非同步或同步嵌入請求。

## 同步產生嵌入
<a name="w2aac25c15"></a>

對於較小的內容項目，可以使用 Bedrock 執行時期 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 執行時期 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
```