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_VECTORcom uma dimensão que satisfaçadim % 32 == 0, porque cada assinatura MinHash é um valor de hash de 32 bits.O
dimdo campo do vetor binário tem de ser igual a32 * num_hashes. Uma incompatibilidade provoca um erro.Ao usar o índice
MINHASH_LSHcom a saída da função MinHash,mh_element_bit_widthdeve ser definido como32.
Como funciona o MinHash
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
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:
Análise de texto: O texto é processado por um analisador (quando
token_levelé"word") ou utilizado diretamente (quandotoken_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"].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"].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.Codificação de vetor binário: Cada valor de assinatura é um hash de 32 bits, e a assinatura completa é compactada num
BINARY_VECTORde dimensão32 * 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
VARCHARpara 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_levelestiver 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 analisadorstandard. 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_VECTORpara armazenar os vetores binários gerados pela função MinHash. A dimensão deve ser igual a32 * 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. Definaenable_analyzer=Truepara que o Milvus possa processar o texto para a geração de assinaturas MinHash. Por defeito, o Milvus utiliza o analisadorstandardpara 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 a32 * 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 |
|---|---|---|---|
|
int |
Derivado de |
Número de funções hash para a geração de assinaturas. A dimensão do vetor binário de saída é igual a |
|
int |
|
Tamanho do N-grama para o shingling. Nível de palavra: 1-3 é típico. Ao nível dos caracteres: 2-6 é típico. |
|
str |
|
Função de hash a ser usada. Opções:
|
|
str |
|
Nível de tokenização. Opções:
|
|
int |
|
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
Pesquisa de texto completo: Utilizar o BM25 para classificação de relevância lexical em vez de deteção de quase-duplicados.
Visão geral do analisador: Configurar analisadores personalizados para tokenização de texto.
Índice MINHASH_LSH: Saiba mais sobre o ajuste dos parâmetros LSH para recuperação e desempenho.