HNSW_PQ

HNSW_PQ는 계층적 탐색이 가능한 작은 세계(HNSW) 그래프와 제품 정량화(PQ)를 활용하여 크기와 정확도 간의 균형을 제어할 수 있는 고급 벡터 인덱싱 방법을 생성합니다. 이 인덱스 유형은 HNSW_SQ에 비해 쿼리 처리 속도가 느리고 인덱스 구축 시간이 길지만 동일한 압축 수준에서 더 높은 검색 회수율을 제공합니다.

개요

HNSW_PQ는 두 가지 인덱싱 기술을 결합합니다: 빠른 그래프 기반 탐색을 위한 HNSW와 효율적인 벡터 압축을 위한 PQ입니다.

HNSW

HNSW는 각 노드가 데이터 세트의 벡터에 해당하는 다층 그래프를 구성합니다. 이 그래프에서 노드는 유사성에 따라 연결되므로 데이터 공간을 빠르게 탐색할 수 있습니다. 계층적 구조를 통해 검색 알고리즘이 후보 이웃을 좁힐 수 있으므로 고차원 공간에서 검색 프로세스를 크게 가속화할 수 있습니다.

자세한 내용은 HNSW를 참조하세요.

PQ

PQ는 고차원 벡터를 더 작은 하위 벡터로 분해한 다음 양자화하여 압축하는 벡터 압축 기법입니다. 이 압축은 메모리 요구량을 획기적으로 줄이고 거리 계산을 가속화합니다.

자세한 내용은 IVF_PQ를 참조하세요.

HNSW + PQ

HNSW_PQ는 HNSW와 PQ의 강점을 결합하여 효율적인 근사 최인접 이웃 검색을 가능하게 합니다. PQ를 사용하여 데이터를 압축한 다음(따라서 메모리 사용량을 줄임), 이렇게 압축된 벡터에 HNSW 그래프를 구축하여 후보를 빠르게 검색할 수 있도록 합니다. 검색 중에 알고리즘은 정확도를 높이기 위해 선택적으로 더 정밀한 데이터를 사용하여 후보 결과를 구체화할 수 있습니다. 프로세스는 다음과 같이 작동합니다:

  1. 데이터 압축: PQ는 각 벡터를 여러 개의 하위 벡터로 분할하고 m (하위 벡터 수) 및 nbits (하위 벡터당 비트 수)와 같은 매개변수로 제어되는 중심 코드북을 사용하여 이를 정량화합니다.

  2. 그래프 구성: 그런 다음 압축된 벡터를 사용해 HNSW 그래프를 구축합니다. 벡터가 압축된 형태로 저장되기 때문에 결과 그래프는 일반적으로 더 작고, 더 적은 메모리를 필요로 하며, 더 빠르게 탐색할 수 있으므로 후보 검색 단계가 크게 빨라집니다.

  3. 후보 검색: 쿼리가 실행되면 알고리즘은 HNSW 그래프의 압축된 데이터를 사용하여 후보 이웃 풀을 효율적으로 식별합니다. 이 그래프 기반 조회는 고려해야 하는 벡터의 수를 대폭 줄여 무차별 대입 검색에 비해 쿼리 지연 시간을 개선합니다.

  4. (선택 사항) 결과 구체화: 다음 매개변수를 기반으로 초기 후보 결과를 세분화하여 정확도를 높일 수 있습니다:

    • refine: 이 구체화 단계의 활성화 여부를 제어합니다. true 로 설정하면 시스템은 더 정밀한 표현 또는 압축되지 않은 표현을 사용하여 거리를 다시 계산합니다.

    • refine_type: 세분화 중에 사용되는 데이터의 정밀도 수준을 지정합니다(예: SQ6, SQ8, BF16). FP32 와 같이 정밀도가 높을수록 더 정확한 결과를 얻을 수 있지만 더 많은 메모리가 필요합니다. 이는 원본 압축 데이터의 정밀도를 sq_type.

    • refine_k: 배율 인자로 작용합니다. 예를 들어 상위 k가 100이고 refine_k 이 2인 경우 시스템은 상위 200개 후보의 순위를 다시 매기고 가장 좋은 100개를 반환하여 전반적인 정확도를 높입니다.

전체 매개변수 목록과 유효한 값은 색인 매개변수를 참조하세요.

색인 만들기

Milvus의 벡터 필드에 HNSW_PQ 인덱스를 구축하려면 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="HNSW_PQ", # 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={
        "M": 30, # Maximum number of neighbors each node can connect to in the graph
        "efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
        "m": 384, 
        "nbits": 8,
        "refine": true, # Whether to enable the refinement step
        "refine_type": "SQ8" # Precision level of data used for refinement
    } # Index building params
)

이 구성에서는

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

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

  • params: 인덱스 구축을 위한 추가 구성 옵션입니다. 자세한 내용은 인덱스 구축 파라미터를 참조하세요.

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

인덱스에서 검색

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

search_params = {
    "params": {
        "ef": 10, # Parameter controlling query time/accuracy trade-off
        "refine_k": 1 # The magnification factor
    }
}

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=3,  # TopK results to return
    search_params=search_params
)

이 구성에서는

색인 매개변수

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

색인 작성 매개변수

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

파라미터

설명

값 범위

조정 제안

HNSW

M

나가는 에지와 들어오는 에지를 모두 포함하여 그래프에서 각 노드가 가질 수 있는 최대 연결(또는 에지) 수입니다. 이 매개변수는 인덱스 구성과 검색 모두에 직접적인 영향을 줍니다.

유형: 정수 범위: [2, 2048]

기본값: 30 (노드당 최대 30개의 나가는 에지와 30개의 들어오는 에지)

M 이 클수록 일반적으로 정확도는 높아지지만 메모리 오버헤드가 증가하고 인덱스 구축과 검색 속도가 모두 느려집니다. 차원이 높거나 높은 리콜이 중요한 데이터 세트의 경우 M 을 늘리는 것을 고려하세요.

메모리 사용량과 검색 속도가 주요 관심사인 경우 M 을 줄이는 것을 고려하세요.

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

efConstruction

인덱스 구성 중에 연결을 위해 고려되는 후보 이웃의 수. 새 요소마다 더 많은 후보 풀이 평가되지만 실제로 설정되는 최대 연결 수는 여전히 M 으로 제한됩니다.

유형: 정수 범위: [1, int_max]

기본값입니다: 360

efConstruction 이 높을수록 일반적으로 더 많은 잠재적 연결이 탐색되므로 더 정확한 인덱스가 생성됩니다. 하지만 색인 시간이 길어지고 색인 구축 중 메모리 사용량이 증가 합니다. 특히 색인 시간이 덜 중요한 시나리오에서는 정확도를 높이려면 efConstruction 을 늘리는 것이 좋습니다.

리소스 제약이 우려되는 경우 인덱스 구축 속도를 높이려면 efConstruction 을 줄이는 것을 고려하세요.

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

PQ

m

양자화 프로세스 중에 각 고차원 벡터를 나눌 하위 벡터(양자화에 사용)의 수입니다.

유형: 정수 범위: [1, 65536]

기본값입니다: None

m 값이 클수록 정확도가 향상될 수 있지만 계산 복잡성과 메모리 사용량이 증가합니다. m 은 적절한 분해를 보장하기 위해 벡터 차원(D)의 제수여야 합니다. 일반적으로 권장되는 값은 m = D/2입니다.

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

nbits

각 하위 벡터의 중심 인덱스를 압축된 형태로 표현하는 데 사용되는 비트 수입니다. 각 코드북의 크기를 직접 결정합니다. 각 코드북에는 2n비트의 중심이 포함됩니다. 예를 들어 nbits 을 8로 설정하면 각 하위 벡터는 8비트 중심 인덱스로 표시됩니다. 따라서 해당 하위 벡터에 대해 코드북에28개 (256개)의 가능한 중심이 허용됩니다.

유형: 정수 범위: [1, 24]

기본값입니다: 8

nbits 값이 클수록 코드북의 크기가 커져 원본 벡터를 더 정확하게 표현할 수 있습니다. 하지만 각 인덱스를 저장하는 데 더 많은 비트를 사용하므로 압축률이 떨어집니다. 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [1, 16].

refine

검색 중에 구체화 단계를 적용할지 여부를 제어하는 부울 플래그입니다. 구체화에는 쿼리 벡터와 후보 간의 정확한 거리를 계산하여 초기 결과의 순위를 재조정하는 작업이 포함됩니다.

유형: 부울 범위: [true, false]

기본값입니다: false

높은 정확도가 필수적이며 약간 느린 검색 시간을 용인할 수 있는 경우 true 로 설정합니다. 속도가 우선이고 약간의 정확도 저하를 감수할 수 있는 경우 false 을 사용합니다.

refine_type

세분화 과정에서 사용되는 데이터의 정밀도를 결정합니다. 이 정밀도는 압축 벡터( mnbits 매개변수에 의해 설정된 대로)보다 높아야 합니다.

Type: 문자열 범위:[ SQ6, SQ8, BF16, FP16, FP32 ]입니다.

기본값: None

더 높은 메모리 비용으로 정밀도를 최대화하려면 FP32, 더 나은 압축을 위해서는 SQ6/SQ8 을 사용하세요. BF16FP16 은 균형 잡힌 대안을 제공합니다.

인덱스별 검색 매개변수

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

파라미터

설명

값 범위

조정 제안

HNSW

ef

가장 가까운 이웃을 검색하는 동안 검색 범위를 제어합니다. 얼마나 많은 노드를 방문하고 잠재적인 가장 가까운 이웃으로 평가할지 결정합니다. 이 매개변수는 검색 프로세스에만 영향을 미치며 그래프의 맨 아래 레이어에만 적용됩니다.

유형: 정수 범위: [1, int_max]

기본값: limit (반환할 가장 가까운 이웃 TopK)

ef 이 클수록 일반적으로 더 많은 잠재적 이웃을 고려하므로 검색 정확도가 높아 집니다. 그러나 검색 시간도 증가합니다. 높은 회상률을 달성하는 것이 중요하고 검색 속도가 덜 중요한 경우에는 ef 을 늘리는 것이 좋습니다.

특히 약간의 정확도 감소를 감수할 수 있는 시나리오에서는 ef 을 줄여 검색 속도를 우선시하는 것이 좋습니다.

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

PQ

refine_k

요청된 상위 K 결과와 비교하여 정제(순위 재조정) 단계에서 추가로 검토하는 후보자 수를 제어하는 배율 계수입니다.

유형: 실수 범위: [1, float_max)

기본값: 1

refine_k 값이 클수록 검색 회수율과 정확도가 향상되지만 검색 시간과 리소스 사용량도 증가합니다. 값이 1이면 구체화 프로세스에서 초기 상위 K 결과만 고려한다는 의미입니다.

Try Managed Milvus for Free

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

Get Started
피드백

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