• Sobre Milvus
  • Começar a trabalhar
  • Conceitos
  • Guia do utilizador
    • Colecções
    • Esquema e campos de dados
    • Inserir e apagar
    • Índices
    • 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
  • FAQs
  • API Reference

Função MinHashCompatible with Milvus 3.0.x

A função MinHash converte texto em bruto em vectores binários que aproximam a similaridade Jaccard entre documentos. Aplica shingling de texto e múltiplas funções de hash para produzir vectores de assinatura de comprimento fixo, permitindo uma rápida deteção de quase-duplicados e desduplicação de documentos em escala.

Como uma função integrada, o MinHash é executado no Milvus e não requer inferência de modelo externo ou pré-processamento. Insere-se texto em bruto e o Milvus gera automaticamente os vectores de assinatura MinHash.

Limites

  • O campo de saída deve ser um BINARY_VECTOR com uma dimensão que satisfaça dim % 32 == 0, porque cada assinatura MinHash é um valor de hash de 32 bits.

  • O dim do campo do vetor binário tem de ser igual a 32 * num_hashes. Uma incompatibilidade provoca um erro.

  • Ao usar o índice MINHASH_LSH com a saída da função MinHash, mh_element_bit_width deve ser definido como 32.

Como funciona o MinHash

Expandir para ver como funciona

MinHash é uma técnica de hashing sensível à localidade que estima a similaridade Jaccard entre conjuntos. No Milvus, a função MinHash segue o seguinte fluxo de trabalho: o utilizador fornece texto em bruto como entrada e o Milvus produz um vetor binário como saída - tratando internamente de todos os passos intermédios.

O fluxo de trabalho global consiste num pipeline de processamento de texto partilhado, utilizado tanto para a ingestão de documentos como para o processamento de consultas, seguido de operações específicas de cada fase para armazenamento e recuperação.

Iaqkbfeh8oqggsx6nsocfosondo Iaqkbfeh8oqggsx6nsocfosondo

Pipeline de processamento de texto partilhado

Tanto a ingestão de documentos como o processamento de consultas passam o texto em bruto pela mesma transformação em quatro fases:

  1. Análise de texto: O texto é processado por um analisador (quando token_level é "word") ou utilizado diretamente (quando token_level é "char"). A tokenização ao nível da palavra aplica o analisador configurado no campo de entrada para segmentar o texto em termos - por exemplo, "milvus is vector db" torna-se ["milvus", "is", "vector", "db"].

  2. Shingling: Os tokens são divididos em n-gramas sobrepostos (shingles) de tamanho shingle_size. Por exemplo, com 3-gramas ao nível da palavra, os tokens ["information", "retrieval", "is", "a", "field"] tornam-se shingles como ["information retrieval is", "retrieval is a", "is a field"].

  3. Geração de assinaturas MinHash: Múltiplas funções de hash (H1, H2, ..., Hn, onde n = num_hashes) são aplicadas ao conjunto de shingles. Para cada função de hash, é selecionado o valor mínimo de hash em todos os shingles. A coleção destes valores mínimos forma a assinatura MinHash - uma representação de comprimento fixo que aproxima a semelhança Jaccard do documento original.

  4. Codificação de vetor binário: Cada valor de assinatura é um hash de 32 bits, e a assinatura completa é compactada num BINARY_VECTOR de dimensão 32 * num_hashes.

Ingestão de documentos

Durante a inserção, o vetor binário produzido pelo pipeline partilhado é armazenado no índice MINHASH_LSH. O índice mantém uma tabela LSH (Locality-Sensitive Hashing) que agrupa assinaturas semelhantes nos mesmos compartimentos, permitindo a recuperação rápida de candidatos no momento da consulta.

Processamento da consulta

Durante a pesquisa, o texto da consulta passa pelo mesmo pipeline partilhado para produzir um vetor binário. Este vetor é utilizado para efetuar uma pesquisa LSH no índice MINHASH_LSH, que identifica rapidamente os pares de candidatos que são provavelmente semelhantes. Os candidatos são então classificados por similaridade Jaccard estimada e os resultados top-K são retornados.

Como ambos os caminhos partilham a mesma lógica de transformação, dois documentos com conteúdo altamente sobreposto produzem assinaturas MinHash semelhantes. Isso torna a função eficaz para encontrar quase duplicatas, mesmo quando os documentos diferem em ordem de palavras, formatação ou frases menores.

Antes de começar

Antes de usar a função MinHash, planeje seu esquema de coleção para incluir o seguinte:

  • Um campo de texto para conteúdo bruto

    Sua coleção deve incluir um campo VARCHAR para armazenar texto bruto. Este campo serve como entrada para a função MinHash.

  • Um analisador para o campo de texto (ao usar a tokenização no nível da palavra)

    Se token_level estiver definido como "word" (predefinição), o campo de texto deve ter um analisador ativado. O analisador define como o texto é tokenizado antes do shingling. Por defeito, o Milvus utiliza o analisador standard. Para configurar um analisador diferente, consulte Escolha o analisador certo para o seu caso de uso.

  • Um campo de vetor binário para saída MinHash

    Sua coleção deve incluir um campo BINARY_VECTOR para armazenar os vetores binários gerados pela função MinHash. A dimensão deve ser igual a 32 * num_hashes.

Etapa 1: criar uma coleção com uma função MinHash

Para usar a função MinHash, defina-a ao criar a coleção. A função torna-se parte do esquema da coleção e é aplicada automaticamente durante a inserção e pesquisa de dados.

Definir campos de esquema

O esquema da coleção deve incluir pelo menos três campos:

  • Campo primário: Identifica de forma única cada entidade na coleção.

  • Campo de texto (VARCHAR): Armazena documentos de texto em bruto. Defina enable_analyzer=True para que o Milvus possa processar o texto para a geração de assinaturas MinHash. Por defeito, o Milvus utiliza o analisador standard para a análise de texto. Para configurar um analisador diferente, consulte Escolher o analisador correto para o seu caso de utilização.

  • Campo de vetor binário (BINARY_VECTOR): Armazena vectores binários gerados automaticamente pela função MinHash. A dimensão deve ser igual a 32 * num_hashes.

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

schema = client.create_schema()

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="document_content", datatype=DataType.VARCHAR, max_length=9000, enable_analyzer=True)
schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=8192)
// java
// nodejs
// go
# restful

Definir a função MinHash

A função MinHash converte o texto analisado em vetores binários que aproximam a similaridade Jaccard entre documentos.

Defina a função e adicione-a ao seu esquema:

minhash_function = Function(
    name="minhash_function",
    input_field_names=["document_content"], # Name of the VARCHAR field containing raw text
    output_field_names=["binary_vector"], # Name of the BINARY_VECTOR field for generated signatures
    function_type=FunctionType.MINHASH,
    params={
        "num_hashes": 256, # Number of hash functions; produces dim = 32 * 256 = 8192
        "shingle_size": 3, # N-gram size for shingling
    }
)

schema.add_function(minhash_function)
// java
// nodejs
// go
# restful

Opções de configuração

O dicionário params da função MinHash aceita os seguintes parâmetros. Todos os nomes de parâmetros não diferenciam maiúsculas de minúsculas.

Parâmetro

Tipo de parâmetro

Predefinição

Descrição

num_hashes

int

Derivado de dim / 32

Número de funções hash para a geração de assinaturas. A dimensão do vetor binário de saída é igual a 32 * num_hashes. Valores mais elevados reduzem a variância na estimativa da semelhança, mas aumentam a computação. Recomendado: 256 (dim = 8192).

shingle_size

int

3

Tamanho do N-grama para o shingling. Nível de palavra: 1-3 é típico. Ao nível dos caracteres: 2-6 é típico.

hash_function

str

"xxhash"

Função de hash a ser usada. Opções:

  • "xxhash" (rápido)

  • "sha1" (mais lento, maior resistência à colisão).

token_level

str

"word"

Nível de tokenização. Opções:

  • "word": usa o analisador do campo para tokenização, depois aplica n-gram shingling.

  • "char" / "character": aplica o n-gram shingling diretamente em caracteres brutos (sem analisador).

    O nível de palavra fornece uma semântica mais forte e maior eficiência, mas depende da tokenização específica do idioma. O nível de caracteres é independente da língua, mas produz shingles de maior dimensão com uma semântica mais fraca.

seed

int

1234

Semente aleatória para inicialização da função MinHash.

Configurar o índice

O tipo de índice recomendado para vetores binários do MinHash é MINHASH_LSH, com tipo de métrica MHJACCARD.

index_params = client.prepare_index_params()

index_params.add_index(
    field_name="binary_vector",
    index_type="MINHASH_LSH",
    metric_type="MHJACCARD",
    params={
        "mh_lsh_band": 128,
        "mh_element_bit_width": 32,
        "with_raw_data": True,
    },
)
// java
// nodejs
// go
# restful

Criar a coleção

Crie a coleção utilizando o esquema e os parâmetros de índice definidos acima:

client.create_collection(
    collection_name="dedup_collection",
    schema=schema,
    index_params=index_params,
)
// java
// nodejs
// go
# restful

Passo 2: Inserir documentos

Depois de configurar a coleção, insira dados de texto. Você só precisa fornecer o texto bruto - a função MinHash gera automaticamente o vetor binário para cada documento.

client.insert(
    "dedup_collection",
    [
        {"document_content": "information retrieval is a field of study that helps users find relevant information in large datasets"},
        {"document_content": "information retrieval is a research field focused on helping users find relevant data in large collections"},
        {"document_content": "information retrieval is a field of research helping users search for relevant information in large datasets"},
    ],
)
// java
// nodejs
// go
# restful

Passo 3: Pesquisar com MinHash

Depois de inserir os dados, procure documentos quase duplicados fornecendo consultas de texto em bruto. Milvus converte automaticamente o seu texto de consulta num vetor binário MinHash e recupera os documentos mais semelhantes usando a similaridade estimada de Jaccard.

search_params = {
    "metric_type": "MHJACCARD",
    "params": {},
}

results = client.search(
    collection_name="dedup_collection",
    data=["information retrieval is a research field focused on helping users find relevant data in large collections"],
    anns_field="binary_vector",
    limit=3,
    output_fields=["document_content"],
    search_params=search_params,
)

for hits in results:
    for hit in hits:
        print(f"ID: {hit['id']}, Distance: {hit['distance']}")
        print(f"Document: {hit['entity']['document_content']}")
// java
// nodejs
// go
# restful

O que vem a seguir