

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

Amazon Nova Multimodal Embeddings 是一种先进的多模态嵌入模型，可用于智能体 RAG 和语义搜索应用程序。这是首个通过单一模型支持文本、文档、图像、视频和音频的统一嵌入模型，可实现具有领先准确性的跨模态检索。Nova Multimodal Embeddings 将各种内容类型映射到统一的语义空间中，使开发人员能够进行单模态、跨模态和多模态向量操作。

Nova Embeddings API 可支持各种应用场景，例如：
+ 语义内容检索和推荐：为您的内容生成嵌入，然后用来查找相似项目或向用户提供个性化推荐。
+ 多模态搜索：将不同内容类型的嵌入进行组合，实现强大的跨模态搜索功能。
+ RAG：利用多模态内容（例如含有交错文本和图像的文档）生成嵌入，从而支持生成式人工智能应用程序的检索工作流。

# 主要功能

+ 支持在统一的语义空间中使用文本、图像、文档图像、视频和音频。最大上下文长度为 8K 令牌或 30s 视频和 30s 音频。
+ 同步和异步 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>

要使用 Multimodal Embeddings，您需要满足以下前提：
+ 已安装了 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
```