SCANN

Google의 ScaNN 라이브러리를 기반으로 하는 Milvus의 SCANN 인덱스는 대부분의 검색 알고리즘에서 일반적으로 문제가 되는 대규모 데이터 세트에서도 속도와 정확성 사이의 균형을 유지하면서 벡터 유사도 검색의 확장 문제를 해결하도록 설계되었습니다.

개요

ScaNN은 벡터 검색의 가장 큰 과제 중 하나인 데이터 세트가 점점 더 커지고 복잡해지더라도 고차원 공간에서 가장 관련성이 높은 벡터를 효율적으로 찾는 문제를 해결하기 위해 만들어졌습니다. 이 아키텍처는 벡터 검색 프로세스를 여러 단계로 세분화합니다:

Scann 스캔

  1. 파티셔닝: 데이터 세트를 클러스터로 나눕니다. 이 방법은 전체 데이터 세트를 스캔하는 대신 관련 데이터 하위 집합에만 집중하여 검색 공간을 좁혀 시간과 처리 리소스를 절약합니다. ScaNN은 종종 k-평균과 같은 클러스터링 알고리즘을 사용하여 클러스터를 식별하므로 유사도 검색을 보다 효율적으로 수행할 수 있습니다.

  2. 정량화: ScaNN은 파티셔닝 후 이방성 벡터 양자화라는 양자화 프로세스를 적용합니다. 기존의 양자화는 원본과 압축된 벡터 사이의 전체 거리를 최소화하는 데 초점을 맞추기 때문에, 직접 거리가 아닌 벡터의 내적 곱에 의해 유사성이 결정되는 최대 내적 곱 검색(MIPS)과 같은 작업에는 적합하지 않습니다. 대신 이방성 양자화는 벡터 사이의 병렬 구성 요소 또는 정확한 내적 곱을 계산하는 데 가장 중요한 부분을 보존하는 데 우선순위를 둡니다. 이 접근 방식은 압축된 벡터를 쿼리에 신중하게 정렬함으로써 높은 MIPS 정확도를 유지하여 더 빠르고 정확한 유사도 검색을 가능하게 합니다.

  3. 재랭크: 리랭크 단계는 ScaNN이 파티셔닝 및 양자화 단계의 검색 결과를 미세 조정하는 마지막 단계입니다. 이 리랭킹은 상위 후보 벡터에 정밀한 내적 곱 계산을 적용하여 최종 결과의 정확도를 높입니다. 리랭킹은 초기 필터링과 클러스터링이 거친 레이어 역할을 하는 고속 추천 엔진이나 이미지 검색 애플리케이션에서 매우 중요하며, 최종 단계에서는 가장 관련성이 높은 결과만 사용자에게 반환되도록 보장합니다.

SCANN 의 성능은 속도와 정확도 사이의 균형을 미세 조정할 수 있는 두 가지 주요 매개변수에 의해 제어됩니다:

  • with_raw_data: 원본 벡터 데이터를 양자화된 표현과 함께 저장할지 여부를 제어합니다. 이 매개변수를 활성화하면 재랭킹 시 정확도가 향상되지만 저장 공간이 증가합니다.

  • reorder_k: 최종 순위 재조정 단계에서 얼마나 많은 후보를 정제할지 결정합니다. 값이 클수록 정확도는 향상되지만 검색 대기 시간이 늘어납니다.

특정 사용 사례에 맞게 이러한 매개변수를 최적화하는 방법에 대한 자세한 지침은 색인 매개변수를 참조하세요.

인덱스 구축

Milvus의 벡터 필드에 SCANN 인덱스를 구축하려면 add_index() 방법을 사용하여 index_type, metric_type 및 인덱스에 대한 추가 매개변수를 지정합니다.

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="SCANN", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "with_raw_data": True, # Whether to hold raw data
    } # Index building params
)

이 구성에서는

  • index_type: 빌드할 인덱스 유형입니다. 이 예에서는 값을 SCANN 로 설정합니다.

  • metric_type: 벡터 간의 거리를 계산하는 데 사용되는 메서드입니다. 지원되는 값은 COSINE, L2, IP 입니다. 자세한 내용은 메트릭 유형을 참조하세요.

  • params: 인덱스 구축을 위한 추가 구성 옵션입니다.

    • with_raw_data: 양자화된 표현과 함께 원본 벡터 데이터를 저장할지 여부입니다.

    SCANN 인덱스에 사용할 수 있는 더 많은 구축 매개변수에 대해 알아보려면 인덱스 구축 매개변수를 참조하세요.

인덱스 파라미터가 구성되면 create_index() 메서드를 직접 사용하거나 create_collection 메서드에서 인덱스 파라미터를 전달하여 인덱스를 만들 수 있습니다. 자세한 내용은 컬렉션 만들기를 참조하세요.

인덱스에서 검색

인덱스가 구축되고 엔티티가 삽입되면 인덱스에서 유사도 검색을 수행할 수 있습니다.

search_params = {
    "params": {
        "reorder_k": 10, # Number of candidates to refine
        "nprobe": 8 # Number of clusters to search
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field", # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=10,  # TopK results to return
    search_params=search_params
)

이 구성에서는

  • params: 색인에서 검색을 위한 추가 구성 옵션.

    • reorder_k: 순위 재조정 단계에서 구체화할 후보의 수입니다.
    • nprobe: 검색할 클러스터 수입니다.

    SCANN 인덱스에 사용할 수 있는 검색 매개변수에 대해 자세히 알아보려면 인덱스별 검색 매개변수를 참조하세요.

인덱스 매개변수

이 섹션에서는 인덱스를 구축하고 인덱스에서 검색을 수행하는 데 사용되는 매개변수에 대한 개요를 제공합니다.

인덱스 구축 매개변수

다음 표에는 색인 작성params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.

파라미터

설명

값 범위

조정 제안

nlist

클러스터 단위 수

[1, 65536]

nlist가 높을수록 가지 치기 효율이 높아지고 일반적으로 거친 검색 속도가 빨라지지만 파티션이 너무 작아져 회상률이 떨어질 수 있으며, nlist가 낮을수록 더 큰 클러스터를 스캔하여 회상률이 향상되지만 검색 속도가 느려질 수 있습니다.

with_raw_data

양자화된 표현과 함께 원본 벡터 데이터를 저장할지 여부입니다. 활성화하면 양자화된 근사치 대신 원본 벡터를 사용하여 순위 재지정 단계에서 보다 정확한 유사도 계산을 할 수 있습니다.

유형: 부울

범위 true, false

기본값입니다: true

검색 정확도를 높이고 저장 공간이 크게 중요하지 않은 경우 true 로 설정합니다. 원본 벡터 데이터를 사용하면 순위를 재조정하는 동안 보다 정확한 유사도 계산이 가능합니다.

특히 대규모 데이터 세트의 경우 스토리지 오버헤드와 메모리 사용량을 줄이려면 false 으로 설정합니다. 그러나 순위 재지정 단계에서 양자화된 벡터를 사용하므로 검색 정확도가 약간 낮아질 수 있습니다.

권장: 정확도가 중요한 프로덕션 애플리케이션에서는 true 을 사용하세요.

색인별 검색 매개변수

다음 표에는 색인에서 검색할search_params.params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.

파라미터

설명

값 범위

조정 제안

reorder_k

순위 재조정 단계에서 정제되는 후보 벡터의 수를 제어합니다. 이 매개변수는 초기 파티셔닝 및 양자화 단계에서 보다 정밀한 유사도 계산을 사용하여 재평가할 상위 후보 벡터의 수를 결정합니다.

유형: 유형: 정수

범위: [1, int_max]

기본값: None

reorder_k 이 클수록 일반적으로 최종 구체화 단계에서 더 많은 후보를 고려하므로 검색 정확도가 높아집니다. 그러나 추가 계산으로 인해 검색 시간도 늘어납니다.

높은 회상률을 달성하는 것이 중요하고 검색 속도는 크게 신경 쓰지 않는 경우에는 reorder_k 을 늘리는 것을 고려하세요. 원하는 limit (반환할 TopK 결과)의 2~5배가 좋은 시작점입니다.

특히 약간의 정확도 저하를 감수할 수 있는 시나리오에서는 reorder_k 을 줄여 더 빠른 검색을 우선시하는 것을 고려하세요.

대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다:[제한, 제한 * 5].

nprobe

후보를 검색할 클러스터 수입니다.

유형: 유형: 정수

범위: [1, nlist]

기본값입니다: 8

값이 클수록 더 많은 클러스터를 검색할 수 있으므로 검색 범위가 확장되어 검색 회수율이 향상되지만 쿼리 대기 시간이 늘어납니다.

속도와 정확도의 균형을 맞추려면 nprobenlist 에 비례하여 설정합니다.

대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [1, nlist].

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?