• Acerca de Milvus
  • Empezar
  • Conceptos
  • Guía del usuario
    • Colecciones
    • Esquema y campos de datos
    • Insertar y eliminar
    • Índices
      • Índices vectoriales flotantes
      • Índices vectoriales binarios
      • Índices de vectores dispersos
      • Índices escalares
      • Índices optimizados para GPU
    • Buscar
    • Inferencia de funciones y modelos
    • Optimización del almacenamiento
    • Instantáneas
  • Importación de datos
  • Herramientas de IA
  • Guía de administración
  • Herramientas
  • Integraciones
  • Tutoriales
  • Preguntas frecuentes
  • API Reference

FAISSCompatible with Milvus 3.0.0+

El tipo de índice « FAISS » es una opción de nivel avanzado disponible en Milvus 3.0.0 y versiones posteriores. Permite proporcionar una cadena de fábrica de índices Faiss en lugar de seleccionar un tipo de índice Milvus fijo.

Utiliza « FAISS » cuando ya dispongas de una receta de Faiss probada y necesites un control directo sobre su composición. Para recetas comunes con un tipo de índice específico de Milvus, es preferible utilizar el tipo específico, ya que cuenta con un contrato de parámetros estable y documentado.

Una cadena de fábrica aceptada por Faiss (upstream) no es compatible automáticamente con Milvus. La compatibilidad depende del tipo de campo vectorial, la métrica, la dimensión, los módulos de Faiss compilados en la imagen de Milvus y de si el índice resultante admite las operaciones que requiere Milvus.

Límites

  • FAISS Admite los campos « FLOAT_VECTOR » y « BINARY_VECTOR ». No admite los campos « FLOAT16_VECTOR », « BFLOAT16_VECTOR », « INT8_VECTOR » ni « SPARSE_FLOAT_VECTOR ».

  • El adaptador genérico « FAISS » se ejecuta en la CPU. No es un tipo de índice de Faiss para GPU.

  • El parámetro de compilación « faiss_index_name » es obligatorio. Milvus pasa su valor a Faiss sin convertir la receta a un tipo de índice específico de Milvus.

  • Los parámetros de compilación y búsqueda son específicos de cada fábrica. Un parámetro compatible con una fábrica puede ser rechazado por otra.

  • El filtrado escalar requiere que el índice Faiss subyacente admita un selector de ID. Las pruebas de Milvus 3.0.0 cubren la búsqueda filtrada con las fábricas de tipo flotante Flat, IVF64,Flat y HNSW16,Flat. No se debe dar por sentado que todas las fábricas admiten filtros ni que los índices binarios FAISS admitan el filtrado escalar.

  • No se admiten iteradores de búsqueda.

  • El adaptador no permite la recuperación de vectores sin procesar.

  • La compatibilidad con la búsqueda por rango depende de la fábrica. Float Flat cuenta con cobertura en la versión actual. No utilices la búsqueda por rango con índices binarios FAISS.

  • Una fábrica puede compilarse correctamente, pero aun así rechazar algunas operaciones de búsqueda de Milvus. Por ejemplo, la fábrica independiente PQ8x4 rechaza el selector utilizado por la búsqueda con filtrado escalar. Valida el uso sin filtrar por separado.

  • En Milvus 3.0.0, comprueba las puntuaciones de COSINE y los umbrales de búsqueda por rango tras recargar un índice. Knowhere v3.0.6 no restaura el estado de normalización coseno del adaptador FAISS durante la deserialización.

Cómo funciona

FAISS index passthrough workflow Flujo de trabajo de paso directo del índice FAISS

Para la creación de índices, Milvus reenvía faiss_index_name, el tipo de campo vectorial, la métrica y otros parámetros de creación al adaptador FAISS de Knowhere. El adaptador llama a faiss::index_factory() para los campos de tipo « FLOAT_VECTOR » o a faiss::index_binary_factory() para los campos de tipo « BINARY_VECTOR ». El objeto resultante es un índice FAISS nativo gestionado a través del ciclo de vida normal de los índices de Milvus.

Para la búsqueda, el adaptador convierte los parámetros específicos de fábrica proporcionados en el objeto Faiss correspondiente SearchParameters. En el caso de las fábricas de tipo «float» compatibles, también pasa el conjunto de bits de filtro de Milvus como selector de Faiss. La compatibilidad con los selectores depende de cada fábrica, y las pruebas publicadas no establecen un filtrado escalar para los índices binarios FAISS. Por este motivo, una receta puede ser válida en Faiss de forma independiente, pero rechazar una operación requerida por la ruta de búsqueda de Milvus.

Requisitos previos

  • Milvus 3.0.0 o posterior
  • PyMilvus 3.0.0 o posterior
  • Conocimiento de la sintaxis de las fábricas de índices de Faiss y de los requisitos de entrenamiento de la fábrica seleccionada

Para obtener instrucciones de instalación, consulta «Instalar PyMilvus».

Elige una cadena de fábrica

Una cadena de fábrica describe un índice Faiss como una secuencia de componentes. Los siguientes ejemplos cuentan con cobertura de pruebas de la versión Milvus 3.0.0. Esta lista no es exhaustiva.

Cadena de fábricaTipo de campoMétricas evaluadas en las pruebas de la versiónParámetros de búsquedaNotas
FlatFLOAT_VECTORL2, IP, COSINENingunaBúsqueda exacta.
IVF64,FlatFLOAT_VECTORL2, IP, COSINEnprobeIVF con 64 listas invertidas y vectores sin comprimir.
HNSW16,FlatFLOAT_VECTORL2, IP, COSINEefSearchGrafo HNSW con almacenamiento de vectores planos.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2Específico para cada fábricaCombina OPQ, IVF y PQ. Valida el tamaño del entrenamiento y la recuperación con tus datos.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe, k_factorUtiliza un refinador plano tras la recuperación de candidatos de PQ.
PQ8x4FLOAT_VECTORL2NingunoIncorpora pruebas de lanzamiento. La búsqueda con filtro escalar falla porque el índice rechaza el selector; comprueba por separado el uso sin filtrar.
BFlatBINARY_VECTORHAMMINGNingunaBúsqueda exacta de vectores binarios.

Las entradas « COSINE » indican la cobertura de las pruebas de compilación y búsqueda. En Milvus 3.0.0, no garantizan la corrección de la puntuación ni de la búsqueda por rango tras una recarga del índice. Véase «Límites».

Compilar y buscar en un índice de tipo flotante

El siguiente ejemplo crea 3.000 vectores de 128 dimensiones. Esto proporciona datos de entrenamiento suficientes para la receta « IVF64,Flat » utilizada en el ejemplo. Expande el bloque de configuración y ejecútalo antes de compilar y realizar búsquedas en el índice.

Preparar la colección de vectores de tipo float

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)

Crear el índice

Configure « index_type » en « FAISS » y utilice « faiss_index_name » para seleccionar la receta de fábrica nativa de 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)

La cadena de fábrica IVF64,Flat crea un índice IVF con 64 listas invertidas y almacena vectores sin comprimir en cada lista.

Buscar en el índice

Configure los parámetros de búsqueda específicos de la fábrica dentro de search_params.params. Para una fábrica IVF, nprobe controla el número de listas invertidas que busca 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)

La consulta utiliza ` nprobe=8`, por lo que Faiss busca en 8 de las 64 listas invertidas. El filtro restringe los resultados a las entidades cuyo valor de ` category ` sea ` reference`.

Crear y buscar en un índice binario

Para los campos « BINARY_VECTOR », utiliza una cadena de fábrica binaria como « BFlat » y una métrica binaria compatible. Expande el bloque de configuración y ejecútalo antes de crear y buscar en el índice.

Preparar la colección de vectores binarios

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)

Crear el índice

Utiliza BFlat como cadena de fábrica y HAMMING como métrica para este ejemplo de vector binario.

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)

Realiza una búsqueda en el índice

BFlat no tiene ningún parámetro de búsqueda específico de la familia. Pase una asignación vacía de « params » al construir la solicitud de búsqueda.

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)

Cada vector binario de 128 dimensiones se representa mediante 16 bytes. Para obtener más información, consulta «Vector binario».

Configurar los parámetros de compilación y búsqueda

El tipo de índice « FAISS » tiene un parámetro de compilación de paso obligatorio.

ParámetroUbicaciónDescripción
faiss_index_nameparams in add_index()La cadena de la fábrica de índices Faiss. Por ejemplo, IVF64,Flat.

Configure los parámetros de búsqueda específicos de la fábrica dentro de search_params.params. La siguiente tabla enumera ejemplos comunes y no es exhaustiva.

ParámetroEjemplo de fábricaDescripción
nprobeIVF64,FlatNúmero de listas invertidas que se van a buscar.
efSearchHNSW16,FlatTamaño de la lista de candidatos de búsqueda HNSW.
k_factorIVF64,PQ8x4,RFlatNúmero de candidatos proporcionados al refinador en relación con el top-K solicitado.

Milvus solo reenvía los parámetros adicionales reconocidos por el adaptador. Se rechazan las claves de compilación y de búsqueda desconocidas que la familia de fábricas concreta no admita. Milvus no mantiene un esquema de parámetros universal para todas las fábricas posibles. Consulta la documentación de Faiss correspondiente a la fábrica seleccionada y, a continuación, valida el flujo completo de compilación y búsqueda con la versión y la imagen exactas de Milvus que tengas previsto implementar.

Gestión de errores y operaciones no compatibles

  • Si la cadena de la fábrica no es válida o no está disponible en la compilación de Milvus, la creación del índice fallará. Comprueba el estado del índice y el motivo del fallo antes de cargar la colección.

  • Si un parámetro tiene un tipo incorrecto, la búsqueda falla. Por ejemplo, « nprobe="invalid" » se rechaza porque « nprobe » debe ser numérico.

  • Si un parámetro no es aplicable a la fábrica creada, el adaptador lo rechaza por no ser compatible.

  • Si una fábrica no es compatible con el selector de Milvus, la búsqueda filtrada puede fallar incluso cuando esa misma fábrica pueda realizar búsquedas en Faiss de forma independiente.

  • No utilices search_iterator() con un índice FAISS.

Próximos pasos