본문 바로가기
WIKI 기술 지식 베이스

IVF_FLAT

원문 보기 위키 갱신

IVF_FLAT 인덱스는 부동소수점 벡터의 검색 성능을 높일 수 있는 인덱싱 알고리즘이에요.

이 인덱스 타입은 빠른 쿼리 응답과 높은 정확도가 필요한 대규모 데이터셋에 이상적이에요. 특히 데이터셋을 클러스터링해 검색 공간을 줄일 수 있고, 클러스터 데이터를 저장할 충분한 메모리가 있을 때 더 유리해요.

출처: Milvus 문서

본문

개요 (Overview)

IVF_FLAT는 Inverted File Flat의 약자로, 부동소수점 벡터를 인덱싱하고 검색하는 이중 구조 방식을 담고 있어요.

  • Inverted File (IVF): k-means 클러스터링을 사용해 벡터 공간을 관리 가능한 영역으로 클러스터링하는 것을 뜻해요. 각 클러스터는 centroid(중심점)로 표현되며, 이 중심점이 클러스터 안 벡터들의 기준점 역할을 해요.
  • Flat: 각 클러스터 안에서 벡터가 원래 형태(평평한 구조) 그대로, 압축이나 양자화 없이 저장되어 정확한 거리 계산이 가능하다는 뜻이에요.

다음 그림은 동작 방식을 보여 줘요.

IVF FLAT Workflow

이 인덱싱 방식은 검색 과정을 빠르게 만들지만 한 가지 잠재적 단점이 있어요. 쿼리 임베딩에 가장 가까운 후보가 실제로는 정확히 가장 가까운 것이 아닐 수 있다는 점이에요. 쿼리 임베딩에 가장 가까운 임베딩이, 가장 가까운 중심점을 기준으로 선택된 클러스터와 다른 클러스터에 있을 때 이런 일이 발생할 수 있어요(아래 시각화 참고).

이 문제를 해결하기 위해 IVF_FLAT는 튜닝할 수 있는 두 가지 하이퍼파라미터를 제공해요.

  • nlist: k-means 알고리즘으로 생성할 파티션 수를 지정해요.
  • nprobe: 검색 중 후보를 찾기 위해 고려할 파티션 수를 지정해요.

nprobe를 1 대신 3으로 설정하면 다음과 같은 결과를 얻어요.

IVF FLAT Workflow 2

nprobe 값을 늘리면 검색에 더 많은 파티션을 포함할 수 있어요. 그러면 쿼리에서 가장 가까운 임베딩이 다른 파티션에 있더라도 놓치지 않도록 하는 데 도움이 돼요. 다만 평가할 후보가 늘어나면서 검색 시간이 늘어나는 비용이 따르죠. 인덱스 파라미터 튜닝에 대한 자세한 내용은 Index params를 참고하세요.

인덱스 구축 (Build index)

Milvus에서 벡터 필드에 IVF_FLAT 인덱스를 구축하려면 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="IVF_FLAT", # 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={
        "nlist": 64, # Number of clusters for the index
    } # Index building params
)

이 구성에서:

  • index_type: 구축할 인덱스의 타입이에요. 이 예시에서는 IVF_FLAT로 설정해요.
  • metric_type: 벡터 간 거리를 계산하는 방법이에요. 지원되는 값에는 COSINE, L2, IP가 있어요. 자세한 내용은 Metric Types를 참고하세요.
  • params: 인덱스 구축을 위한 추가 구성 옵션이에요.

nlist: 데이터셋을 나눌 클러스터 수예요.

IVF_FLAT 인덱스에서 사용할 수 있는 구축 파라미터를 더 알아보려면 Index building params를 참고하세요.

인덱스 파라미터를 구성했다면 create_index() 메서드를 직접 호출하거나 create_collection 메서드에 인덱스 파라미터를 전달해 인덱스를 만들 수 있어요. 자세한 내용은 Create Collection을 참고하세요.

인덱스에서 검색 (Search on index)

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

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

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

이 구성에서:

  • params: 인덱스 검색을 위한 추가 구성 옵션이에요.

nprobe: 검색할 클러스터 수예요.

IVF_FLAT 인덱스에서 사용할 수 있는 검색 파라미터를 더 알아보려면 Index-specific search params를 참고하세요.

인덱스 파라미터 (Index params)

이 섹션에서는 인덱스를 구축하고 인덱스에서 검색할 때 사용하는 파라미터를 개괄적으로 설명해요.

인덱스 구축 파라미터 (Index building params)

다음 표는 인덱스를 구축할 때 params에서 설정할 수 있는 파라미터를 나열해요.

파라미터 설명 값 범위 튜닝 제안
nlist 인덱스 구축 중 k-means 알고리즘으로 만들 클러스터 수예요. 각 클러스터는 중심점으로 표현되며 벡터 목록을 저장해요. 이 값을 늘리면 클러스터마다 벡터 수가 줄어 더 작고 세밀한 파티션이 만들어져요. 타입: Integer 범위: [1, 65536]
기본값: 128
nlist 값이 클수록 더 세밀한 클러스터를 만들어 리콜이 좋아지지만 인덱스 구축 시간이 늘어나요. 데이터셋 크기와 가용 자원에 맞춰 최적화하세요. 대부분의 경우 [32, 4096] 범위 내 값을 권장해요.

인덱스별 검색 파라미터 (Index-specific search params)

다음 표는 인덱스에서 검색할 때 search_params.params에서 설정할 수 있는 파라미터를 나열해요.

파라미터 설명 값 범위 튜닝 제안
nprobe 후보를 검색할 클러스터 수예요. 값이 클수록 더 많은 클러스터를 검색해 검색 범위가 넓어져 리콜이 좋아지지만 쿼리 지연 시간이 늘어나요. 타입: Integer 범위: [1, nlist]
기본값: 8
이 값을 늘리면 리콜이 좋아지지만 검색이 느려질 수 있어요. 속도와 정확도의 균형을 맞추려면 nprobe를 nlist에 비례하게 설정하세요. 대부분의 경우 [1, nlist] 범위 내 값을 권장해요.

더 알아보기 (Learn more)