Amazon Nova 2 멀티모달 임베딩과 Amazon S3 벡터 및 AWS Java SDK - 파트 2 텍스트 및 이미지 임베딩 생성 및 저장

발행: (2026년 1월 20일 오전 01:05 GMT+9)
7 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>

비즈니스 로직

샘플 애플리케이션의 핵심 로직은 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)                                 // e.g. "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를 실험하여 사용 사례에 가장 적합한 균형점을 찾으세요.

Happy embedding! 🚀

텍스트 임베딩 생성 및 저장

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

관련 글

더 보기 »