FAISSCompatible with Milvus 3.0.0+
Il tipo di indice " FAISS " è un'opzione avanzata disponibile in Milvus 3.0.0 e versioni successive. Consente di specificare una stringa di creazione dell'indice Faiss invece di selezionare un tipo di indice Milvus predefinito.
Utilizzare FAISS quando si dispone già di una ricetta Faiss collaudata e si necessita di un controllo diretto sulla sua composizione. Per le ricette comuni con un tipo di indice Milvus dedicato, è preferibile utilizzare il tipo dedicato poiché presenta un contratto di parametri stabile e documentato.
Una stringa di factory accettata da Faiss a monte non è automaticamente supportata da Milvus. La compatibilità dipende dal tipo di campo vettoriale, dalla metrica, dalla dimensione, dai moduli Faiss compilati nell’immagine di Milvus e dal fatto che l’indice risultante supporti le operazioni richieste da Milvus.
Limiti
FAISSsupporta i campiFLOAT_VECTOReBINARY_VECTOR. Non supporta i campiFLOAT16_VECTOR,BFLOAT16_VECTOR,INT8_VECTORoSPARSE_FLOAT_VECTOR.L'adattatore generico
FAISSviene eseguito sulla CPU. Non si tratta di un tipo di indice Faiss per GPU.Il parametro di compilazione
faiss_index_nameè obbligatorio. Milvus ne trasmette il valore a Faiss senza convertire la ricetta in un tipo di indice dedicato a Milvus.I parametri di compilazione e di ricerca sono specifici per ogni factory. Un parametro supportato da una factory può essere rifiutato da un’altra.
Il filtraggio scalare richiede che l’indice Faiss sottostante supporti un selettore di ID. I test di Milvus 3.0.0 coprono la ricerca filtrata con le factory float
Flat,IVF64,FlateHNSW16,Flat. Non dare per scontato che ogni factory supporti i filtri o che gli indici binariFAISSsupportino il filtraggio scalare.Gli iteratori di ricerca non sono supportati.
L'adattatore non fornisce il recupero di vettori grezzi.
Il supporto della ricerca per intervallo dipende dalla factory. Float
Flatè supportato nella versione attuale. Non utilizzare la ricerca per intervallo con indici binariFAISS.Una factory può essere compilata con successo ma può comunque rifiutare alcune operazioni di ricerca di Milvus. Ad esempio, l'
PQ8x4autonomo rifiuta il selettore utilizzato dalla ricerca con filtro scalare. Verificare separatamente l'utilizzo senza filtro.In Milvus 3.0.0, verificare i punteggi di
COSINEe le soglie di ricerca per intervallo dopo il ricaricamento di un indice. Knowhere v3.0.6 non ripristina lo stato di normalizzazione coseno dell’adattatoreFAISSdurante la deserializzazione.
Come funziona
Flusso di lavoro di passthrough dell’indice FAISS
Per la creazione dell’indice, Milvus inoltra faiss_index_name, il tipo di campo vettoriale, la metrica e altri parametri di creazione all’adattatore Knowhere FAISS. L’adattatore chiama faiss::index_factory() per i campi FLOAT_VECTOR o faiss::index_binary_factory() per i campi BINARY_VECTOR. L’oggetto risultante è un indice Faiss nativo gestito attraverso il normale ciclo di vita dell’indice Milvus.
Per la ricerca, l’adattatore converte i parametri specifici della factory forniti nell’oggetto Faiss corrispondente SearchParameters. Per le factory float supportate, passa anche il bitset del filtro Milvus come selettore Faiss. Il supporto dei selettori è specifico per ogni factory e i test rilasciati non prevedono il filtraggio scalare per gli indici binari FAISS. Questo è il motivo per cui una ricetta può essere valida in Faiss standalone ma rifiutare un’operazione richiesta dal percorso di ricerca di Milvus.
Prerequisiti
- Milvus 3.0.0 o versioni successive
- PyMilvus 3.0.0 o versioni successive
- Conoscenza della sintassi delle factory di indici Faiss e dei requisiti di addestramento della factory selezionata
Per le istruzioni di installazione, consultare Installare PyMilvus.
Scegliere una stringa di factory
Una stringa di factory descrive un indice Faiss come una sequenza di componenti. Gli esempi seguenti sono stati testati con la versione Milvus 3.0.0. Questo elenco non è esaustivo.
| Stringa della factory | Tipo di campo | Metriche verificate nei test di rilascio | Parametri di ricerca | Note |
|---|---|---|---|---|
Flat | FLOAT_VECTOR | L2, IP, COSINE | Nessuno | Ricerca esatta. |
IVF64,Flat | FLOAT_VECTOR | L2, IP, COSINE | nprobe | IVF con 64 liste invertite e vettori non compressi. |
HNSW16,Flat | FLOAT_VECTOR | L2, IP, COSINE | efSearch | Grafo HNSW con memorizzazione vettoriale piatta. |
OPQ16,IVF64,PQ16x4 | FLOAT_VECTOR | L2 | Specifico per Factory | Combina OPQ, IVF e PQ. Verifica le dimensioni dell’addestramento e il recall con i tuoi dati. |
IVF64,PQ8x4,RFlat | FLOAT_VECTOR | L2 | nprobe, k_factor | Utilizza un raffinatore piatto dopo il recupero dei candidati PQ. |
PQ8x4 | FLOAT_VECTOR | L2 | Nessuno | Integra i test di rilascio. La ricerca con filtro scalare fallisce perché l’indice rifiuta il selettore; verificare separatamente l’utilizzo senza filtro. |
BFlat | BINARY_VECTOR | HAMMING | Nessuno | Ricerca esatta per vettori binari. |
Le voci " COSINE " indicano la copertura dei test di build e di ricerca. Per Milvus 3.0.0, non garantiscono la correttezza del punteggio o della ricerca per intervallo dopo il ricaricamento dell'indice. Vedi Limiti.
Compilazione e ricerca di un indice float
L'esempio seguente crea 3.000 vettori a 128 dimensioni. Ciò fornisce dati di addestramento sufficienti per la ricetta " IVF64,Flat " utilizzata nell'esempio. Espandere il blocco di configurazione ed eseguirlo prima di creare e cercare nell'indice.
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)
Creare l’indice
Impostare ` index_type ` su ` FAISS` e utilizzare ` faiss_index_name ` per selezionare la ricetta nativa `Faiss factory`.
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 stringa di fabbrica IVF64,Flat crea un indice IVF con 64 liste invertite e memorizza i vettori non compressi in ciascuna lista.
Eseguire la ricerca nell’indice
Impostare i parametri di ricerca specifici della factory all’interno di search_params.params. Per una factory IVF, nprobe controlla il numero di elenchi invertiti in cui Faiss effettua la ricerca.
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 query utilizza ` nprobe=8`, quindi Faiss esegue la ricerca in 8 delle 64 liste invertite. Il filtro limita i risultati alle entità il cui valore di ` category ` è ` reference`.
Creazione e ricerca in un indice binario
Per i campi BINARY_VECTOR, utilizzare una stringa di factory binaria come BFlat e una metrica binaria compatibile. Espandere il blocco di configurazione ed eseguirlo prima di creare e cercare nell’indice.
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)
Creare l’indice
Utilizza BFlat come stringa di factory e HAMMING come metrica per questo esempio di vettore 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)
Eseguire la ricerca nell’indice
BFlat non dispone di parametri di ricerca specifici per la famiglia. Passare una mappatura params vuota durante la creazione della richiesta di ricerca.
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)
Ogni vettore binario a 128 dimensioni è rappresentato da 16 byte. Per ulteriori informazioni, consultare Vettore binario.
Configurare i parametri di compilazione e ricerca
Il tipo di indice FAISS ha un parametro di creazione di tipo passthrough obbligatorio.
| Parametro | Posizione | Descrizione |
|---|---|---|
faiss_index_name | params in add_index() | La stringa della factory dell'indice Faiss. Ad esempio, IVF64,Flat. |
Impostare i parametri di ricerca specifici della factory all'interno di search_params.params. La tabella seguente elenca alcuni esempi comuni e non è esaustiva.
| Parametro | Esempio di fabbrica | Descrizione |
|---|---|---|
nprobe | IVF64,Flat | Numero di elenchi invertiti da cercare. |
efSearch | HNSW16,Flat | Dimensione dell'elenco dei candidati alla ricerca HNSW. |
k_factor | IVF64,PQ8x4,RFlat | Numero di candidati forniti al rifinitore in relazione al top-K richiesto. |
Milvus inoltra solo i parametri aggiuntivi riconosciuti dall'adattatore. Le chiavi di build e di ricerca sconosciute che la famiglia di factory specifica non supporta vengono rifiutate. Milvus non gestisce uno schema di parametri universale per ogni possibile factory. Consultare la documentazione di Faiss relativa alla factory selezionata, quindi verificare che l’intero flusso di compilazione e ricerca sia compatibile con l’esatta versione e immagine di Milvus che si intende distribuire.
Gestire gli errori e le operazioni non supportate
Se la stringa della factory non è valida o non è disponibile nella build di Milvus, la creazione dell’indice fallisce. Verificare lo stato dell’indice e il motivo dell’errore prima di caricare la collezione.
Se un parametro ha un tipo errato, la ricerca fallisce. Ad esempio,
nprobe="invalid"viene rifiutato perchénprobedeve essere numerico.Se un parametro non è applicabile alla factory creata, l’adattatore lo rifiuta in quanto non supportato.
Se una factory non supporta il selettore Milvus, la ricerca filtrata può fallire anche quando la stessa factory è in grado di effettuare ricerche in Faiss standalone.
Non utilizzare
search_iterator()con un indiceFAISS.
Prossimi passi
- Scopri come sono organizzati gli indici di Milvus nella sezione "Spiegazione degli indici".
- Confronta i tipi di indice dedicati IVF_FLAT e HNSW.
- Esamina i tipi di metrica prima di scegliere una metrica per la factory.