• À propos de Milvus
  • Commencer
  • Concepts
  • Guide de l'utilisateur
    • Collections
    • Schéma et champs de données
    • Insérer et supprimer
    • Index
      • Indices vectoriels flottants
      • Index vectoriels binaires
      • Index de vecteurs clairsemés
      • Index scalaires
      • Index optimisés pour le GPU
    • Rechercher
    • Inférence de fonctions et de modèles
    • Optimisation du stockage
    • Instantanés
  • Importation de données
  • Outils d'IA
  • Guide d'administration
  • Outils
  • Intégrations
  • Tutoriels
  • Foire aux questions
  • API Reference

FAISSCompatible with Milvus 3.0.0+

Le type d’index « FAISS » est une fonctionnalité avancée disponible dans Milvus 3.0.0 et versions ultérieures. Elle vous permet de fournir une chaîne de caractères correspondant à une fabrique d’index Faiss au lieu de sélectionner un type d’index Milvus prédéfini.

Utilisez « FAISS » lorsque vous disposez déjà d’une recette Faiss testée et que vous avez besoin d’un contrôle direct sur sa composition. Pour les recettes courantes disposant d’un type d’index Milvus dédié, privilégiez ce type dédié, car il présente un contrat de paramètres stable et documenté.

Une chaîne de fabrication acceptée par Faiss en amont n’est pas automatiquement prise en charge par Milvus. La compatibilité dépend du type de champ vectoriel, de la métrique, de la dimension, des modules Faiss compilés dans l’image Milvus, ainsi que de la prise en charge par l’index résultant des opérations requises par Milvus.

Limites

  • FAISS prend en charge les champs FLOAT_VECTOR et BINARY_VECTOR. Il ne prend pas en charge les champs FLOAT16_VECTOR, BFLOAT16_VECTOR, INT8_VECTOR ou SPARSE_FLOAT_VECTOR.

  • L’adaptateur générique « FAISS » s’exécute sur le processeur (CPU). Il ne s’agit pas d’un type d’index Faiss pour GPU.

  • Le paramètre de compilation « faiss_index_name » est obligatoire. Milvus transmet sa valeur à Faiss sans convertir la recette en un type d’index Milvus dédié.

  • Les paramètres de construction et de recherche sont spécifiques à chaque fabrique. Un paramètre pris en charge par une fabrique peut être rejeté par une autre.

  • Le filtrage scalaire nécessite que l’index Faiss sous-jacent prenne en charge un sélecteur d’ID. Les tests de Milvus 3.0.0 couvrent la recherche filtrée avec les fabriques de type float suivantes : Flat, IVF64,Flat et HNSW16,Flat. Ne partez pas du principe que toutes les fabriques prennent en charge les filtres ou que les index binaires FAISS prennent en charge le filtrage scalaire.

  • Les itérateurs de recherche ne sont pas pris en charge.

  • L’adaptateur ne permet pas la récupération de vecteurs bruts.

  • La prise en charge de la recherche par plage dépend de la fabrique. L’ Flat e de type float bénéficie d’une couverture de version. N’utilisez pas la recherche par plage avec des index binaires FAISS.

  • Une fabrique peut se compiler correctement tout en rejetant certaines opérations de recherche Milvus. Par exemple, l’ PQ8x4 autonome rejette le sélecteur utilisé par la recherche avec filtrage scalaire. Vérifiez séparément l’utilisation sans filtrage.

  • Dans Milvus 3.0.0, validez les scores d’ COSINE et les seuils de recherche par plage après un rechargement d’index. Knowhere v3.0.6 ne restaure pas l’état de normalisation cosinus de l’adaptateur d’ FAISS lors de la désérialisation.

Fonctionnement

FAISS index passthrough workflow Flux de travail de transfert de l’index FAISS

Pour la construction d’index, Milvus transmet l’ faiss_index_name, le type de champ vectoriel, la métrique et d’autres paramètres de construction à l’adaptateur Knowhere FAISS. L’adaptateur appelle faiss::index_factory() pour les champs de type « FLOAT_VECTOR » ou faiss::index_binary_factory() pour les champs de type « BINARY_VECTOR ». L’objet résultant est un index Faiss natif géré selon le cycle de vie normal des index Milvus.

Pour la recherche, l’adaptateur convertit les paramètres spécifiques à la fabrique fournis en un objet Faiss correspondant de type « SearchParameters ». Pour les fabriques de type «float» prises en charge, il transmet également le jeu de bits de filtrage Milvus en tant que sélecteur Faiss. La prise en charge des sélecteurs dépend de chaque fabrique, et les tests publiés ne mettent pas en place de filtrage scalaire pour les index d’ FAISS s binaires. C’est pourquoi une recette peut être valide dans Faiss en mode autonome mais rejeter une opération requise par le chemin de recherche Milvus.

Prérequis

  • Milvus 3.0.0 ou version ultérieure
  • PyMilvus 3.0.0 ou version ultérieure
  • Connaissance de la syntaxe des fabriques d’index Faiss et des exigences de formation de la fabrique sélectionnée

Pour les instructions d'installation, consultez la section « Installer PyMilvus ».

Choisissez une chaîne de fabrique

Une chaîne de fabrication décrit un index Faiss sous la forme d’une séquence de composants. Les exemples suivants ont fait l’objet de tests de couverture dans la version Milvus 3.0.0. Cette liste n’est pas exhaustive.

Chaîne de fabricationType de champMétriques testées lors des tests de versionParamètres de rechercheRemarques
FlatFLOAT_VECTORL2, IP, COSINEAucunRecherche exacte.
IVF64,FlatFLOAT_VECTORL2, IP, COSINEnprobeIVF avec 64 listes inversées et des vecteurs non compressés.
HNSW16,FlatFLOAT_VECTORL2, IP, COSINEefSearchGraph HNSW avec stockage vectoriel plat.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2Spécifique à l'usineCombine OPQ, IVF et PQ. Vérifiez la taille de l'entraînement et le taux de rappel avec vos données.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe, k_factorUtilise un raffineur plat après la récupération des candidats PQ.
PQ8x4FLOAT_VECTORL2AucunIntègre des tests de validation. La recherche avec filtrage scalaire échoue car l’index rejette le sélecteur ; validez séparément l’utilisation sans filtrage.
BFlatBINARY_VECTORHAMMINGAucunRecherche exacte pour les vecteurs binaires.

Les entrées « COSINE » indiquent la couverture des tests de base et de recherche. Pour Milvus 3.0.0, elles ne garantissent pas l’exactitude des scores ni de la recherche par plage après un rechargement de l’index. Voir Limites.

Création et recherche dans un index à virgule flottante

L'exemple suivant crée 3 000 vecteurs à 128 dimensions. Cela fournit suffisamment de données d'entraînement pour la recette « IVF64,Flat » utilisée dans l'exemple. Développez le bloc de configuration et exécutez-le avant de créer et d'effectuer une recherche dans l'index.

Préparer la collection de vecteurs en virgule flottante

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)

Construire l’index

Définissez l’ index_type sur « FAISS » et utilisez « faiss_index_name » pour sélectionner la recette d’usine native 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 chaîne d'usine IVF64,Flat crée un index IVF comportant 64 listes inversées et stocke des vecteurs non compressés dans chaque liste.

Effectuer une recherche dans l’index

Définissez les paramètres de recherche spécifiques à la factory dans search_params.params. Pour une factory IVF, nprobe contrôle le nombre de listes inversées que Faiss explore.

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 requête utilise ` nprobe=8`, donc Faiss explore 8 des 64 listes inversées. Le filtre limite les résultats aux entités dont la valeur de ` category ` est ` reference`.

Créer et effectuer une recherche dans un index binaire

Pour les champs de type « BINARY_VECTOR », utilisez une chaîne de fabrication binaire telle que BFlat et une métrique binaire compatible. Développez le bloc de configuration et exécutez-le avant de créer et d’effectuer une recherche dans l’index.

Préparez la collection de vecteurs binaires

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)

Créer l’index

Utilisez BFlat comme chaîne de fabrication et HAMMING comme métrique pour cet exemple de vecteur binaire.

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)

Effectuez une recherche dans l’index

BFlat ne dispose d’aucun paramètre de recherche spécifique à la famille. Transmettez un mappage « params » vide lors de la construction de la requête de recherche.

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)

Chaque vecteur binaire à 128 dimensions est représenté par 16 octets. Pour plus d’informations, consultez la section Vecteur binaire.

Configurer les paramètres de construction et de recherche

Le type d’index « FAISS » comporte un paramètre de construction de type « passthrough » obligatoire.

ParamètreEmplacementDescription
faiss_index_nameparams in add_index()Chaîne de l'index-factory Faiss. Par exemple, IVF64,Flat.

Définissez les paramètres de recherche spécifiques à l'usine dans search_params.params. Le tableau suivant répertorie des exemples courants et n'est pas exhaustif.

ParamètreExemple d'usineDescription
nprobeIVF64,FlatNombre de listes inversées à parcourir.
efSearchHNSW16,FlatTaille de la liste des candidats à la recherche HNSW.
k_factorIVF64,PQ8x4,RFlatNombre de candidats fournis au raffineur par rapport au top-K demandé.

Milvus ne transmet que les paramètres supplémentaires reconnus par l’adaptateur. Les clés de compilation et de recherche inconnues que la famille de fabriques concrète ne prend pas en charge sont rejetées. Milvus ne gère pas de schéma de paramètres universel pour toutes les fabriques possibles. Consultez la documentation Faiss relative à la fabrique sélectionnée, puis validez l’ensemble du flux de construction et de recherche par rapport à la version et à l’image exactes de Milvus que vous prévoyez de déployer.

Gérer les erreurs et les opérations non prises en charge

  • Si la chaîne de la fabrique est invalide ou indisponible dans la version de Milvus, la création de l’index échoue. Vérifiez l’état de l’index et la raison de l’échec avant de charger la collection.

  • Si un paramètre est d’un type incorrect, la recherche échoue. Par exemple, « nprobe="invalid" » est rejeté car « nprobe » doit être une valeur numérique.

  • Si un paramètre ne s’applique pas à la factory construite, l’adaptateur le rejette car il n’est pas pris en charge.

  • Si une fabrique ne prend pas en charge le sélecteur Milvus, la recherche filtrée peut échouer même si cette même fabrique permet d’effectuer des recherches dans Faiss en mode autonome.

  • N’utilisez pas search_iterator() avec un index FAISS.

Et ensuite ?

  • Découvrez comment les index Milvus sont organisés dans la section « Index Explained ».
  • Comparez les types d’index dédiés IVF_FLAT et HNSW.
  • Consultez la section « Types de métriques » avant de choisir une métrique pour la factory.