벡터 인덱스에 벡터 삽입하기
벡터 인덱스에 벡터 삽입하기 (Inserting vectors into a vector index)
벡터 인덱스에 벡터를 추가하는 방법을 설명해요. PutVectors API 작업을 사용하며, 벡터마다 고유 키와 메타데이터를 붙일 수 있어요.
출처: 문서
본문
PutVectors API 작업으로 벡터 인덱스에 벡터를 추가할 수 있어요. 각 벡터는 벡터 인덱스 안에서 벡터 하나를 고유하게 식별하는 키(key)로 구성돼요. 인덱스에 이미 존재하는 키로 벡터를 넣으면 기존 벡터가 완전히 덮어써져서 이전 벡터는 더 이상 검색되지 않아요.
쓰기 처리량을 최대화하고 비용을 최적화하려면 PutVectors의 최대 배치 크기까지 큰 배치로 벡터를 넣는 걸 권장해요. 다만 들어오는 실시간 벡터 데이터가 즉시 검색 가능해야 하는 경우처럼 더 작은 배치를 써야 하는 워크로드라면, 초당 허용 요청 수 한도까지 더 많은 수의 동시 PutVectors 요청을 사용해 더 높은 쓰기 처리량을 얻을 수 있어요. PutVectors API 호출당 벡터 수 제한인 최대 배치 크기와 초당 최대 요청 및 벡터 수 제한에 대한 자세한 내용은 제한 사항을 참고하세요.
또한 각 벡터에 키-값 쌍 형태로 메타데이터(예: 연도, 저자, 장르, 위치)를 붙일 수 있어요. 기본적으로 벡터에 붙는 모든 메타데이터 키는 필터링 가능하며 유사도 검색(similarity query)의 필터로 사용할 수 있어요. 벡터 인덱스를 만들 때 필터링 불가능(non-filterable)으로 지정한 메타데이터 키만 필터링에서 제외돼요. S3 벡터 인덱스는 문자열, 숫자, 불리언, 리스트 타입의 메타데이터를 지원해요. 벡터당 총 메타데이터 크기 제한과 벡터당 필터링 가능한 메타데이터 크기 제한에 대한 자세한 내용은 제한 사항을 참고하세요. 메타데이터 크기가 이 한도를 넘으면 PutVectors API 작업은 400 Bad Request 오류를 반환해요.
PutVectors API 작업으로 벡터 인덱스에 벡터 데이터를 넣기 전에, 원시 데이터를 부동소수점 배열로 된 수치 표현인 벡터 임베딩으로 변환해야 해요. 벡터 임베딩은 콘텐츠의 의미를 포착하므로, PutVectors 작업으로 벡터 인덱스에 저장하면 유사도 검색이 가능해져요. 데이터 타입과 사용 사례에 따라 다양한 방법으로 벡터 임베딩을 생성할 수 있어요. 여기에는 머신러닝 프레임워크 사용, 전용 임베딩 라이브러리, Amazon Bedrock 같은 AWS 서비스가 포함돼요. 예를 들어 Amazon Bedrock을 사용한다면 InvokeModel API 작업과 원하는 임베딩 모델로 임베딩을 생성할 수 있어요.
또한 Amazon Bedrock Knowledge Bases는 완전 관리형 엔드투엔드 RAG 워크플로를 제공해요. Amazon Bedrock이 S3 데이터 소스에서 데이터를 자동으로 가져와 콘텐츠를 텍스트 블록으로 변환하고, 임베딩을 생성한 뒤 벡터 인덱스에 저장해 줘요. 그런 다음 지식 기반을 검색하고 소스 데이터에서 검색된 청크(chunk)를 바탕으로 응답을 생성할 수 있어요.
그 밖에도 오픈소스 도구인 Amazon S3 Vectors Embed CLI를 쓰면 명령줄에서 임베딩 생성과 의미 검색을 더 간단하게 할 수 있어요. 이 도구는 Amazon Bedrock 파운데이션 모델로 벡터 임베딩을 만드는 작업과 S3 벡터 인덱스 안의 의미 검색 작업을 모두 자동화해 줘요. 자세한 내용은 s3vectors-embed-cli로 벡터 임베딩 만들기 및 의미 검색 수행하기를 참고하세요.
참고: 벡터 인덱스에 벡터 데이터를 넣을 때는 벡터 데이터를
float32(32비트 부동소수점) 값으로 제공해야 해요. 더 높은 정밀도의 값을 AWS SDK에 전달하면 S3 Vectors가 저장 전에 값을 32비트 부동소수점으로 변환하며,GetVectors,ListVectors,QueryVectors작업은float32값을 반환해요. AWS SDK마다 기본 수치 타입이 다를 수 있으므로 어떤 SDK를 쓰든 벡터가float32값으로 올바르게 형식화되어 있는지 확인하세요. 예를 들어 Python에서는numpy.float32를 쓰거나 값을 명시적으로 캐스팅하세요.
Python SDK (Boto3)
# Populate a vector index with embeddings from Amazon Titan Text Embeddings V2.
import boto3
import json
# Create Bedrock Runtime and S3 Vectors clients in the AWS Region of your choice.
bedrock = boto3.client("bedrock-runtime", region_name="us-west-2")
s3vectors = boto3.client("s3vectors", region_name="us-west-2")
# Texts to convert to embeddings.
texts = [
"Star Wars: A farm boy joins rebels to fight an evil empire in space",
"Jurassic Park: Scientists create dinosaurs in a theme park that goes wrong",
"Finding Nemo: A father fish searches the ocean to find his lost son"
]
# Generate vector embeddings.
embeddings = []
for text in texts:
response = bedrock.invoke_model(
modelId="amazon.titan-embed-text-v2:0",
body=json.dumps({"inputText": text})
)
# Extract embedding from response.
response_body = json.loads(response["body"].read())
embeddings.append(response_body["embedding"])
# Write embeddings into vector index with metadata.
s3vectors.put_vectors(
vectorBucketName="media-embeddings",
indexName="movies",
vectors=[
{
"key": "Star Wars",
"data": {"float32": embeddings[0]},
"metadata": {"source_text": texts[0], "genre":"scifi"}
},
{
"key": "Jurassic Park",
"data": {"float32": embeddings[1]},
"metadata": {"source_text": texts[1], "genre":"scifi"}
},
{
"key": "Finding Nemo",
"data": {"float32": embeddings[2]},
"metadata": {"source_text": texts[2], "genre":"family"}
}
]
)