Nova Embeddings 사용 - Amazon Nova

Nova Embeddings 사용

Amazon Nova Multimodal Embeddings는 에이전트 RAG 및 시맨틱 검색 애플리케이션을 위한 최첨단 멀티모달 임베딩 모델입니다. 단일 모델을 통해 텍스트, 문서, 이미지, 비디오 및 오디오를 지원하는 최초의 통합 임베딩 모델로, 최고의 정확도로 크로스 모달 검색을 가능하게 합니다. Nova Multimodal Embeddings는 이러한 각 콘텐츠 유형을 통합 시맨틱 공간에 매핑하여 개발자가 단일 모달, 크로스 모달 및 멀티모달 벡터 작업을 수행할 수 있도록 합니다.

Nova Embeddings API는 다음과 같은 다양한 용도로 활용할 수 있습니다.

  • 시맨틱 콘텐츠 검색 및 추천: 콘텐츠에 대한 임베딩을 생성한 후 이를 사용하여 유사한 항목을 찾거나 사용자에게 맞춤형 추천을 제공합니다.

  • 멀티모달 검색: 다양한 콘텐츠 유형의 임베딩을 결합하여 강력한 크로스 모달 검색 기능을 구현합니다.

  • RAG: 인터리브 텍스트 및 이미지가 있는 문서와 같은 멀티모달 콘텐츠에서 임베딩을 생성하여 GenAI 애플리케이션의 검색 워크플로를 지원합니다.

주요 기능

  • 통합 시맨틱 공간에서 텍스트, 이미지, 문서 이미지, 비디오 및 오디오 지원. 최대 컨텍스트 길이는 8K 토큰 또는 비디오 30초, 오디오 30초입니다.

  • 동기식 및 비동기식 API: API는 동기식 및 비동기식 사용을 모두 지원합니다.

  • 대용량 파일 분할: 비동기 API는 사용자 정의 파라미터로 제어되는 긴 텍스트, 비디오 및 오디오에 대한 API 기반 분할을 제공하여 대용량 입력을 쉽게 처리할 수 있게 합니다. 이 모델은 각 세그먼트에 대해 단일 임베딩을 생성합니다.

  • 오디오가 포함된 비디오: 오디오와 비디오를 동시에 처리합니다. API를 사용하면 두 모달리티를 모두 나타내는 단일 임베딩을 원하는지 아니면 각각 비디오 및 오디오 스트림을 나타내는 두 개의 별개 임베딩을 원하는지 지정할 수 있습니다.

  • 임베딩 용도: Nova Multimodal Embeddings를 사용하면 의도한 다운스트림 애플리케이션에 따라 임베딩을 최적화할 수 있습니다. 지원되는 사용 사례에는 검색(RAG/검색), 분류 및 클러스터링이 포함됩니다. 구체적인 값은 애플리케이션에 따라 다릅니다(모범 사례 참조).

  • 차원 크기: 임베딩 정확도와 벡터 스토리지 비용의 균형을 맞추기 위한 4가지 차원 크기: 3072, 1024, 384, 256.

  • 입력 방법: S3 URI를 지정하거나 base64 인코딩으로 인라인 처리하여 포함할 콘텐츠를 전달할 수 있습니다.

Nova Multimodal Embeddings 작동 방식

  • 콘텐츠가 Nova Embeddings를 통해 전달되면 모델은 해당 콘텐츠를 벡터라고 하는 범용 숫자 형식으로 변환합니다. 벡터는 다양한 검색 기능에 사용될 수 있는 임의의 숫자 값 집합입니다. 유사한 콘텐츠에는 덜 유사한 콘텐츠보다 더 가까운 벡터가 부여됩니다. 예를 들어 '행복'으로 묘사될 수 있는 콘텐츠에는 '슬픔'과 같은 벡터가 아닌 '기쁨'과 같은 벡터에 더 가까운 벡터가 부여됩니다.

사전 조건

Multimodal Embeddings를 사용하려면 다음이 필요합니다.

  • Python 설치

  • AWS CLI 설치

  • AWS 계정에 대한 액세스 자격 증명으로 AWS CLI 구성

  • AWS 계정에서 Nova Multimodal Embeddings 모델 활성화

이러한 기능을 활성화하면 비동기식 또는 동기식 임베딩 요청을 수행할 수 있습니다.

동기식으로 임베딩 생성

더 작은 콘텐츠 항목의 경우 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, ... ] } ] }

비동기식으로 임베딩 생성

더 큰 콘텐츠 파일의 경우 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