Amazon Nova 2 多模态嵌入 与 Amazon S3 Vectors 和 AWS Java SDK - 第2部分 创建并存储文本和图像嵌入

发布: (2026年1月20日 GMT+8 00:05)
6 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将按照要求保留源链接、格式和技术术语,仅翻译正文部分。

Maven 依赖

将以下 AWS SDK for Java 模块添加到您的 pom.xml 中:

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>bedrockruntime</artifactId>
</dependency>

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3vectors</artifactId>
</dependency>

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
</dependency>

Source:

业务逻辑

示例应用的核心逻辑位于类 AmazonNovaMultimodalEmbeddings 中。

创建并存储文本嵌入

private static void createAndStoreTextEmbeddings(String text, String key) throws Exception {
    Float[] embeddings = createTextEmbeddings(text, "GENERIC_INDEX");
    putVectors(embeddings, key);
}

生成文本嵌入

我们使用字符串模板构建一个 JSON 请求,随后通过 InvokeModelRequest 发送给 Bedrock。

关键参数

参数值 / 选项
taskTypeSINGLE_EMBEDDING
embeddingPurposeGENERIC_INDEX(用于多模态嵌入)
embeddingDimension384(其他支持的尺寸:3072、1024、256)
text输入字符串(在末尾截断)
private static Float[] createTextEmbeddings(String text, String embeddingPurpose) throws Exception {
    String request = """
        {
            "taskType": "SINGLE_EMBEDDING",
            "singleEmbeddingParams": {
                "embeddingPurpose": {{embeddingPurpose}},
                "embeddingDimension": {{dimension}},
                "text": {"truncationMode": "END", "value": {{text}}}
            }
        }
        """
        .replace("{{text}}", "\"" + text + "\"")
        .replace("{{dimension}}", String.valueOf(EMBEDDING_DIMENSION))
        .replace("{{embeddingPurpose}}", "\"" + embeddingPurpose + "\"");

    var eResponse = invokeBedrockModel(request);
    return eResponse.embeddings().getFirst().embedding();
}

注意: 完整的请求/响应模式请参阅官方 Amazon Nova 2 文档。

调用 Bedrock 模型

private static EmbeddingResponse invokeBedrockModel(String request) throws Exception {
    var imRequest = InvokeModelRequest.builder()
            .modelId(MODEL_ID)                                 // 例如 "amazon.nova-2-multimodal-embeddings-v1:0"
            .body(SdkBytes.fromUtf8String(request))
            .contentType("application/json")
            .accept("application/json")
            .build();

    var imResponse = BEDROCK_RUNTIME_CLIENT.invokeModel(imRequest);
    return MAPPER.readValue(imResponse.body().asUtf8String(), EmbeddingResponse.class);
}

BEDROCK_RUNTIME_CLIENT 是在类的其他位置创建的单例 BedrockRuntimeClient

在 Amazon S3 Vectors 中存储嵌入

创建向量桶和索引

private static final String VECTOR_BUCKET = "vk-vector-store";   // make this unique for your account
private static final String INDEX_NAME   = "embeddings";

private static void createS3VectorBucketAndIndex() {
    // 1️⃣ Create the vector bucket
    var createBucketReq = CreateVectorBucketRequest.builder()
            .vectorBucketName(VECTOR_BUCKET)
            .build();
    S3_VECTORS_CLIENT.createVectorBucket(createBucketReq);

    // 2️⃣ Create the index inside the bucket
    var createIndexReq = CreateIndexRequest.builder()
            .vectorBucketName(VECTOR_BUCKET)
            .indexName(INDEX_NAME)
            .dataType("float32")
            .dimension(EMBEDDING_DIMENSION)
            .distanceMetric("cosine")          // alternative: "euclidean"
            .build();
    S3_VECTORS_CLIENT.createIndex(createIndexReq);
}

运行该方法后,您可以在 Amazon S3 Vector buckets 控制台中看到该桶和索引。

将向量放入索引

private static void putVectors(Float[] embeddings, String key) {
    // Convert the float array into the VectorData structure expected by S3 Vectors
    var vectorData = VectorData.builder()
            .float32(embeddings)
            .build();

    // Build the input vector (metadata is optional)
    var inputVector = PutInputVector.builder()
            .key(key)
            // .metadata(document)   // uncomment if you have filterable metadata
            .data(vectorData)
            .build();

    // Build the request that targets the bucket + index created earlier
    var putRequest = PutVectorsRequest.builder()
            .vectorBucketName(VECTOR_BUCKET)
            .indexName(INDEX_NAME)
            .vectors(inputVector)          // you can also pass a collection for bulk writes
            .build();

    S3_VECTORS_CLIENT.putVectors(putRequest);
}

性能提示: 如果您有大量嵌入,请将它们批量放入单个 PutVectorsRequest(通过提供 PutInputVector 的集合)。这可以减少往返次数并提升吞吐量。

下一步

  • 实现类似的 image‑embedding 流程(相同的模式,只是负载不同)。
  • 探索 filterable metadata 以实现更丰富的查询。
  • 实验不同的 distance metricsembedding dimensions,找到最适合您使用场景的折衷方案。

祝嵌入愉快! 🚀

Source:

创建并存储文本嵌入

T.putVectors(pvRequest);

要测试创建和存储文本嵌入,请取消注释 main 方法中的调用。
第二个参数表示在 PutInputVector 对象中使用的键。

public static void main(String[] args) throws Exception {
    createAndStoreTextEmbeddings(AWS_LAMBDA_EMBEDDINGS, "AWS Lambda Definition");
    createAndStoreTextEmbeddings(AZURE_FUNCTIONS__EMBEDDINGS, "Azure Functions Definition");
}

我们将复用上面过程中的许多部分。
示例应用的相关业务逻辑仍然位于 AmazonNovaMultimodalEmbeddings 中。
关注的方法是 createAndStoreImageEmbeddings

文本嵌入与图像嵌入的区别

  • 文本嵌入 – JSON 请求中包含 text 元素。
  • 图像嵌入 – JSON 请求中包含 image 元素,需要指定:
    • formatjpeg
    • sources3Locationuri 指向 S3 中的图像

两个测试图像(分别可视化描述 AWS LambdaAzure Functions)已上传到为此专门创建的 S3 存储桶:

private static final String S3_BUCKET = "s3://vk-amazon-nova-2-mme/";   // replace with your own bucket

图像名称定义为:

private static final String[] IMAGE_NAMES = { "AWS-Lambda", "Azure-Functions" };

对于每张图像,我们使用存储桶、图像名称和扩展名构建 S3_IMAGE_URI,随后创建 JSON 请求,调用 Bedrock 模型,并使用图像名称作为键将生成的嵌入存入 Amazon S3 Vectors(与文本嵌入相同的做法)。

createAndStoreImageEmbeddings 的完整源码

private static void createAndStoreImageEmbeddings() throws Exception {
    for (String imageName : IMAGE_NAMES) {
        String request = """
        {
            "taskType": "SINGLE_EMBEDDING",
            "segmentedEmbeddingParams": {
                "embeddingPurpose": "GENERIC_INDEX",
                "embeddingDimension": {{dimension}},
                "image": {
                    "format": "jpeg",
                    "source": {
                        "s3Location": { "uri": {{S3_IMAGE_URI}} }
                    }
                }
            }
        }
        """
        .replace("{{S3_IMAGE_URI}}",
                 "\"" + S3_BUCKET + imageName + IMAGE_EXTENSION + "\"")
        .replace("{{dimension}}", String.valueOf(EMBEDDING_DIMENSION));

        var eResponse = invokeBedrockModel(request);
        putVectors(eResponse.embeddings().getFirst().embedding(), imageName);
    }
}

测试图像嵌入

main 中取消注释以下代码行,即可运行图像嵌入工作流:

public static void main(String[] args) throws Exception {
    createAndStoreImageEmbeddings();
}

小结

  • 演示了如何使用 Amazon Nova 2 Multimodal Embeddings 创建 文本图像 嵌入。
  • 展示了如何使用 AWS Java SDK 将嵌入存储到 Amazon S3 Vectors 中。

在本系列的下一部分,我们将探讨 音频视频 嵌入。

Back to Blog

相关文章

阅读更多 »

2026 年必备 AI 知识

学生与构建者实用指南:2026年的人工智能已不再仅仅是尝试 ChatGPT、生成图像或复制代码。

PageSpeed 70 vs 95:真实的情况

引言 说实话,从一开始就坦率地说:如果你为会计事务所、心理学家、房地产中介、理发店、诊所、off…拥有一个网站。