• Informazioni su Milvus
  • Inizia
  • Concetti
  • Guida per l'utente
    • Collezioni
    • Schema e campi dati
    • Inserisci e Elimina
    • Indici
    • Cerca
    • Inferenza di funzioni e modelli
    • Ottimizzazione dello spazio di archiviazione
    • Istantanee
  • Importazione dei dati
  • Strumenti di intelligenza artificiale
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

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

  • FAISS supporta i campi FLOAT_VECTOR e BINARY_VECTOR. Non supporta i campi FLOAT16_VECTOR, BFLOAT16_VECTOR, INT8_VECTOR o SPARSE_FLOAT_VECTOR.

  • L'adattatore generico FAISS viene 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,Flat e HNSW16,Flat. Non dare per scontato che ogni factory supporti i filtri o che gli indici binari FAISS supportino 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 binari FAISS.

  • Una factory può essere compilata con successo ma può comunque rifiutare alcune operazioni di ricerca di Milvus. Ad esempio, l'PQ8x4 autonomo rifiuta il selettore utilizzato dalla ricerca con filtro scalare. Verificare separatamente l'utilizzo senza filtro.

  • In Milvus 3.0.0, verificare i punteggi di COSINE e le soglie di ricerca per intervallo dopo il ricaricamento di un indice. Knowhere v3.0.6 non ripristina lo stato di normalizzazione coseno dell’adattatore FAISS durante la deserializzazione.

Come funziona

FAISS index passthrough workflow 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 factoryTipo di campoMetriche verificate nei test di rilascioParametri di ricercaNote
FlatFLOAT_VECTORL2, IP, COSINENessunoRicerca esatta.
IVF64,FlatFLOAT_VECTORL2, IP, COSINEnprobeIVF con 64 liste invertite e vettori non compressi.
HNSW16,FlatFLOAT_VECTORL2, IP, COSINEefSearchGrafo HNSW con memorizzazione vettoriale piatta.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2Specifico per FactoryCombina OPQ, IVF e PQ. Verifica le dimensioni dell’addestramento e il recall con i tuoi dati.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe, k_factorUtilizza un raffinatore piatto dopo il recupero dei candidati PQ.
PQ8x4FLOAT_VECTORL2NessunoIntegra i test di rilascio. La ricerca con filtro scalare fallisce perché l’indice rifiuta il selettore; verificare separatamente l’utilizzo senza filtro.
BFlatBINARY_VECTORHAMMINGNessunoRicerca 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.

Preparare la raccolta di vettori in virgola mobile

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.

Preparare la collezione di vettori binari

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.

ParametroPosizioneDescrizione
faiss_index_nameparams 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.

ParametroEsempio di fabbricaDescrizione
nprobeIVF64,FlatNumero di elenchi invertiti da cercare.
efSearchHNSW16,FlatDimensione dell'elenco dei candidati alla ricerca HNSW.
k_factorIVF64,PQ8x4,RFlatNumero 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é nprobe deve 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 indice FAISS.

Prossimi passi