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
FAISSprend en charge les champsFLOAT_VECTORetBINARY_VECTOR. Il ne prend pas en charge les champsFLOAT16_VECTOR,BFLOAT16_VECTOR,INT8_VECTORouSPARSE_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,FlatetHNSW16,Flat. Ne partez pas du principe que toutes les fabriques prennent en charge les filtres ou que les index binairesFAISSprennent 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’
Flate de type float bénéficie d’une couverture de version. N’utilisez pas la recherche par plage avec des index binairesFAISS.Une fabrique peut se compiler correctement tout en rejetant certaines opérations de recherche Milvus. Par exemple, l’
PQ8x4autonome 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’
COSINEet 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’FAISSlors de la désérialisation.
Fonctionnement
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 fabrication | Type de champ | Métriques testées lors des tests de version | Paramètres de recherche | Remarques |
|---|---|---|---|---|
Flat | FLOAT_VECTOR | L2, IP, COSINE | Aucun | Recherche exacte. |
IVF64,Flat | FLOAT_VECTOR | L2, IP, COSINE | nprobe | IVF avec 64 listes inversées et des vecteurs non compressés. |
HNSW16,Flat | FLOAT_VECTOR | L2, IP, COSINE | efSearch | Graph HNSW avec stockage vectoriel plat. |
OPQ16,IVF64,PQ16x4 | FLOAT_VECTOR | L2 | Spécifique à l'usine | Combine OPQ, IVF et PQ. Vérifiez la taille de l'entraînement et le taux de rappel avec vos données. |
IVF64,PQ8x4,RFlat | FLOAT_VECTOR | L2 | nprobe, k_factor | Utilise un raffineur plat après la récupération des candidats PQ. |
PQ8x4 | FLOAT_VECTOR | L2 | Aucun | Intè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. |
BFlat | BINARY_VECTOR | HAMMING | Aucun | Recherche 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.
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.
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ètre | Emplacement | Description |
|---|---|---|
faiss_index_name | params 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ètre | Exemple d'usine | Description |
|---|---|---|
nprobe | IVF64,Flat | Nombre de listes inversées à parcourir. |
efSearch | HNSW16,Flat | Taille de la liste des candidats à la recherche HNSW. |
k_factor | IVF64,PQ8x4,RFlat | Nombre 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 indexFAISS.
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.