• Sobre a Milvus
  • Começar
  • Conceitos
  • Guia do Utilizador
    • Coleções
    • Esquema e campos de dados
    • Inserir e Eliminar
    • Índices
      • Índices vetoriais flutuantes
      • Índices de vetores binários
      • Índices de vetores esparsos
      • Índices escalares
      • Índices otimizados para GPU
    • Pesquisar
    • Inferência de funções e modelos
    • Otimização do armazenamento
    • Instantâneos
  • Importação de dados
  • Ferramentas de IA
  • Guia de Administração
  • Ferramentas
  • Integrações
  • Tutoriais
  • Perguntas frequentes
  • API Reference

FAISSCompatible with Milvus 3.0.0+

O tipo de índice « FAISS » é um passthrough de nível avançado disponível no Milvus 3.0.0 e versões posteriores. Permite-lhe fornecer uma cadeia de caracteres da fábrica de índices Faiss em vez de selecionar um tipo de índice Milvus fixo.

Utilize o FAISS quando já tiver uma receita Faiss testada e precisar de controlo direto sobre a sua composição. Para receitas comuns com um tipo de índice Milvus dedicado, opte pelo tipo dedicado, uma vez que este possui um contrato de parâmetros estável e documentado.

Uma string de fábrica aceite pelo Faiss upstream não é automaticamente suportada pelo Milvus. A compatibilidade depende do tipo de campo vetorial, da métrica, da dimensão, dos módulos Faiss compilados na imagem do Milvus e do facto de o índice resultante suportar as operações exigidas pelo Milvus.

Limites

  • FAISS suporta os campos « FLOAT_VECTOR » e « BINARY_VECTOR ». Não suporta os campos « FLOAT16_VECTOR », « BFLOAT16_VECTOR », « INT8_VECTOR » ou « SPARSE_FLOAT_VECTOR ».

  • O adaptador genérico « FAISS » é executado na CPU. Não se trata de um tipo de índice Faiss para GPU.

  • O parâmetro de compilação « faiss_index_name » é obrigatório. O Milvus transmite o seu valor ao Faiss sem converter a receita num tipo de índice dedicado do Milvus.

  • Os parâmetros de compilação e pesquisa são específicos de cada fábrica. Um parâmetro suportado por uma fábrica pode ser rejeitado por outra.

  • A filtragem escalar requer que o índice Faiss subjacente suporte um seletor de ID. Os testes do Milvus 3.0.0 abrangem a pesquisa filtrada com as fábricas de tipo float « Flat », « IVF64,Flat » e « HNSW16,Flat ». Não se deve presumir que todas as fábricas suportam filtros ou que os índices binários « FAISS » suportam filtragem escalar.

  • Os iteradores de pesquisa não são suportados.

  • O adaptador não fornece recuperação de vetores em bruto.

  • O suporte à pesquisa por intervalo depende da fábrica. O `float` Flat tem cobertura de versão. Não utilize a pesquisa por intervalo com índices binários FAISS.

  • Uma fábrica pode ser compilada com sucesso, mas ainda assim rejeitar algumas operações de pesquisa do Milvus. Por exemplo, o PQ8x4 autónomo rejeita o seletor utilizado pela pesquisa com filtragem escalar. Valide a utilização sem filtragem separadamente.

  • No Milvus 3.0.0, valide os resultados do COSINE e os limiares da pesquisa por intervalo após uma recarga do índice. O Knowhere v3.0.6 não restaura o estado de normalização cosseno do adaptador FAISS durante a desserialização.

Como funciona

FAISS index passthrough workflow Fluxo de trabalho de passagem do índice FAISS

Para a construção do índice, o Milvus encaminha o ` faiss_index_name`, o tipo de campo vetorial, a métrica e outros parâmetros de construção para o adaptador Knowhere FAISS. O adaptador chama ` faiss::index_factory() ` para campos ` FLOAT_VECTOR ` ou ` faiss::index_binary_factory() ` para campos ` BINARY_VECTOR `. O objeto resultante é um índice Faiss nativo gerido através do ciclo de vida normal do índice do Milvus.

Para a pesquisa, o adaptador converte os parâmetros específicos da fábrica fornecidos no objeto « SearchParameters » correspondente do Faiss. Para as fábricas de tipo «float» suportadas, também passa o conjunto de bits do filtro do Milvus como um seletor do Faiss. O suporte ao seletor é específico de cada fábrica, e os testes disponibilizados não estabelecem filtragem escalar para índices binários FAISS. É por isso que uma receita pode ser válida no Faiss autónomo, mas rejeitar uma operação exigida pelo caminho de pesquisa do Milvus.

Pré-requisitos

  • Milvus 3.0.0 ou posterior
  • PyMilvus 3.0.0 ou posterior
  • Familiaridade com a sintaxe da fábrica de índices do Faiss e com os requisitos de treino da fábrica selecionada

Para obter instruções de instalação, consulte Instalar o PyMilvus.

Escolha uma cadeia de caracteres de fábrica

Uma string de fábrica descreve um índice Faiss como uma sequência de componentes. Os exemplos seguintes têm cobertura de teste da versão Milvus 3.0.0. Esta lista não é exaustiva.

String de fábricaTipo de campoMétricas testadas nos testes de lançamentoParâmetros de pesquisaNotas
FlatFLOAT_VECTORL2, IP, COSINENenhumaPesquisa exata.
IVF64,FlatFLOAT_VECTORL2, IP, COSINEnprobeIVF com 64 listas invertidas e vetores não comprimidos.
HNSW16,FlatFLOAT_VECTORL2, IP, COSINEefSearchGrafo HNSW com armazenamento de vetores em formato plano.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2Específico da fábricaCombina OPQ, IVF e PQ. Valide a dimensão do treino e a taxa de recuperação com os seus dados.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe, k_factorUtiliza um refinador plano após a recuperação de candidatos do PQ.
PQ8x4FLOAT_VECTORL2NenhumInclui testes de lançamento. A pesquisa com filtragem escalar falha porque o índice rejeita o seletor; valide a utilização sem filtragem separadamente.
BFlatBINARY_VECTORHAMMINGNenhumPesquisa exata para vetores binários.

As entradas « COSINE » indicam a cobertura dos testes de compilação e de pesquisa. No Milvus 3.0.0, estas não garantem a correção da pontuação ou da pesquisa por intervalo após uma recarga do índice. Consulte «Limites».

Compilar e pesquisar um índice de tipo float

O exemplo seguinte cria 3 000 vetores de 128 dimensões. Isto fornece dados de treino suficientes para a receita « IVF64,Flat » utilizada no exemplo. Expanda o bloco de configuração e execute-o antes de compilar e pesquisar o índice.

Preparar a coleção de vetores 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)

Criar o índice

Defina « index_type » para « FAISS » e utilize « faiss_index_name » para selecionar a receita de fábrica nativa do 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)

A string de fábrica IVF64,Flat cria um índice IVF com 64 listas invertidas e armazena vetores não comprimidos em cada lista.

Pesquisar no índice

Defina os parâmetros de pesquisa específicos da fábrica dentro de search_params.params. Para uma fábrica IVF, nprobe controla quantas listas invertidas o Faiss pesquisa.

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)

A consulta utiliza nprobe=8, pelo que o Faiss pesquisa 8 das 64 listas invertidas. O filtro restringe os resultados às entidades cujo valor de category seja reference.

Criar e pesquisar um índice binário

Para campos do tipo « BINARY_VECTOR », utilize uma cadeia de fábrica binária, como « BFlat », e uma métrica binária compatível. Expanda o bloco de configuração e execute-o antes de criar e pesquisar o índice.

Preparar a coleção de vetores binários

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)

Crie o índice

Utilize BFlat como string de fábrica e HAMMING como métrica para este exemplo de vetor binário.

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)

Pesquise no índice

BFlat não possui nenhum parâmetro de pesquisa específico da família. Passe um mapeamento vazio de « params » ao construir o pedido de pesquisa.

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 vetor binário de 128 dimensões é representado por 16 bytes. Para mais informações, consulte Vetor binário.

Configurar parâmetros de compilação e pesquisa

O tipo de índice « FAISS » tem um parâmetro de compilação de passagem obrigatório.

ParâmetroLocalizaçãoDescrição
faiss_index_nameparams em add_index()A cadeia de caracteres da fábrica de índices Faiss. Por exemplo, IVF64,Flat.

Defina os parâmetros de pesquisa específicos da fábrica dentro de search_params.params. A tabela seguinte apresenta exemplos comuns e não é exaustiva.

ParâmetroExemplo de fábricaDescrição
nprobeIVF64,FlatNúmero de listas invertidas a pesquisar.
efSearchHNSW16,FlatTamanho da lista de candidatos à pesquisa HNSW.
k_factorIVF64,PQ8x4,RFlatNúmero de candidatos fornecidos ao refinador em relação ao top-K solicitado.

O Milvus encaminha apenas os parâmetros adicionais reconhecidos pelo adaptador. Chaves de compilação e chaves de pesquisa desconhecidas, que a família de fábricas específica não suporta, são rejeitadas. O Milvus não mantém um esquema de parâmetros universal para todas as fábricas possíveis. Consulte a documentação do Faiss relativa à fábrica selecionada e, em seguida, valide todo o fluxo de compilação e pesquisa em relação à versão e imagem exatas do Milvus que pretende implementar.

Lidar com erros e operações não suportadas

  • Se a cadeia de caracteres da fábrica for inválida ou não estiver disponível na compilação do Milvus, a criação do índice falha. Verifique o estado do índice e o motivo da falha antes de carregar a coleção.

  • Se um parâmetro tiver o tipo errado, a pesquisa falha. Por exemplo, « nprobe="invalid" » é rejeitado porque « nprobe » deve ser numérico.

  • Se um parâmetro não se aplicar à fábrica criada, o adaptador rejeita-o por não ser suportado.

  • Se uma fábrica não suportar o seletor do Milvus, a pesquisa filtrada pode falhar, mesmo que a mesma fábrica consiga efetuar pesquisas no Faiss autónomo.

  • Não utilize search_iterator() com um índice FAISS.

Próximos passos