

# Amazon Nova 的多模态支持
<a name="modalities"></a>

**注意**  
本文档适用于 Amazon Nova 版本 1。如需 Amazon Nova 2 多模态文档，请访问[多模态理解](https://docs.aws.amazon.com/nova/latest/nova2-userguide/using-multimodal-models.html)。

Amazon Nova 理解模型是多模态理解模型，这意味着它们支持多模态输入，例如图像、视频和文档，以便根据提供的内容推断和回答问题。Amazon Nova 模型具有多种新颖的视觉功能，使模型能够理解和分析图像、文档和视频，从而实现多模态理解应用场景。

下节概述了在 Amazon Nova 中处理图像、文档和视频的指南，包括采用的预处理策略、代码示例和需要考虑的相关限制。

**Topics**
+ [按模态划分的支持内容类型](#modalities-content)
+ [图像理解](modalities-image.md)
+ [视频理解](modalities-video.md)
+ [文档理解](modalities-document.md)
+ [错误处理](text-error-handing.md)

## 按模态划分的支持内容类型
<a name="modalities-content"></a>

以下信息详细说明了媒体文件支持的文件格式和接受的输入方法。


| 媒体文件类型 | 支持的文件格式 | **输入方法** | 解析策略 | 
| --- |--- |--- |--- |
| Image | PNG、JPG、JPEG、GIF、WebP | Base64 Amazon S3 URI | 图像视觉理解 | 
| 文本文档 *（仅限 Converse API）* | CSV、XLS、XLSX、HTML、TXT、MD、DOC | 字节 Amazon S3 URI | 仅根据文档理解文本。 | 
| 媒体文档 *（仅限 Converse API）* | PDF、DOCX | 字节 Amazon S3 URI | 穿插图像理解的文本 | 
| 视频 | MP4、MOV、MKV、WebM、FLV、MPEG、MPG、WMV、3GP | Base64 Amazon S3 URI | 视频视觉理解 | 

**注意**  
最多可以包含计算机中的五个文件或 Amazon S3 中的 1000 个文件。从 Amazon S3 上传时，每个文件不得超过 1 GB。从计算机上传时，上传文件的总大小不能超过 25 MB，从 Amazon S3 上传时，上传文件的总大小不能超过 2 GB。

由于总有效载荷限制为 25 MB，请确保考虑 base64 开销。在工作时，请记住，库和框架会占用内存，传递的媒体内容会迅速累积。使用视频时，指定 `s3Location` 应该可以缓解许多存储问题。

**注意**  
无论采用何种输入方法，大型视频和文档都需要时间来处理。如果 boto3 SDK 在等待 Amazon Bedrock 响应时超时，请确保您设置了适当的 [read\$1timeout](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html) 值并将 boto3 升级到最新版本 1.38。

# 图像理解
<a name="modalities-image"></a>

**注意**  
本文档适用于 Amazon Nova 版本 1。如需 Amazon Nova 2 图片理解指南，请访问[图片理解](https://docs.aws.amazon.com/nova/latest/nova2-userguide/using-multimodal-models.html#image-understanding)。

Amazon Nova 模型允许您在有效载荷中包含多个图像，总有效载荷限制为 25 MB。但是，您可以指定包含图像的 Amazon S3 URI 以便理解图像。这种方法允许您利用模型来获取更大的图像和更多图像，而不受 25 MB 有效载荷限制约束。Amazon Nova 模型可以分析传递的图像并根据您提供的指令回答问题、对图像进行分类以及汇总图像。

## 图像大小信息
<a name="modalities-image-resolution"></a>

为了提供尽可能好的结果，Amazon Nova 会根据图像的宽高比和原始分辨率自动重新缩放，以调整输入图像的大小。对于每张图像，Amazon Nova 首先确定最接近 1:1、1:2、1:3、1:4、1:5、1:6、1:7、1:8、1:9、2:3、2:4 及其转置的宽高比。然后重新缩放图像，使图像的至少一边大于 896 px 或原始图像较短边的长度，同时保持最接近的宽高比。最大分辨率为 8000 x 8000 像素

## 边界框检测
<a name="modalities-image-bounding"></a>

Amazon Nova Lite 和 Amazon Nova Pro 模型经过训练，可以精确检测图像中的边界框。如果目标是获取相关特定对象的坐标，此功能可能很有价值。Amazon Nova 模型的边界框检测功能使其成为图像接地任务的理想选择，从而可以增强对屏幕截图的理解。Amazon Nova 模型以 [0, 1000) 的比例输出边界框，在获得这些坐标后，作为后处理步骤，可以根据图像尺寸重新调整它们的大小。

## 图像到词元的转换
<a name="modalities-image-tokens"></a>

如前所述，将重新调整图像大小以最大限度地提取信息，同时仍保持宽高比。以下是示例图像尺寸和近似词元计算的一些示例。


| image\$1resolution（高 x 宽或宽 x 高） | 900 x 450 | 900 x 900 | 1400 x 900 | 1.8K x 900 | 1.3K x 1.3K | 
| --- |--- |--- |--- |--- |--- |
| 估计的词元数量 | \$1800 | \$11300 | \$11800 | \$12400 | \$12600 | 

因此，举个例子，假设示例图像的大小为 800 x 400，您需要估计此图像的词元数量。根据尺寸，为了保持 1:2 的宽高比，最接近的分辨率为 900 x 450。因此，此图像的近似词元数量约为 800 个词元。

# 图像理解限制
<a name="modalities-image-limitations"></a>

了解 Amazon Nova 的以下限制：
+ **多语言图像理解：**模型对多语言图像和视频帧的理解有限，在类似任务中可能会遇到困难或产生幻觉。
+ **人物识别**：Amazon Nova 模型不支持在图像、文档或视频中识别或命名个人的功能。模型将拒绝执行此类任务。
+ **空间推理**：Amazon Nova 模型的空间推理能力有限。它们可能很难完成需要精确本地化或布局分析的任务。
+ **图像/视频中的小文本**：如果图像或视频中的文本太小，可以考虑通过裁剪到相关部分来增加图像中文本的相对大小，同时保留必要的上下文。
+ **计数**：Amazon Nova 模型可以提供图像中对象的近似数量，但可能并不总是精确，尤其是在处理大量小型对象时。
+ **不当内容**：Amazon Nova 模型不会处理违反可接受使用政策的不当或露骨图像。
+ **医疗保健应用**：尽管 Amazon Nova 模型可以对医疗保健图像或视频进行一般分析，但由于这些构件的敏感性，我们不建议您解释复杂的诊断扫描。Amazon Nova 的回复绝不能替代专业的医学建议。

# 图像理解示例
<a name="modalities-image-examples"></a>

以下示例演示了如何使用 [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html) 向 Amazon Nova 模型发送图像提示。

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import base64
import boto3
import json
# Create a Bedrock Runtime client in the AWS Region of your choice.
client = boto3.client(
    "bedrock-runtime",
    region_name="us-east-1",
)

MODEL_ID = "us.amazon.nova-lite-v1:0"
# Open the image you'd like to use and encode it as a Base64 string.
with open("media/sunset.png", "rb") as image_file:
    binary_data = image_file.read()
    base_64_encoded_data = base64.b64encode(binary_data)
    base64_string = base_64_encoded_data.decode("utf-8")
# Define your system prompt(s).
system_list = [    {
        "text": "You are an expert artist. When the user provides you with an image, provide 3 potential art titles"
    }
]
# Define a "user" message including both the image and a text prompt.
message_list = [
    {
        "role": "user",
        "content": [
            {
                "image": {
                    "format": "png",
                    "source": {
                        "bytes": image // Binary array (Converse API) or Base64-encoded string (Invoke API)
                    },
                }
            },
            {
                "text": "Provide art titles for this image."
            }
        ],
    }
]
# Configure the inference parameters.
inf_params = {"maxTokens": 300, "topP": 0.1, "topK": 20, "temperature": 0.3}

native_request = {
    "schemaVersion": "messages-v1",
    "messages": message_list,
    "system": system_list,
    "inferenceConfig": inf_params,
}
# Invoke the model and extract the response body.
response = client.invoke_model(modelId=MODEL_ID, body=json.dumps(native_request))
model_response = json.loads(response["body"].read())
# Pretty print the response JSON.
print("[Full Response]")
print(json.dumps(model_response, indent=2))
# Print the text content for easy readability.
content_text = model_response["output"]["message"]["content"][0]["text"]
print("\n[Response Content Text]")
print(content_text)
```

要传递总有效载荷大于 25 MB 的大型图像文件或多个图像文件，可以使用 Amazon S3。以下示例演示了如何使用 Amazon S3 将图像上传到 Amazon Nova：

```
import boto3
import json
import base64
# Create a Bedrock Runtime client
client = boto3.client("bedrock-runtime", 
                      region_name="us-east-1", 
                     )
PRO_MODEL_ID = "us.amazon.nova-pro-v1:0"
LITE_MODEL_ID = "us.amazon.nova-lite-v1:0"
MICRO_MODEL_ID = "us.amazon.nova-micro-v1:0"
PREMIER_MODEL_ID = "us.amazon.nova-premier-v1:0"
messages = [
    {
        "role": "user",
        "content": [
            {
                "image": {
                    "format": "png",
                    "source": {
                        "s3Location": {
                            #Replace the s3 bucket URI 
                            "uri": "s3://demo-bucket/cat.png"
                            "bucketOwner" : "123456789012"
                        }
                    },
                }
            },
            {"text": "Describe the following image"},
        ],
    }
]
inf_params = {"maxTokens": 300, "topP": 0.1, "temperature": 0.3}
model_response = client.converse(
    modelId=LITE_MODEL_ID, messages=messages, inferenceConfig=inf_params
)
print("\n[Full Response]")
print(json.dumps(model_response, indent=2))
print("\n[Response Content Text]")
print(model_response["output"]["message"]["content"][0]["text"])
```

# 视频理解
<a name="modalities-video"></a>

**注意**  
本文档适用于 Amazon Nova 版本 1。如需 Amazon Nova 2 视频理解指南，请访问[视频理解](https://docs.aws.amazon.com/nova/latest/nova2-userguide/using-multimodal-models.html#video-understanding)。

Amazon Nova 模型允许您在有效载荷中包含单个视频，可采用 base64 格式提供，也可以通过 Amazon S3 URI 提供。使用 base64 方法时，总体有效载荷大小必须保持在 25 MB 以内。但是，您可以指定 Amazon S3 URI 来理解视频。此方法让您能够将模型用于更长的视频（最大可达 1 GB），而不受总体有效载荷大小限制的约束。Amazon Nova 模型可以分析传递的视频并回答问题，对视频进行分类，并根据提供的说明汇总视频中的信息。


| 媒体文件类型 | 支持的文件格式 | **输入方法** | 
| --- |--- |--- |
| 视频 | MP4、MOV、MKV、WebM、FLV、MPEG、MPG、WMV、3GP | Base64 *建议用于 25 MB 以下的有效载荷* | 
|  |  | Amazon S3 URI *建议用于大于 25 MB 但小于 2 GB 的有效载荷。单个文件必须为 1 GB 或更小。* | 

无论视频是作为 base64（只要符合大小限制）还是通过 Amazon S3 位置传递，视频输入词元数量都没有差异。

请注意，对于 3GP 文件格式，API 请求中传递的“格式”字段的格式应为“three\$1gp”。

使用 Amazon S3 时，请确保将视频的“Content-Type”元数据设置为正确的 MIME 类型。

## 视频大小信息
<a name="modalities-video-size"></a>

Amazon Nova 视频理解功能支持多宽高比。将所有视频的大小按畸变调整为（根据输入，可能是放大或缩小）**672 x 672 平方**尺寸，然后再将其馈送给模型。该模型根据视频的长度使用动态采样策略。对于 Amazon Nova Lite 和 Amazon Nova Pro，如果视频时长小于或等于 16 分钟，则采用每秒 1 帧 (FPS) 的采样率。但是，对于时长超过 16 分钟的视频，为了保持一致的 960 帧采样，采样率会降低，帧采样率会相应变化。这种方法旨在为较短的视频提供比较长的视频内容更准确的场景级视频理解。对于低动态视频，我们建议您将视频时长保持在 1 小时以内，对于任何较高动态的视频，请将视频时长保持在 16 分钟以内。对于 Amazon Nova Premier，1 FPS 采样率最高可达 3,200 帧。

在分析 4k 版本的视频和全高清版本视频时，应该没有区别。同样，采样率最多为 1 FPS，因此 60 FPS 的视频应该与 30 FPS 的视频的表现一样好。视频大小限制为 1 GB，因此使用高于所需分辨率和 FPS 并没有好处，而且会限制符合该大小限制的视频时长。您可能需要预处理大小超过 1 GB 的视频。

# 视频理解限制
<a name="modalities-video-limitations"></a>

了解 Amazon Nova 的以下限制：
+ **多语言图像理解：**模型对多语言图像和视频帧的理解有限，在类似任务中可能会遇到困难或产生幻觉。
+ **人物识别**：Amazon Nova 模型不支持在图像、文档或视频中识别或命名个人的功能。模型将拒绝执行此类任务。
+ **空间推理**：Amazon Nova 模型的空间推理能力有限。它们可能很难完成需要精确本地化或布局分析的任务。
+ **图像/视频中的小文本**：如果图像或视频中的文本太小，可以考虑通过裁剪到相关部分来增加图像中文本的相对大小，同时保留必要的上下文。
+ **计数**：Amazon Nova 模型可以提供图像中对象的近似数量，但可能并不总是精确，尤其是在处理大量小型对象时。
+ **不当内容**：Amazon Nova 模型不会处理违反可接受使用政策的不当或露骨图像。
+ **医疗保健应用**：尽管 Amazon Nova 模型可以对医疗保健图像或视频进行一般分析，但由于这些构件的敏感性，我们不建议您解释复杂的诊断扫描。Amazon Nova 的回复绝不能替代专业的医学建议。

## 视频词元
<a name="modalities-video-tokens"></a>

视频的时长是影响生成词元数量的主要因素。要计算近似成本，应将视频词元的估计数量乘以所使用的特定模型的每词元价格。

下表提供了 Amazon Nova Pro、Lite 和 Micro 的每个视频长度的帧采样和令牌利用率的一些近似值：


| video\$1duration | 10 秒 | 30 秒 | 16 分钟 | 20 分钟 | 30 分钟 | 45 分钟 | 1 小时 | 1.5 小时 | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |
| frames\$1to\$1sample | 10 | 30 | 960 | 960 | 960 | 960 | 960 | 960 | 
| sample\$1rate\$1fps | 1 | 1 | 1 | 0.755 | 0.5 | 0.35556 | 0.14 | 0.096 | 
| 估计的词元数量 | 2,880 | 8,640 | 276,480 | 276,480 | 276,480 | 276,480 | 276,480 | 276,480 | 

下表提供了 Amazon Nova Premier 的每个视频长度的帧采样和令牌利用率的一些近似值：


| video\$1duration | 10 秒 | 30 秒 | 16 分钟 | 20 分钟 | 30 分钟 | 45 分钟 | 1 小时 | 1.5 小时 | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |
| frames\$1to\$1sample | 10 | 30 | 960 | 1200 | 1800 | 2700 |  |  | 
| sample\$1rate\$1fps | 1 | 1 | 1 | 1 | 1 | 1 |  |  | 
| 估计的词元数量 | 2,880 | 8,640 | 276,480 | 345,600 | 518,400 | 777,600 |  |  | 

下表提供了 Amazon Nova Lite 1.5 的每个视频长度的帧采样和令牌利用率的一些近似值


| video\$1duration | 10 秒 | 30 秒 | 16 分钟 | 20 分钟 | 30 分钟 | 45 分钟 | 1 小时 | 1.5 小时 | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |
| frames\$1to\$1sample | 10 | 30 | 960 | 1200 | 1800 | 2700 |  |  | 
| sample\$1rate\$1fps | 1 | 1 | 1 | 1 | 1 | 1 |  |  | 
| 估计的词元数量 | 2,880 | 8,640 | 276,480 | 345,600 | 518,400 | 777,600 |  |  | 

# 视频理解限制
<a name="prompting-vision-limitations"></a>

以下是关键的模型限制，这些情况下可能无法保证模型的准确性和性能。
+ **一个请求生成一个视频：**目前模型仅支持一个请求生成一个视频。一些框架和库会使用内存来跟踪以前的交互。之前的上下文中可能已经添加了视频。
+ **不支持音频：**模型目前接受过训练，只能根据视频中的视觉信息来处理和理解视频内容。它们不具备分析或理解视频中存在的任何音频组件的能力。
+ **时间因果关系：**模型对整个视频过程中事件因果关系的理解有限。尽管它可以很好地回答时间点问题，但如果回答取决于对一系列事件的理解，则表现欠佳
+ **多语言图像理解：**模型对多语言图像和视频帧的理解有限。在类似的任务中可能会遇到困难或产生幻觉。
+ **人物识别**：Amazon Nova 模型不支持在图像、文档或视频中识别或命名个人的功能。模型将拒绝执行此类任务。
+ **空间推理**：Amazon Nova 模型的空间推理能力有限。它们可能很难完成需要精确本地化或布局分析的任务。
+ **图像或视频中的小文本**：如果图像或视频中的文字太小，可以考虑通过裁剪到相关部分来增加图像中文本的相对大小，同时保留必要的上下文。
+ **计数**：Amazon Nova 模型可以提供图像中物体的近似数量，但不一定总是能做到非常精确，尤其是在处理大量小物体时。
+ **不当内容**：Amazon Nova 模型不会处理违反可接受使用政策的不当或露骨图像
+ **医疗保健应用**：尽管 Amazon Nova 模型可以对医疗保健图像或视频进行一般分析，但由于这些构件的敏感性，我们不建议您解释复杂的诊断扫描。Amazon Nova 的回复绝不能替代专业的医学建议。

# 视频理解示例
<a name="modalities-video-examples"></a>

以下示例演示了如何使用 [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html) 向 Amazon Nova 模型发送视频提示。

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import base64
import boto3
import json
# Create a Bedrock Runtime client in the AWS Region of your choice.
client = boto3.client(
    "bedrock-runtime",
    region_name="us-east-1",
)

MODEL_ID = "us.amazon.nova-lite-v1:0"
# Open the image you'd like to use and encode it as a Base64 string.
with open("media/cooking-quesadilla.mp4", "rb") as video_file:
    binary_data = video_file.read()
    base_64_encoded_data = base64.b64encode(binary_data)
    base64_string = base_64_encoded_data.decode("utf-8")
# Define your system prompt(s).
system_list= [
    {
        "text": "You are an expert media analyst. When the user provides you with a video, provide 3 potential video titles"
    }
]
# Define a "user" message including both the image and a text prompt.
message_list = [
    {
        "role": "user",
        "content": [
            {
                "video": {
                    "format": "mp4",
                    "source": {
                        "bytes": video // Binary array (Converse API) or Base64-encoded string (Invoke API)
                    },
                }
            },
            {
                "text": "Provide video titles for this clip."
            },
        ],
    }
]
# Configure the inference parameters.
inf_params = {"maxTokens": 300, "topP": 0.1, "topK": 20, "temperature": 0.3}

native_request = {
    "schemaVersion": "messages-v1",
    "messages": message_list,
    "system": system_list,
    "inferenceConfig": inf_params,
}
# Invoke the model and extract the response body.
response = client.invoke_model(modelId=MODEL_ID, body=json.dumps(native_request))
model_response = json.loads(response["body"].read())
# Pretty print the response JSON.
print("[Full Response]")
print(json.dumps(model_response, indent=2))
# Print the text content for easy readability.
content_text = model_response["output"]["message"]["content"][0]["text"]
print("\n[Response Content Text]")
print(content_text)
```

以下示例演示了如何通过 [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html) 使用 Amazon S3 位置向 Amazon Nova 发送视频。

```
import base64
import boto3
import json
# Create a Bedrock Runtime client in the AWS Region of your choice.
client = boto3.client(
    "bedrock-runtime",
    region_name="us-east-1",
)

MODEL_ID = "us.amazon.nova-lite-v1:0"
# Define your system prompt(s).
system_list = [
    {
        "text": "You are an expert media analyst. When the user provides you with a video, provide 3 potential video titles"
    }
]
# Define a "user" message including both the image and a text prompt.
message_list = [
    {
        "role": "user",
        "content": [
            {
                "video": {
                    "format": "mp4",
                    "source": {
                        "s3Location": {
                            "uri": "s3://my_bucket/my_video.mp4", 
                            "bucketOwner": "111122223333"
                        }
                    }
                }
            },
            {
                "text": "Provide video titles for this clip."
            }
        ]
    }
]
# Configure the inference parameters.
inf_params = {"maxTokens": 300, "topP": 0.1, "topK": 20, "temperature": 0.3}

native_request = {
    "schemaVersion": "messages-v1",
    "messages": message_list,
    "system": system_list,
    "inferenceConfig": inf_params,
}
# Invoke the model and extract the response body.
response = client.invoke_model(modelId=MODEL_ID, body=json.dumps(native_request))
model_response = json.loads(response["body"].read())
# Pretty print the response JSON.
print("[Full Response]")
print(json.dumps(model_response, indent=2))
# Print the text content for easy readability.
content_text = model_response["output"]["message"]["content"][0]["text"]
print("\n[Response Content Text]")
print(content_text)
```

# 文档理解
<a name="modalities-document"></a>

**注意**  
本文档适用于 Amazon Nova 版本 1。如需 Amazon Nova 2 文档理解指南，请访问[文档理解](https://docs.aws.amazon.com/nova/latest/nova2-userguide/using-multimodal-models.html#document-understanding)。

借助于 Amazon Nova 的文档理解功能，您可以在提示中包含整个文档（PDF、Word 文件、电子表格等），并就其内容提出问题或发出请求。Nova 的多模态理解模型（Lite、Pro、Premier）可解释这些文档中的文本和视觉元素（例如图表或表格）。这支持多种用例，比如对冗长报告或扫描文档进行问答、概括和分析。主要功能包括用于容纳长文档的超大上下文窗口（1-2M 个词元），以及在一次查询中处理多个文档的能力。

Amazon Nova 区分了以下两种类型的文档输入：
+ **基于文本的文档类型**（例如 TXT、CSV、Markdown、HTML、DOC）：对于这些文档，主要处理其文本内容。Nova 将专注于理解这些文档的文本并从中提取信息。
+ **基于媒体的文档类型**（例如 PDF、DOCX）：这些文件可能含有复杂的布局、图像、图表或嵌入式图形。对于基于媒体的文档，Nova 同时处理其视觉和文本元素。Nova 采用基于视觉的理解功能来解释文档文本旁边的视觉内容，例如图表、表格、示意图或屏幕截图。

  Amazon Nova 中的 PDF 文件不支持 JPEG2000 和 JBIG2。

支持的文件格式包括常见文档类型：纯文本和结构化文本文件（CSV、TXT）、电子表格（XLS/XLSX）、HTML/MarkDown、Word 文档（DOC/DOCX）和 PDF 文件。对于文档中的图像，可处理标准图像格式（PNG、JPG、GIF、WebP），但不支持含有某些图像编码（CYMK、SVG）的 PDF。


**文档大小限制和使用指南**  

| 约束 | 限制 | 
| --- | --- | 
|  最大文档数  |  每个请求最多 5 份文档（适用于直接上传和 Amazon S3）  | 
|  基于文本的文档大小  |  每个文本文档（例如 .txt、.csv、.md、.html、.doc）不能超过 4.5 MB  | 
|  基于媒体的文档大小  |  .pdf 和.docx 文件没有单独的文件大小限制，但是： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/nova/latest/userguide/modalities-document.html)  | 
|  不支持的 PDF 内容  |  不支持含有 CMYK 颜色配置文件或 SVG 图像的 PDF  | 

# 通过 API 使用 Nova 的文档理解功能
<a name="modalities-document-examples"></a>

下面是一个简化版的 Python 示例，说明了如何使用 Amazon Nova 进行文档 QA（问答）或分析。我们将使用 AWS Bedrock API（通过 Boto3 SDK）发送一份 PDF 文档和一个供模型回答的问题。

```
            
import base64
import base64
import json
import boto3

# Initialize Bedrock runtime client (adjust region as needed)
client = boto3.client("bedrock-runtime", region_name="us-east-1")

MODEL_ID = "us.amazon.nova-lite-v1:5"  # using Nova Lite model in this example

# Read the document file (PDF) in binary mode
with open("my_document.pdf", "rb") as file:
    doc_bytes = file.read()

# Construct the conversation messages with document + question
messages = [
    {
        "role": "user",
        "content": [
            {
                "document": {
                    "format": "pdf",
                    "name": "Document1",  # neutral name for the document
                    "source": {
                        "bytes": doc_bytes  # embedding the PDF content directly
                    }
                }
            },
            {
                "text": "Here is a question about the document: ... (your question) ... ?"
            }
        ]
    }
]

# Set inference parameters (optional)
inf_params = {"maxTokens": 4000, "topP": 0.1, "temperature": 0.3}

# Invoke the model
response = client.converse(modelId=MODEL_ID, messages=messages, inferenceConfig=inf_params)

# Extract and print the answer
answer_text = response["output"]["message"]["content"][0]["text"]
print(answer_text)
```

如果输入文件很大（超过 25 MB 的直接上传限制）或文件很多，可将其存储在 Amazon S3 中并进行引用。这就避免了在请求中发送原始字节。使用 S3 时，需确保 Bedrock 服务有权访问存储桶/对象。例如，为了在 S3 中引用 PDF，文档源将使用“S3 位置”而不是“字节”，如下所示：

```
messages = [
    {
        "role": "user",
        "content": [
            {
                "document": {
                    "format": "pdf",
                    "name": "Report2023",
                    "source": {
                        "s3Location": {
                            "uri": "s3://your-bucket/path/to/document1.pdf",
                            "bucketOwner": "123456789012"
                        }
                    }
                }
            },
            {
                "text": "Summarize the key findings from the Q3 2023 report."
            }
        ]
    }
]
```

**注意**  
文档名称只能包含字母数字字符、连字符、圆括号和方括号。  
`name` 字段容易受到提示注入的影响，因为模型可能会意外将其解释为指令。因此，我们建议您指定一个中性名称。

# 错误处理
<a name="text-error-handing"></a>

向客户端传回错误的方式因发生的错误类型而异。在本节中，我们仅重点介绍 Amazon Nova 模型特有的错误条件。您要在应用程序代码中处理的三种主要错误类型是**输入验证**错误、**负责任的人工智能（RAI）输入偏差**错误和 **RAI 输出偏差**错误。

**输入验证：**您对输入参数使用不支持的值时，就会出现输入验证错误。例如，温度的越界值或 `image` 输入格式不正确。所有输入验证错误都以 **ValidationException** 的形式表示，其中包含描述问题原因的消息字符串。

如果有任何输入文本值或图像被判定违反 AWS 负责任的人工智能政策，就会发生 **RAI 输入偏差**错误。这些错误以 **ValidationException** 的形式表示，并显示以下消息之一：
+ **输入文本**验证消息：“This request has been blocked by our content filters. Please adjust your text prompt to submit a new request.”
+ **输入图像**验证消息：“This request has been blocked by our content filters. Please adjust your input image to submit a new request.”
+ **输入视频**验证消息：“This request has been blocked by our content filters. Please adjust your input video to submit a new request.”

如果生成的输出被判定为不符合 AWS 负责任的人工智能政策，就会发生 RAI 输出偏差错误。若发生这种情况，不会抛出异常，而是返回成功回复。其结构包含一个 `error` 字段，该字段是一个包含以下值之一的字符串：
+ **输出文本**验证消息："The generated text has been blocked by our content filters."