Amazon DocumentDB에 대한 벡터 검색 - Amazon DocumentDB

Amazon DocumentDB에 대한 벡터 검색

벡터 검색은 기계 학습에서 거리 또는 유사성 지표를 사용하여 벡터 표현을 비교하여 지정된 데이터 포인트와 유사한 데이터 포인트를 찾는 데 사용되는 방법입니다. 벡터 공간에 두 벡터가 가까울수록 기본 항목이 더 유사한 것으로 간주됩니다. 이 기법은 데이터의 의미 체계적 의미를 캡처하는 데 도움이 됩니다. 이 접근 방식은 추천 시스템, 자연어 처리 및 이미지 인식과 같은 다양한 애플리케이션에 유용합니다.

Amazon DocumentDB에 대한 벡터 검색은 JSON 기반 문서 데이터베이스의 유연성과 풍부한 쿼리 기능을 벡터 검색 기능과 결합합니다. 기존 Amazon DocumentDB 데이터 또는 유연한 문서 데이터 구조를 사용하여 의미 검색 경험, 제품 권장 사항, 개인화, 챗봇, 사기 탐지 및 이상 탐지와 같은 기계 학습 및 생성형 AI 사용 사례를 구축하려는 경우 Amazon DocumentDB에 대한 벡터 검색이 이상적인 선택입니다. 벡터 검색은 Amazon DocumentDB 5.0 인스턴스 기반 클러스터에서 사용할 수 있습니다.

벡터 삽입

Amazon DocumentDB 데이터베이스에 벡터를 삽입하려면 기존 삽입 방법을 사용할 수 있습니다.

다음 예제에서는 테스트 데이터베이스 내에 5개의 문서 모음이 생성됩니다. 각 문서에는 제품 이름과 해당 벡터 임베딩의 두 필드가 포함되어 있습니다.

db.collection.insertMany([ {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]}, {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]}, {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]}, {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]}, {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]} ]);

벡터 인덱스 생성

Amazon DocumentDB는 계층적 탐색 가능 스몰 월드(HNSW) 인덱싱과 플랫 압축을 사용한 역 파일(IVFFlat) 인덱싱 방법을 모두 지원합니다. IVFFlat 인덱스는 벡터를 목록으로 분리한 다음 쿼리 벡터에 가장 가까운 해당 목록의 선택된 하위 집합을 검색합니다. 반면 HNSW 인덱스는 벡터 데이터를 다층 그래프로 구성합니다. HNSW는 IVFFlat 에 비해 구축 시간이 느리지만 쿼리 성능 및 리콜을 개선합니다. IVFFlat과 달리 HNSW에는 훈련 단계가 포함되어 있지 않으므로 초기 데이터 로드 없이 인덱스를 생성할 수 있습니다. 대부분의 사용 사례에서는 벡터 검색에 HNSW 인덱스 유형을 사용하는 것이 좋습니다.

벡터 인덱스를 생성하지 않으면 Amazon DocumentDB가 정확히 가장 가까운 이웃 검색을 수행하여 완벽한 호출을 보장합니다. 그러나 프로덕션 시나리오에서는 속도가 중요합니다. 속도 향상을 위해 일부 리콜을 처리할 수 있는 벡터 인덱스를 사용하는 것이 좋습니다. 벡터 인덱스를 추가하면 쿼리 결과가 달라질 수 있다는 점에 유의해야 합니다.

템플릿

다음 createIndex 또는 runCommand 템플릿을 사용하여 벡터 필드에 벡터 인덱스를 빌드할 수 있습니다.

Using createIndex

mongosh 및 Java와 같은 특정 드라이버에서 createIndexvectorOptions 파라미터를 사용하면 오류가 발생할 수 있습니다. 이러한 경우 runCommand를 사용하는 것이 좋습니다.

db.collection.createIndex( { "<vectorField>": "vector" }, { "name": "<indexName>", "vectorOptions": { "type": " <hnsw> | <ivfflat> ", "dimensions": <number_of_dimensions>, "similarity": " <euclidean> | <cosine> | <dotProduct> ", "lists": <number_of_lists> [applicable for IVFFlat], "m": <max number of connections> [applicable for HNSW], "efConstruction": <size of the dynamic list for index build> [applicable for HNSW] } } );
Using runCommand

mongosh 및 Java와 같은 특정 드라이버에서 createIndexvectorOptions 파라미터를 사용하면 오류가 발생할 수 있습니다. 이러한 경우 runCommand를 사용하는 것이 좋습니다.

db.runCommand( { "createIndexes": "<collection>", "indexes": [{ key: { "<vectorField>": "vector" }, vectorOptions: { type: " <hnsw> | <ivfflat> ", dimensions: <number of dimensions>, similarity: " <euclidean> | <cosine> | <dotProduct> ", lists: <number_of_lists> [applicable for IVFFlat], m: <max number of connections> [applicable for HNSW], efConstruction: <size of the dynamic list for index build> [applicable for HNSW] }, name: "myIndex" }] } );
파라미터 요구 사항 데이터 유형 설명

name

선택 사항

문자열

인덱스의 이름을 지정합니다.

영숫자

type

선택 사항

인덱스의 유형을 지정합니다.

지원: hnsw 또는 ivfflat

기본값: HNSW(엔진 패치 3.0.4574 이상)

dimensions

필수

정수

벡터 데이터의 차원 수를 지정합니다.

최대 2,000개의 차원.

similarity

필수

문자열

유사성 계산에 사용되는 거리 지표를 지정합니다.

  • euclidean

  • cosine

  • dotProduct

lists

IVFFlat에 필요

정수

IVFFlat 인덱스가 벡터 데이터를 그룹화하는 데 사용하는 클러스터 수를 지정합니다. 권장 설정은 최대 100만 개 문서의 경우 문서 수/1000, 그리고 100만 개가 넘는 문서의 경우 sqrt(# of documents)입니다.

최소: 1

최대: 특성 및 제한 사항 아래의 인스턴스 유형별 목록 표를 참조하세요.

m

선택 사항

정수

HNSW 인덱스의 최대 연결 수를 지정합니다.

기본값: 16

범위 [2, 100]

efConstruction

선택 사항

정수

HNSW 인덱스에 대한 그래프를 구성할 동적 후보 목록의 크기를 지정합니다.

efConstruction은 (2 * m)보다 크거나 같아야 합니다.

기본값: 64

범위 [4, 1000]

검색의 정확도/리콜, 빌드 시간 및 성능에 영향을 미치므로 IVFFlat lists, m 및 HNSW efConstruction과 같은 하위 파라미터의 값을 적절하게 설정하는 것이 중요합니다. 목록 값이 높을수록 각 목록의 벡터 수가 줄어들어 리전이 작아지므로 쿼리 속도가 증가합니다. 그러나 리전 크기가 작을수록 더 많은 리콜 오류가 발생하여 정확도가 낮아질 수 있습니다. HNSW의 경우 mefConstruction 값을 늘리면 정확도가 높아지지만 인덱스 구축 시간과 크기도 증가합니다. 다음 예를 참조하세요.

예시

HNSW
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "hnsw", "dimensions": 3, "similarity": "euclidean", "m": 16, "efConstruction": 64 } } );
IVFFlat
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "ivfflat", "dimensions": 3, "similarity": "euclidean", "lists":1 } } )

인덱스 정의 가져오기

다음 getIndexes 명령을 사용하여 벡터 인덱스를 포함한 인덱스의 세부 정보를 볼 수 있습니다.

db.collection.getIndexes()

출력 예

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.collection" }, { "v" : 4, "key" : { "vectorEmbedding" : "vector" }, "name" : "myIndex", "vectorOptions" : { "type" : "ivfflat", "dimensions" : 3, "similarity" : "euclidean", "lists" : 1 }, "ns" : "test.collection" } ]

벡터 쿼리

벡터 쿼리 템플릿

다음 템플릿을 사용하여 벡터를 쿼리합니다.

db.collection.aggregate([ { $search: { "vectorSearch": { "vector": <query vector>, "path": "<vectorField>", "similarity": "<distance metric>", "k": <number of results>, "probes":<number of probes> [applicable for IVFFlat], "efSearch":<size of the dynamic list during search> [applicable for HNSW] } } } ]);
파라미터 요구 사항 유형 설명

vectorSearch

필수

연산자

$search 명령 내에서 벡터를 쿼리하는 데 사용됩니다.

vector

필수

array

유사한 벡터를 찾는 데 사용할 쿼리 벡터를 나타냅니다.

path

필수

문자열

벡터 필드의 이름을 정의합니다.

k

필수

정수

검색에서 반환하는 결과의 수를 지정합니다.

similarity

필수

문자열

유사성 계산에 사용되는 거리 지표를 지정합니다.

  • euclidean

  • cosine

  • dotProduct

probes

선택 사항

정수

벡터 검색에서 검사할 클러스터 수입니다. 값이 높을수록 속도 비용으로 더 나은 리콜을 제공합니다. 정확히 가장 가까운 이웃 검색을 위한 목록 수로 설정할 수 있습니다(실행 계획기가 인덱스를 사용하지 않는 시점). 미세 조정을 시작하기 위한 권장 설정은 sqrt(# of lists)입니다.

기본값: 1

efSearch

선택 사항

정수

검색 중에 HNSW 인덱스가 사용하는 동적 후보 목록의 크기를 지정합니다. efSearch 값이 높을수록 속도 비용으로 더 나은 리콜을 제공합니다.

기본값: 40

범위 [1, 1000]

원하는 성능과 정확도를 달성하려면 efSearch(HNSW) 또는 probes(IVFlat )의 값을 미세 조정하는 것이 중요합니다. 다음 예제 작업을 참조하세요.

HNSW
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "efSearch": 40 } } } ]);
IVFFlat
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "probes": 1 } } } ]);

출력 예

이 작업의 출력은 다음과 같이 표시됩니다.

{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] } { "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }

특성 및 제한 사항

버전 호환성

  • Amazon DocumentDB에 대한 벡터 검색은 Amazon DocumentDB 5.0 인스턴스 기반 클러스터에서만 사용할 수 있습니다.

벡터

  • Amazon DocumentDB는 최대 2,000개의 차원으로 벡터를 인덱싱할 수 있습니다. 하지만 인덱스 없이 최대 16,000개의 차원을 저장할 수 있습니다.

인덱스

  • IVFFlat 인덱스 생성의 경우 목록 파라미터의 권장 설정은 최대 100만 개의 문서의 경우 문서 수/1000 및 100만 개가 넘는 문서의 경우 sqrt(# of documents)입니다. 작동 메모리 제한으로 인해 Amazon DocumentDB는 차원 수에 따라 목록 파라미터의 특정 최대값을 지원합니다. 참고로 다음 표에서는 500, 1,000 및 2,000 차원의 벡터에 대한 목록 파라미터의 최대값을 제공합니다.

    인스턴스 유형 500개 차원이 있는 목록 1,000개 차원이 있는 목록 2,000개 차원이 있는 목록

    t3.med

    372

    257

    150

    r5.l

    915

    741

    511

    r5.xl

    1,393

    1,196

    901

    r5.2xl

    5,460

    5,230

    4,788

    r5.4xl

    7,842

    7,599

    7,138

    r5.8xl

    11,220

    10,974

    10,498

    r5.12xl

    13,774

    13,526

    13,044

    r5.16xl

    15,943

    15,694

    15,208

    r5.24xl

    19,585

    19,335

    18,845

  • compound, sparse 또는 partial과 같은 다른 인덱스 옵션은 벡터 인덱스에서 지원되지 않습니다.

  • 병렬 인덱스 빌드는 HNSW 인덱스에 지원되지 않습니다. IVFFlat 인덱스에만 지원됩니다.

벡터 쿼리

  • 벡터 검색 쿼리의 경우 최적의 결과를 위해 probes 또는 efSearch와 같은 파라미터를 미세 조정하는 것이 중요합니다. probes 또는 efSearch 파라미터의 값이 높을수록 재호출이 높고 속도가 낮아집니다. 프로브 파라미터 미세 조정을 시작하기 위한 권장 설정은 sqrt(# of lists)입니다.

모범 사례

Amazon DocumentDB의 벡터 검색을 사용한 작업 모범 사례에 대해서 알아봅니다. 이 섹션은 새로운 모범 사례가 확인되는 대로 지속적으로 업데이트됩니다.

  • 플랫 압축(IVFFlat) 인덱스 생성이 포함된 반전된 파일에는 유사성을 기반으로 데이터 포인트를 클러스터링하고 구성하는 작업이 포함됩니다. 따라서 인덱스가 더 효과적이려면 인덱스를 생성하기 전에 최소한 일부 데이터를 로드하는 것이 좋습니다.

  • 벡터 검색 쿼리의 경우 최적의 결과를 위해 probes 또는 efSearch와 같은 파라미터를 미세 조정하는 것이 중요합니다. probes 또는 efSearch 파라미터의 값이 높을수록 재호출이 높고 속도가 낮아집니다. probes 파라미터 미세 조정을 시작하기 위한 권장 설정은 sqrt(lists)입니다.

리소스