• Milvus 소개
  • 시작하기
  • 개념
  • 사용자 안내서
    • 컬렉션
    • 스키마 및 데이터 필드
    • 삽입 및 삭제
    • 색인
      • 부동 소수점 벡터 인덱스
      • 이진 벡터 인덱스
      • 희소 벡터 인덱스
      • 스칼라 인덱스
      • GPU 지원 인덱스
    • 검색
    • 함수 및 모델 추론
    • 저장소 최적화
    • 스냅샷
  • 데이터 가져오기
  • AI 도구
  • 관리 가이드
  • 도구
  • 연동 기능
  • 튜토리얼
  • 자주 묻는 질문
  • API Reference

FAISSCompatible with Milvus 3.0.0+

FAISS 인덱스 유형은 Milvus 3.0.0 이상 버전에서 사용할 수 있는 전문가 수준의 패스스루 기능입니다. 이 기능을 사용하면 고정된 Milvus 인덱스 유형을 선택하는 대신 Faiss 인덱스 팩토리 문자열을 직접 지정할 수 있습니다.

이미 테스트를 거친 Faiss 레시피가 있고 그 구성을 직접 제어해야 할 경우 FAISS 를 사용하십시오. 전용 Milvus 인덱스 유형이 있는 일반적인 레시피의 경우, 안정적이고 문서화된 매개변수 계약이 있으므로 전용 유형을 우선적으로 사용하는 것이 좋습니다.

업스트림 Faiss에서 허용하는 팩토리 문자열이 Milvus에서 자동으로 지원되는 것은 아닙니다. 호환성은 벡터 필드 유형, 메트릭, 차원, Milvus 이미지에 컴파일된 Faiss 모듈, 그리고 생성된 인덱스가 Milvus에서 요구하는 연산을 지원하는지 여부에 따라 달라집니다.

제한 사항

  • FAISS FLOAT_VECTOR 및 필드를 지원합니다. , , 또는 필드는 지원하지 않습니다. BINARY_VECTOR FLOAT16_VECTOR BFLOAT16_VECTOR INT8_VECTOR SPARSE_FLOAT_VECTOR

  • 일반 FAISS 어댑터는 CPU에서 실행됩니다. 이는 Faiss GPU 인덱스 유형이 아닙니다.

  • faiss_index_name 빌드 매개변수가 필수입니다. Milvus는 레시피를 전용 Milvus 인덱스 유형으로 변환하지 않고 해당 값을 Faiss로 전달합니다.

  • 빌드 및 검색 매개변수는 팩토리별로 다릅니다. 한 팩토리에서 지원하는 매개변수가 다른 팩토리에서는 거부될 수 있습니다.

  • 스칼라 필터링을 사용하려면 기본 Faiss 인덱스가 ID 선택기를 지원해야 합니다. Milvus 3.0.0 테스트는 Flat, IVF64,FlatHNSW16,Flat 부동 소수점 팩토리를 사용한 필터링 검색을 다룹니다. 모든 팩토리가 필터를 지원하거나, 이진 FAISS 인덱스가 스칼라 필터링을 지원한다고 가정하지 마십시오.

  • 검색 이터레이터는 지원되지 않습니다.

  • 이 어댑터는 원시 벡터 검색 기능을 제공하지 않습니다.

  • 범위 검색 지원 여부는 팩토리에 따라 다릅니다. Float Flat 는 릴리스 범위를 지원합니다. 이진 FAISS 인덱스에서는 범위 검색을 사용하지 마십시오.

  • 팩토리가 성공적으로 빌드되더라도 일부 Milvus 검색 작업을 거부할 수 있습니다. 예를 들어, standalone PQ8x4 는 스칼라 필터링 검색에서 사용되는 선택자를 거부합니다. 필터링되지 않은 사용에 대해서는 별도로 유효성을 확인하십시오.

  • Milvus 3.0.0에서는 인덱스를 재로드한 후 COSINE 점수와 범위 검색 임계값을 다시 검증해야 합니다. Knowhere v3.0.6은 역직렬화 과정에서 FAISS 어댑터의 코사인 정규화 상태를 복원하지 않습니다.

작동 원리

FAISS index passthrough workflow FAISS 인덱스 패스스루 워크플로우

인덱스 구축 시, Milvus는 faiss_index_name, 벡터 필드 유형, 메트릭 및 기타 구축 매개변수를 Knowhere FAISS 어댑터로 전달합니다. 어댑터는 FLOAT_VECTOR 필드의 경우 faiss::index_factory() 를, BINARY_VECTOR 필드의 경우 faiss::index_binary_factory() 를 호출합니다. 그 결과 생성된 객체는 일반적인 Milvus 인덱스 수명 주기를 통해 관리되는 네이티브 Faiss 인덱스입니다.

검색 시, 어댑터는 제공된 팩토리별 매개변수를 일치하는 Faiss SearchParameters 객체로 변환합니다. 지원되는 부동소수점 팩토리의 경우, Milvus 필터 비트셋을 Faiss 선택기로도 전달합니다. 셀렉터 지원은 팩토리별로 다르며, 공개된 테스트에서는 이진 FAISS 인덱스에 대한 스칼라 필터링을 지원하지 않습니다. 이 때문에 레시피가 독립형 Faiss에서는 유효할 수 있지만, Milvus 검색 경로에서 요구하는 작업은 거부될 수 있습니다.

필수 조건

  • Milvus 3.0.0 이상
  • PyMilvus 3.0.0 이상
  • Faiss 인덱스 팩토리 구문 및 선택한 팩토리의 훈련 요구 사항에 대한 이해

설치 방법은 PyMilvus 설치를 참조하십시오.

팩토리 문자열 선택

팩토리 문자열은 Faiss 인덱스를 일련의 구성 요소로 설명합니다. 다음 예시는 Milvus 3.0.0 릴리스 테스트에서 검증되었습니다. 이 목록은 모든 경우를 망라하지는 않습니다.

팩토리 문자열필드 유형릴리스 테스트에서 검증된 메트릭검색 매개변수비고
FlatFLOAT_VECTORL2, IP, COSINE없음정확한 검색.
IVF64,FlatFLOAT_VECTORL2, IP, COSINEnprobe64개의 역순 목록과 압축되지 않은 벡터를 사용하는 IVF.
HNSW16,FlatFLOAT_VECTORL2, IP, COSINEefSearch플랫 벡터 저장을 사용하는 HNSW 그래프.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2팩토리별OPQ, IVF 및 PQ를 결합합니다. 사용자의 데이터로 훈련 규모와 재현율을 검증하십시오.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe, k_factorPQ 후보 검색 후 플랫 리파이너를 사용합니다.
PQ8x4FLOAT_VECTORL2없음릴리스 테스트가 내장되어 있습니다. 인덱스가 선택기를 거부하기 때문에 스칼라 필터링 검색이 실패합니다. 필터링되지 않은 사용은 별도로 검증하십시오.
BFlatBINARY_VECTORHAMMING없음이진 벡터에 대한 정확한 검색.

COSINE 항목은 빌드 및 검색 스모크 테스트 범위를 나타냅니다. Milvus 3.0.0의 경우, 인덱스 재로드 후 점수 또는 범위 검색의 정확성을 보장하지 않습니다. ‘제한 사항’을 참조하십시오.

부동소수점 인덱스 빌드 및 검색

다음 예제는 128차원 벡터 3,000개를 생성합니다. 이는 예제에서 사용되는 ‘ IVF64,Flat ’ 레시피에 충분한 훈련 데이터를 제공합니다. 인덱스를 빌드하고 검색하기 전에 설정 블록을 펼치고 실행하십시오.

부동소수점 벡터 컬렉션 준비

import random

from pymilvus import DataType, MilvusClient

client = MilvusClient(uri="http://localhost:19530")
collection_name = "faiss_float_example"

if client.has_collection(collection_name):
    client.drop_collection(collection_name)

rng = random.Random(42)
vectors = [[rng.random() for _ in range(128)] for _ in range(3000)]

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("category", DataType.VARCHAR, max_length=32)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=128)

client.create_collection(collection_name=collection_name, schema=schema)

rows = [
    {
        "id": i,
        "category": "reference" if i % 2 == 0 else "query",
        "vector": vector,
    }
    for i, vector in enumerate(vectors)
]

client.insert(collection_name=collection_name, data=rows)
client.flush(collection_name=collection_name)

인덱스 생성

' index_type '을 ' FAISS'로 설정하고, ' faiss_index_name '를 사용하여 네이티브 Faiss 팩토리 레시피를 선택하십시오.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="vector",
    index_name="faiss_ivf_flat",
    index_type="FAISS",
    metric_type="L2",
    params={"faiss_index_name": "IVF64,Flat"},
)

client.create_index(collection_name=collection_name, index_params=index_params)
client.load_collection(collection_name=collection_name)

IVF64,Flat 팩토리 문자열은 64개의 역목록을 가진 IVF 인덱스를 생성하고, 각 목록에 압축되지 않은 벡터를 저장합니다.

인덱스 검색

search_params.params 내에서 팩토리별 검색 매개변수를 설정합니다. IVF 팩토리의 경우, nprobe 는 Faiss가 검색할 인버티드 리스트의 수를 제어합니다.

search_params = {
    "params": {"nprobe": 8},
}

results = client.search(
    collection_name=collection_name,
    data=[vectors[0]],
    anns_field="vector",
    filter='category == "reference"',
    search_params=search_params,
    limit=5,
    output_fields=["category"],
)

for hits in results:
    for hit in hits:
        print(hit)

쿼리는 ` nprobe=8`를 사용하므로, Faiss는 64개의 역색인 리스트 중 8개를 검색합니다. 필터는 ` category ` 값이 ` reference`인 엔티티로 결과를 제한합니다.

이진 인덱스 구축 및 검색

BINARY_VECTOR 필드의 경우, BFlat 와 같은 이진 팩토리 문자열과 호환되는 이진 메트릭을 사용하십시오. 인덱스를 구축하고 검색하기 전에 설정 블록을 확장하여 실행하십시오.

바이너리 벡터 컬렉션 준비

import random

from pymilvus import DataType, MilvusClient

client = MilvusClient(uri="http://localhost:19530")
collection_name = "faiss_binary_example"

if client.has_collection(collection_name):
    client.drop_collection(collection_name)

rng = random.Random(7)
vectors = [bytes(rng.getrandbits(8) for _ in range(16)) for _ in range(300)]

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("binary_vector", DataType.BINARY_VECTOR, dim=128)

client.create_collection(collection_name=collection_name, schema=schema)
client.insert(
    collection_name=collection_name,
    data=[{"id": i, "binary_vector": vector} for i, vector in enumerate(vectors)],
)
client.flush(collection_name=collection_name)

인덱스 구축

이 바이너리 벡터 예제에서는 BFlat 을 팩토리 문자열로, HAMMING 을 메트릭으로 사용합니다.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="binary_vector",
    index_name="faiss_binary_flat",
    index_type="FAISS",
    metric_type="HAMMING",
    params={"faiss_index_name": "BFlat"},
)

client.create_index(collection_name=collection_name, index_params=index_params)
client.load_collection(collection_name=collection_name)

인덱스 검색

BFlat 에는 패밀리별 검색 매개변수가 없습니다. 검색 요청을 구성할 때 빈 params 매핑을 전달하십시오.

search_params = {"params": {}}

results = client.search(
    collection_name=collection_name,
    data=[vectors[0]],
    anns_field="binary_vector",
    search_params=search_params,
    limit=5,
)

for hits in results:
    for hit in hits:
        print(hit)

각 128차원 바이너리 벡터는 16바이트로 표현됩니다. 자세한 내용은 ‘바이너리 벡터’를 참조하십시오.

빌드 및 검색 매개변수 구성

FAISS 인덱스 유형에는 하나의 필수 패스스루 빌드 매개변수가 있습니다.

매개변수위치설명
faiss_index_nameparams in add_index()Faiss 인덱스 팩토리 문자열입니다. 예: IVF64,Flat.

search_params.params 내부에서 팩토리별 검색 매개변수를 설정합니다. 다음 표에는 일반적인 예시가 나열되어 있으나, 이것이 전부는 아닙니다.

매개변수예시 공장설명
nprobeIVF64,Flat검색할 역순 목록의 수.
efSearchHNSW16,FlatHNSW 검색 후보 목록의 크기.
k_factorIVF64,PQ8x4,RFlat요청된 상위 K개에 대해 리파이너에 제공되는 후보의 수.

Milvus는 어댑터가 인식하는 추가 매개변수만 전달합니다. 구체적인 팩토리 계열에서 지원하지 않는 알 수 없는 빌드 키와 검색 키는 거부됩니다. Milvus는 가능한 모든 팩토리에 대한 범용 매개변수 스키마를 유지하지 않습니다. 선택한 팩토리에 대한 Faiss 문서를 확인한 다음, 배포할 예정인 정확한 Milvus 버전 및 이미지를 기준으로 전체 빌드 및 검색 흐름을 검증하십시오.

오류 및 지원되지 않는 작업 처리

  • 팩토리 문자열이 유효하지 않거나 Milvus 빌드에서 사용할 수 없는 경우, 인덱스 구축이 실패합니다. 컬렉션을 로드하기 전에 인덱스 상태와 실패 원인을 확인하십시오.

  • 매개변수의 유형이 잘못된 경우 검색이 실패합니다. 예를 들어, ` nprobe="invalid" `는 ` nprobe `가 숫자형이어야 하므로 거부됩니다.

  • 매개변수가 구축된 팩토리에 적용되지 않는 경우, 어댑터는 이를 지원되지 않는 것으로 간주하여 거부합니다.

  • 팩토리가 Milvus 선택자를 지원하지 않는 경우, 동일한 팩토리가 독립형 Faiss에서는 검색이 가능하더라도 필터링된 검색이 실패할 수 있습니다.

  • FAISS 인덱스와 함께 search_iterator() 를 사용하지 마십시오.

다음 단계