Amazon Nova 2 멀티모달 임베딩과 Amazon S3 벡터 및 AWS Java SDK - 파트 2 텍스트 및 이미지 임베딩 생성 및 저장
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에 전송합니다.
핵심 매개변수
| 매개변수 | 값 / 옵션 |
|---|---|
taskType | SINGLE_EMBEDDING |
embeddingPurpose | GENERIC_INDEX (멀티모달 임베딩에 사용) |
embeddingDimension | 384 (지원되는 다른 크기: 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 metrics와 embedding 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요소가 포함되며, 다음과 같이 지정합니다:format은jpegsource→s3Location→uri로 S3에 있는 이미지의 위치를 가리킵니다
두 테스트 이미지(AWS Lambda와 Azure 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 에 임베딩을 저장하는 방법을 보여주었습니다.
시리즈의 다음 부분에서는 오디오와 비디오 임베딩을 살펴볼 예정입니다.