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 그래프를 구축하여 후보를 빠르게 검색할 수 있도록 합니다. 검색 중에 알고리즘은 정확도를 높이기 위해 선택적으로 더 정밀한 데이터를 사용하여 후보 결과를 구체화할 수 있습니다. 프로세스는 다음과 같이 작동합니다:
데이터 압축: PQ는 각 벡터를 여러 개의 하위 벡터로 분할하고
m(하위 벡터 수) 및nbits(하위 벡터당 비트 수)와 같은 매개변수로 제어되는 중심 코드북을 사용하여 이를 정량화합니다.그래프 구성: 그런 다음 압축된 벡터를 사용해 HNSW 그래프를 구축합니다. 벡터가 압축된 형태로 저장되기 때문에 결과 그래프는 일반적으로 더 작고, 더 적은 메모리를 필요로 하며, 더 빠르게 탐색할 수 있으므로 후보 검색 단계가 크게 빨라집니다.
후보 검색: 쿼리가 실행되면 알고리즘은 HNSW 그래프의 압축된 데이터를 사용하여 후보 이웃 풀을 효율적으로 식별합니다. 이 그래프 기반 조회는 고려해야 하는 벡터의 수를 대폭 줄여 무차별 대입 검색에 비해 쿼리 지연 시간을 개선합니다.
(선택 사항) 결과 구체화: 다음 매개변수를 기반으로 초기 후보 결과를 세분화하여 정확도를 높일 수 있습니다:
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: 인덱스에서 검색을 위한 추가 구성 옵션입니다. 자세한 내용은 인덱스별 검색 매개변수를 참조하세요.
색인 매개변수
이 섹션에서는 인덱스를 만들고 인덱스에서 검색을 수행하는 데 사용되는 매개변수에 대한 개요를 제공합니다.
색인 작성 매개변수
다음 표에는 색인 작성 시 params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.
파라미터 |
설명 |
값 범위 |
조정 제안 |
|
|---|---|---|---|---|
HNSW |
|
나가는 에지와 들어오는 에지를 모두 포함하여 그래프에서 각 노드가 가질 수 있는 최대 연결(또는 에지) 수입니다. 이 매개변수는 인덱스 구성과 검색 모두에 직접적인 영향을 줍니다. |
유형: 정수 범위: [2, 2048] 기본값: |
메모리 사용량과 검색 속도가 주요 관심사인 경우 대부분의 경우, 이 범위 내에서 값을 설정하는 것이 좋습니다: [5, 100]. |
|
인덱스 구성 중에 연결을 위해 고려되는 후보 이웃의 수. 새 요소마다 더 많은 후보 풀이 평가되지만 실제로 설정되는 최대 연결 수는 여전히 |
유형: 정수 범위: [1, int_max] 기본값입니다: |
리소스 제약이 우려되는 경우 인덱스 구축 속도를 높이려면 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [50, 500]. |
|
PQ |
|
양자화 프로세스 중에 각 고차원 벡터를 나눌 하위 벡터(양자화에 사용)의 수입니다. |
유형: 정수 범위: [1, 65536] 기본값입니다: None |
대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [D/8, D]. |
|
각 하위 벡터의 중심 인덱스를 압축된 형태로 표현하는 데 사용되는 비트 수입니다. 각 코드북의 크기를 직접 결정합니다. 각 코드북에는 2n비트의 중심이 포함됩니다. 예를 들어 |
유형: 정수 범위: [1, 24] 기본값입니다: |
|
|
|
검색 중에 구체화 단계를 적용할지 여부를 제어하는 부울 플래그입니다. 구체화에는 쿼리 벡터와 후보 간의 정확한 거리를 계산하여 초기 결과의 순위를 재조정하는 작업이 포함됩니다. |
유형: 부울 범위: [ 기본값입니다: |
높은 정확도가 필수적이며 약간 느린 검색 시간을 용인할 수 있는 경우 |
|
|
세분화 과정에서 사용되는 데이터의 정밀도를 결정합니다. 이 정밀도는 압축 벡터( |
Type: 문자열 범위:[ 기본값: None |
더 높은 메모리 비용으로 정밀도를 최대화하려면 |
인덱스별 검색 매개변수
다음 표에는 색인에서 검색할 때 search_params.params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.
파라미터 |
설명 |
값 범위 |
조정 제안 |
|
|---|---|---|---|---|
HNSW |
|
가장 가까운 이웃을 검색하는 동안 검색 범위를 제어합니다. 얼마나 많은 노드를 방문하고 잠재적인 가장 가까운 이웃으로 평가할지 결정합니다. 이 매개변수는 검색 프로세스에만 영향을 미치며 그래프의 맨 아래 레이어에만 적용됩니다. |
유형: 정수 범위: [1, int_max] 기본값: limit (반환할 가장 가까운 이웃 TopK) |
특히 약간의 정확도 감소를 감수할 수 있는 시나리오에서는 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [K, 10K]. |
PQ |
|
요청된 상위 K 결과와 비교하여 정제(순위 재조정) 단계에서 추가로 검토하는 후보자 수를 제어하는 배율 계수입니다. |
유형: 실수 범위: [1, float_max) 기본값: 1 |
|