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
FAISSsuporta 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`
Flattem cobertura de versão. Não utilize a pesquisa por intervalo com índices bináriosFAISS.Uma fábrica pode ser compilada com sucesso, mas ainda assim rejeitar algumas operações de pesquisa do Milvus. Por exemplo, o
PQ8x4autó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
COSINEe 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 adaptadorFAISSdurante a desserialização.
Como funciona
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ábrica | Tipo de campo | Métricas testadas nos testes de lançamento | Parâmetros de pesquisa | Notas |
|---|---|---|---|---|
Flat | FLOAT_VECTOR | L2, IP, COSINE | Nenhuma | Pesquisa exata. |
IVF64,Flat | FLOAT_VECTOR | L2, IP, COSINE | nprobe | IVF com 64 listas invertidas e vetores não comprimidos. |
HNSW16,Flat | FLOAT_VECTOR | L2, IP, COSINE | efSearch | Grafo HNSW com armazenamento de vetores em formato plano. |
OPQ16,IVF64,PQ16x4 | FLOAT_VECTOR | L2 | Específico da fábrica | Combina OPQ, IVF e PQ. Valide a dimensão do treino e a taxa de recuperação com os seus dados. |
IVF64,PQ8x4,RFlat | FLOAT_VECTOR | L2 | nprobe, k_factor | Utiliza um refinador plano após a recuperação de candidatos do PQ. |
PQ8x4 | FLOAT_VECTOR | L2 | Nenhum | Inclui testes de lançamento. A pesquisa com filtragem escalar falha porque o índice rejeita o seletor; valide a utilização sem filtragem separadamente. |
BFlat | BINARY_VECTOR | HAMMING | Nenhum | Pesquisa 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.
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.
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âmetro | Localização | Descrição |
|---|---|---|
faiss_index_name | params 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âmetro | Exemplo de fábrica | Descrição |
|---|---|---|
nprobe | IVF64,Flat | Número de listas invertidas a pesquisar. |
efSearch | HNSW16,Flat | Tamanho da lista de candidatos à pesquisa HNSW. |
k_factor | IVF64,PQ8x4,RFlat | Nú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 índiceFAISS.
Próximos passos
- Saiba como os índices do Milvus estão organizados em «Explicação do Índice».
- Compare os tipos de índice dedicados IVF_FLAT e HNSW.
- Consulte «Tipos de métricas » antes de escolher uma métrica para a fábrica.