View a markdown version of this page

DynamoDB에서 벡터 인덱스 사용 - Amazon DynamoDB

DynamoDB에서 벡터 인덱스 사용

벡터 인덱스는 Amazon DynamoDB에서 테이블 항목에 저장된 벡터 임베딩에 대한 유사성 검색을 지원하는 인덱스 유형입니다. QueryScan 작업을 사용하여 정확한 일치 및 범위 쿼리를 지원하는 글로벌 보조 인덱스 또는 로컬 보조 인덱스와 달리 벡터 인덱스는 근사 최근접 이웃(ANN) 검색을 사용하여 사용자가 제공한 쿼리 벡터와 가장 유사한 항목을 찾습니다. 이러한 유사성 검색은 유사성 점수 기준으로 가장 유사한 항목을 반환하는 SearchVectors API를 직접적으로 호출하여 수행합니다.

벡터 인덱스를 사용하면 별도의 벡터 데이터베이스 없이도 DynamoDB에 운영 데이터와 함께 벡터 임베딩을 저장하고 유사성 검색을 수행할 수 있습니다. 따라서 DynamoDB와 외부 벡터 스토어 간에 복잡한 데이터 복제 파이프라인이 필요하지 않습니다.

벡터 인덱스는 이미 사용 중인 것과 동일한 CreateTableUpdateTable API를 통해 VectorIndexes 파라미터(CreateTable용) 및 VectorIndexUpdates 파라미터(UpdateTable용)를 사용하여 관리됩니다.

벡터 인덱스 사용 사례

벡터 인덱스는 벡터 표현을 기반으로 유사한 항목을 찾는 다양한 사용 사례를 지원합니다.

  • 시맨틱 검색 – 키워드를 일치시키는 대신 쿼리의 의미를 이해하는 검색 엔진을 구축합니다. 기계 학습 모델에서 생성된 텍스트 임베딩을 저장하고 의미상 유사한 콘텐츠를 찾습니다.

  • 검색 증강 생성(RAG) – 대규모 언어 모델(LLM)을 관련 지식 베이스와 연결합니다. 문서 임베딩을 DynamoDB에 저장하고 LLM 프롬프트와 가장 관련성이 높은 컨텍스트를 검색합니다.

  • 추천 시스템 – 기능 또는 동작의 벡터 표현을 기반으로 유사한 제품, 콘텐츠 또는 사용자를 찾습니다.

  • AI 에이전트 메모리 – 대화 임베딩을 저장하여 세션 간 컨텍스트를 유지하고 AI 에이전트 성능을 개선합니다.

  • 이상 및 사기 행위 탐지 – 새로운 이벤트를 알려진 정상 동작의 임베딩과 비교하여 비정상적인 거래 또는 사기 활동과 같은 이상값에 플래그를 지정합니다.

벡터 인덱스와 보조 인덱스 비교

다음 표에서는 벡터 인덱스를 글로벌 보조 인덱스 및 로컬 보조 인덱스와 비교합니다.

기능 벡터 인덱스 글로벌 보조 인덱스 로컬 보조 인덱스
쿼리 유형 유사성 검색 정확한 일치 및 범위 정확한 일치 및 범위
API 읽기 SearchVectors Query, Scan Query, Scan
스키마 벡터 속성 및 선택적 SearchSchema(파티션 키, 인라인 필터) 파티션 키 및 선택적 정렬 키 동일한 파티션 키, 다른 정렬 키
테이블당 최대 수 5 20 5
용량 모드 온디맨드만 온디맨드 또는 프로비저닝 온디맨드 또는 프로비저닝

거리 함수

벡터 인덱스를 생성할 때 거리 함수를 선택합니다. 거리 함수는 DynamoDB가 벡터 간의 유사성을 측정하는 방법을 결정합니다. 선택은 순위 품질 및 검색 정확도에 영향을 미칩니다. Amazon DynamoDB는 세 가지 거리 함수를 지원합니다.

거리 함수 점수 해석 최상의 일치
COSINE 점수가 낮을수록 유사성이 높음을 나타냅니다. 두 벡터 간의 코사인 거리(1 - 코사인 유사성)를 측정합니다. 값의 범위는 0(동일한 방향)~2(반대 방향)입니다. 최저 점수
DOT_PRODUCT 점수가 높을수록 유사성이 높음을 나타냅니다. 두 벡터 사이의 내적을 측정합니다. 최고 점수
EUCLIDEAN 점수가 낮을수록 유사성이 높음을 나타냅니다. 두 벡터 사이의 직선 거리를 측정합니다. 최저 점수

거리 함수가 동일한 쿼리 벡터의 순위를 매기는 방법을 비교하려면 거리 함수가 결과의 순위를 매기는 방법 섹션을 참조하세요.

다음 지침은 워크로드에 적합한 거리 함수를 선택하는 데 도움이 됩니다.

COSINE

방향을 비교하고 크기를 무시합니다. 텍스트 임베딩 모델을 사용한 시맨틱 유사성에는 COSINE을 사용합니다. 이러한 모델은 의미를 방향에 인코딩하며 벡터 길이는 달라질 수 있습니다. Amazon Titan Text Embeddings 및 Cohere Embed를 예로 들 수 있습니다.

COSINE은 다음과 같은 사용 사례에 적합합니다.

  • 제품 설명 또는 문서에 대한 시맨틱 검색

  • 검색 증강 생성(RAG)

  • FAQ 일치

COSINE은 어떤 함수를 사용할지 확실하지 않은 경우 안전한 기본값입니다.

DOT_PRODUCT

DOT_PRODUCT는 방향과 크기(벡터의 길이) 모두에 민감합니다. 임베딩 모델의 설명서에서 유사성 척도로 내적을 권장하거나 벡터 길이가 순위에 영향을 미치도록 하려는 경우 DOT_PRODUCT를 선택합니다.

DOT_PRODUCT은 다음과 같은 사용 사례에 적합합니다.

  • 인기도 또는 신뢰도 점수를 사용하여 임베딩의 규모를 조정하고 순위에 영향을 미치는 추천 시스템

  • 설명서에서 유사성 척도로 내적을 특별히 추천하는 모델

  • 벡터 길이가 의미 있는 신호를 전달하는 크기에 민감한 순위

임베딩을 단위 길이로 정규화하는 것이 좋습니다. 정규화되면 DOT_PRODUCTCOSINE과 동일한 방식으로 결과의 순위를 매깁니다. 크기가 순위에 영향을 미치도록 하려는 경우에만 정규화를 건너뜁니다.

사용 사례 예: 인기도 점수에 따라 각 제품 임베딩의 규모를 조정하는 제품 추천 시스템입니다. 인기 있는 제품일수록 벡터가 길어지고 검색 결과에서 순위가 높아집니다.

EUCLIDEAN

두 벡터 간의 직선 거리를 측정합니다. EUCLIDEAN은 크기에 민감합니다. 임베딩 공간 내에서의 절대 위치가 중요한 경우에 이 함수를 사용합니다.

EUCLIDEAN은 다음과 같은 사용 사례에 적합합니다.

  • 공간 거리가 중요한 이미지 또는 오디오 임베딩

  • 근접 중복 탐지

  • 클러스터링 및 이상 탐지

사용 사례 예: 이미지 임베딩에서 근접 중복 이미지를 찾습니다.

임베딩 모델과 일치하는 거리 함수 선택

사용할 함수가 확실하지 않은 경우 임베딩 모델의 설명서를 확인하세요. 대표 데이터세트와 비교하여 선택을 검증합니다. 인덱스 생성 후에는 거리 함수를 변경할 수 없습니다. 자세한 내용은 거리 함수를 임베딩과 일치 섹션을 참조하세요.

거리 함수가 결과의 순위를 매기는 방법

인덱스를 생성할 때 선택하는 거리 함수에 따라 결과의 Score 값과 정렬 순서가 모두 결정됩니다. 동일한 쿼리라도 서로 다른 거리 함수에서 동일한 항목의 순위를 다르게 지정할 수 있습니다. 다음 예제에서는 4개의 저장된 벡터에 대해 쿼리 벡터 [1, 0, 0, 0]을 사용합니다.

저장된 벡터 COSINE(낮을수록 더 유사함) EUCLIDEAN(낮을수록 더 유사함) DOT_PRODUCT(높을수록 더 유사함)
[1, 0, 0, 0] 0.0 0.0 1.0
[10, 0, 0, 0] 0.0 9.0 10.0
[0.7071, 0.7071, 0, 0] 0.29 0.77 0.71
[-1, 0, 0, 0] 2.0 2.0 -1.0

다음 두 가지 동작에 유의해야 합니다.

  • COSINE은 크기를 무시합니다. 이 함수는 동일한 방향을 가리키는 [1, 0, 0, 0][10, 0, 0, 0]을 동일하게 채점합니다(둘 다 0.0). EUCLIDEAN은 벡터의 크기에 따라 증가하는 절대 거리를 측정하기 때문에 동일한 쿼리에서 [10, 0, 0, 0]은 순위가 가장 낮습니다.

  • DOT_PRODUCT 점수는 음수일 수 있습니다. 반대 방향([-1, 0, 0, 0])을 가리키는 벡터의 점수는 -1.0입니다. 결과를 정렬하거나 임계값을 적용할 때 점수가 항상 0 이상이라고 가정하지 마세요.

SearchSchema

벡터 인덱스를 생성할 때 벡터 인덱스 파티션 키와 인라인 필터 속성을 지정하는 SearchSchema를 선택적으로 정의할 수 있습니다.

HASH(벡터 인덱스 파티션 키)

벡터 인덱스 파티션 키는 독립적인 스케일링을 위해 인덱스 데이터를 분할합니다. 벡터 인덱스 파티션 키를 지정하면 파티션 키 값이 동일한 항목이 함께 저장되므로 시스템이 관련 데이터만 검색할 수 있습니다. 대규모에서는 검색이 전체 인덱스 대신 벡터 공간의 하위 집합만 검사하므로 검색 지연 시간이 줄어듭니다. Category 또는 Country와 같이 카디널리티가 낮거나 중간 정도인 속성을 사용합니다. 벡터 인덱스 파티션 키는 하나만 지정할 수 있습니다.

SearchSchema에서 벡터 인덱스 파티션 키를 정의하는 경우 SearchVectors를 직접적으로 호출할 때 SearchConditionExpression에 해당 값을 제공해야 합니다.

파티션 키를 사용하여 검색 처리량 규모 조정

대규모 인덱스 또는 높은 검색 볼륨이 예상되는 경우 벡터 인덱스 파티션 키를 정의합니다. 각 SearchVectors 호출은 단일 파티션 키 값으로 범위가 지정되므로 여러 파티션 키 값에 데이터를 분산하면 초당 더 많은 검색 작업을 실행할 수 있고 각 검색이 검사하는 데이터의 양이 줄어듭니다. 쿼리 패턴과 일치하는 파티션 키 선택을(를) 참조하세요.

INLINE_FILTER

인라인 필터 속성은 벡터 인덱스로 프로젝션되므로 DynamoDB는 검색 중에 스토리지 계층에서 필터링할 수 있습니다.

인라인 필터는 SearchConditionExpression에서 등식 연산자(=)를 지원합니다. 비교, 범위 및 집합 멤버 연산자(<>, <, <=, >, >=, IN)는 아직 사용할 수 없습니다. 벡터 인덱스 파티션 키와 달리 인라인 필터는 검색 시 선택 사항입니다.

SearchSchema에서 파티션 키를 정의하지 않고 벡터 인덱스를 생성할 수 있습니다. 이 경우 모든 SearchVectors 호출은 전체 인덱스를 검색합니다. SearchConditionExpression이 필요하지 않아 더 단순하지만 수평적으로 확장되지 않습니다. 인덱스가 증가하면 각 검색에서 더 많은 데이터를 검사하여 지연 시간 및 비용이 늘어납니다. 워크로드에 높은 처리량이 필요하거나 인덱스에 많은 벡터가 포함된 경우 파티션 키를 정의하여 데이터를 파티션 간에 분산하고 독립적으로 확장합니다. 쿼리 패턴과 일치하는 파티션 키 선택을(를) 참조하세요.

프로젝션

글로벌 보조 인덱스와 마찬가지로 벡터 인덱스는 기본 테이블에서 인덱스로 복사되는 속성을 제어하는 프로젝션을 지원합니다. 프로젝션은 벡터 인덱스를 생성할 때 지정합니다.

  • KEYS_ONLY - SearchSchema에 정의된 기본 테이블 프라이머리 키 속성, 벡터 속성 및 인라인 필터 속성만 인덱스로 프로젝션됩니다.

  • INCLUDE - KEYS_ONLY 속성 외에도 프로젝션할 비키 속성을 추가로 지정합니다. 벡터 인덱스가 생성된 후에는 포함된 속성 세트를 변경할 수 없습니다. 다른 속성 세트를 프로젝션하려면 인덱스를 삭제하고 원하는 프로젝션으로 다시 생성합니다.

  • ALL - 기본 테이블의 모든 속성이 인덱스로 프로젝션됩니다.

프로젝션은 SearchVectors가 반환할 수 있는 속성을 제한합니다.

벡터 인덱스로 프로젝션되지 않은 속성은 SearchVectors 응답에 포함될 수 없습니다. 검색 결과에 특정 속성이 필요한 경우 프로젝션에 포함하거나 ALL을 사용합니다.

다른 DynamoDB 기능과 함께 벡터 인덱스 사용

DynamoDB Streams

테이블을 생성할 때 StreamSpecification 파라미터를 사용하거나 UpdateTable을 통해 벡터 인덱스가 있는 테이블에서 DynamoDB Streams를 활성화할 수 있습니다. 스트림은 기본 테이블에 대한 항목 수준 변경 사항을 캡처하며, 벡터 인덱스와 독립적으로 작동합니다.

전역 테이블

벡터 인덱스를 글로벌 테이블에 추가할 수 있으며, UpdateTable을 사용하여 복제본을 추가하면 벡터 인덱스가 있는 테이블을 글로벌 테이블로 변환할 수 있습니다. 차원, 거리 함수, SearchSchema, 프로젝션을 포함한 벡터 인덱스 정의는 각 새 복제본 리전에 자동으로 복제됩니다. 복제본 리전에서는 벡터 인덱스를 별도로 생성하지 않습니다.

복제본 리전에서 작성하는 항목은 다른 리전에 복제되고 해당 리전에서 인덱싱됩니다. 복제가 완료되면 각 리전의 SearchVectors에서 동일한 벡터 세트를 검색합니다. 벡터 검색은 근사 최근접 이웃(ANN)을 사용하므로, 서로 다른 리전에서 실행한 검색은 동일한 데이터에서도 동일한 쿼리에 대해 약간 다른 결과 또는 순서를 반환할 수 있습니다. 다른 리전의 벡터 복제 및 인덱싱은 다중 리전 강력한 일관성(MRSC) 글로벌 테이블에서도 비동기식입니다. 한 리전에서 방금 작성한 벡터는 변경 사항이 전파될 때까지는 다른 리전의 SearchVectors 결과에 아직 표시되지 않을 수 있습니다.

온디맨드 용량 필요

벡터 인덱스에는 글로벌 테이블도 지원하는 온디맨드 용량 모드가 필요합니다. 이미 온디맨드 용량을 사용하는 테이블에 벡터 인덱스와 복제본을 생성합니다.

특정 시점 복구(PITR) 및 백업

특정 시점 복구 또는 온디맨드 백업에서 테이블을 복원하면 DynamoDB가 기본 테이블 데이터와 벡터 인덱스 정의를 복원합니다. 글로벌 보조 인덱스와 마찬가지로 DynamoDB는 복원된 기본 테이블 데이터에서 벡터 인덱스를 바이트 단위로 복사하는 대신 다시 빌드하므로 인덱스는 검색 준비가 되기 전에 백필을 거치게 됩니다. SearchVectors를 실행하기 전에 복원된 인덱스에서 IndexStatusACTIVE이고 Backfillingfalse가 될 때까지 기다립니다.

TTL(Time To Live)

벡터 인덱스가 있는 테이블에서 DynamoDB TTL을 사용할 수 있습니다. TTL이 기본 테이블에서 만료된 항목을 삭제하면 DynamoDB는 수동 삭제와 동일한 방식으로 벡터 인덱스에서 해당 항목을 제거합니다. 따라서 만료된 항목은 삭제가 인덱스로 전파된 후에는 SearchVectors 결과에 표시되지 않습니다.

테이블 데이터 가져오기 및 내보내기

벡터 인덱스가 있는 테이블을 Amazon S3로 내보낼 수 있습니다. 내보내기에는 항목에 저장된 벡터 속성을 포함한 기본 테이블 항목이 포함됩니다. Amazon S3에서 새 테이블로 데이터를 가져올 때 가져오기 요청에서 CreateTable과 동일한 방식으로 벡터 인덱스를 정의합니다. DynamoDB는 가져온 항목을 작성되는 대로 인덱싱하고 가져오기가 완료되면 벡터 인덱스를 사용할 수 있게 됩니다.

DAX

DynamoDB Accelerator(DAX)는 SearchVectors 작업을 지원하지 않습니다. 애플리케이션이 다른 읽기 작업에 DAX를 사용하는 경우에도 SearchVectors 요청을 DynamoDB로 직접 보냅니다. 기본 테이블 읽기의 DAX 캐싱은 벡터 인덱스의 존재에 영향을 받지 않습니다.