Funzione MinHashCompatible with Milvus 3.0.x
La funzione MinHash converte il testo grezzo in vettori binari che approssimano la somiglianza di Jaccard tra i documenti. Applica lo shingling del testo e funzioni hash multiple per produrre vettori di firme a lunghezza fissa, consentendo un rapido rilevamento di quasi-duplicazioni e la deduplicazione dei documenti su scala.
Essendo una funzione integrata, MinHash viene eseguito all'interno di Milvus e non richiede l'inferenza di modelli esterni o la preelaborazione. Si inserisce il testo grezzo e Milvus genera automaticamente i vettori di firma MinHash.
Limiti
Il campo di output deve essere un
BINARY_VECTORcon una dimensione che soddisfadim % 32 == 0, perché ogni firma MinHash è un valore hash a 32 bit.Il campo
dimdel vettore binario deve essere uguale a32 * num_hashes. Una mancata corrispondenza causa un errore.Quando si utilizza l'indice
MINHASH_LSHcon l'output della funzione MinHash,mh_element_bit_widthdeve essere impostato su32.
Come funziona MinHash
MinHash è una tecnica di hashing sensibile alla località che stima la somiglianza di Jaccard tra gli insiemi. In Milvus, la funzione MinHash segue questa pipeline: si fornisce un testo grezzo come input e Milvus produce un vettore binario come output, gestendo internamente tutti i passaggi intermedi.
Il flusso di lavoro complessivo consiste in una pipeline condivisa di elaborazione del testo utilizzata sia per l'ingestione dei documenti che per l'elaborazione delle query, seguita da operazioni specifiche per l'archiviazione e il recupero.
Iaqkbfeh8oqggsx6nsocfosondo
Pipeline di elaborazione del testo condivisa
Sia l'ingestione dei documenti che l'elaborazione delle query passano il testo grezzo attraverso la stessa trasformazione in quattro fasi:
Analisi del testo: Il testo viene elaborato da un analizzatore (quando
token_levelè"word") o utilizzato direttamente (quandotoken_levelè"char"). La tokenizzazione a livello di parola applica l'analizzatore configurato sul campo di input per segmentare il testo in termini - ad esempio,"milvus is vector db"diventa["milvus", "is", "vector", "db"].Shingling: I token vengono suddivisi in n-grammi sovrapposti (shingle) di dimensione
shingle_size. Ad esempio, con 3 grammi a livello di parola, i token["information", "retrieval", "is", "a", "field"]diventano shingle come["information retrieval is", "retrieval is a", "is a field"].Generazione della firma MinHash: All'insieme di shingle vengono applicate più funzioni di hash (H1, H2, ..., Hn, dove n =
num_hashes). Per ogni funzione di hash, viene selezionato il valore minimo di hash tra tutti i frammenti. L'insieme di questi valori minimi forma la firma MinHash, una rappresentazione a lunghezza fissa che approssima la somiglianza di Jaccard del documento originale.Codifica vettoriale binaria: Ogni valore della firma è un hash a 32 bit e l'intera firma è racchiusa in un
BINARY_VECTORdi dimensione32 * num_hashes.
Ingestione del documento
Durante l'inserimento, il vettore binario prodotto dalla pipeline condivisa viene memorizzato nell'indice MINHASH_LSH. L'indice mantiene una tabella LSH (Locality-Sensitive Hashing) che raggruppa le firme simili negli stessi bucket, consentendo un rapido recupero dei candidati al momento dell'interrogazione.
Elaborazione della query
Durante la ricerca, il testo della query passa attraverso la stessa pipeline condivisa per produrre un vettore binario. Questo vettore viene utilizzato per eseguire una ricerca LSH nell'indice MINHASH_LSH, che identifica rapidamente le coppie di candidati probabilmente simili. I candidati vengono quindi classificati in base alla somiglianza di Jaccard stimata e vengono restituiti i primi K risultati.
Poiché entrambi i percorsi condividono la stessa logica di trasformazione, due documenti con contenuti altamente sovrapposti producono firme MinHash simili. Questo rende la funzione efficace per trovare quasi duplicati anche quando i documenti differiscono nell'ordine delle parole, nella formattazione o nella formulazione minore.
Prima di iniziare
Prima di utilizzare la funzione MinHash, pianificare lo schema della raccolta in modo che includa quanto segue:
Un campo di testo per il contenuto grezzo
La raccolta deve includere un campo
VARCHARper memorizzare il testo grezzo. Questo campo serve come input alla funzione MinHash.Un analizzatore per il campo di testo (quando si usa la tokenizzazione a livello di parola)
Se
token_levelè impostato su"word"(valore predefinito), il campo di testo deve avere un analizzatore abilitato. L'analizzatore definisce il modo in cui il testo viene tokenizzato prima dello shingling. Per impostazione predefinita, Milvus usa l'analizzatorestandard. Per configurare un analizzatore diverso, consultare la sezione Scegliere l'analizzatore giusto per il caso d'uso.Un campo vettore binario per l'output MinHash
La collezione deve includere un campo
BINARY_VECTORper memorizzare i vettori binari generati dalla funzione MinHash. La dimensione deve essere uguale a32 * num_hashes.
Passo 1: creare una collezione con una funzione MinHash
Per utilizzare la funzione MinHash, definirla durante la creazione della collezione. La funzione diventa parte dello schema della collezione e viene applicata automaticamente durante l'inserimento e la ricerca dei dati.
Definire i campi dello schema
Lo schema della raccolta deve includere almeno tre campi:
Campo primario: Identifica in modo univoco ogni entità della raccolta.
Campo di testo (
VARCHAR): Memorizza i documenti di testo grezzo. Impostareenable_analyzer=Truein modo che Milvus possa elaborare il testo per la generazione della firma MinHash. Per impostazione predefinita, Milvus utilizza l'analizzatorestandardper l'analisi del testo. Per configurare un analizzatore diverso, consultare la sezione Scegliere l'analizzatore giusto per il caso d'uso.Campo vettoriale binario (
BINARY_VECTOR): Memorizza vettori binari generati automaticamente dalla funzione MinHash. La dimensione deve essere uguale 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
Definire la funzione MinHash
La funzione MinHash converte il testo analizzato in vettori binari che approssimano la somiglianza di Jaccard tra i documenti.
Definire la funzione e aggiungerla allo schema:
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
Opzioni di configurazione
Il dizionario params della funzione MinHash accetta i seguenti parametri. Tutti i nomi dei parametri non fanno distinzione tra maiuscole e minuscole.
Parametro |
Tipo |
Predefinito |
Descrizione |
|---|---|---|---|
|
int |
Derivato da |
Numero di funzioni hash per la generazione della firma. La dimensione del vettore binario di uscita è uguale a |
|
int |
|
Dimensione dell'N-gramma per lo shingling. Livello di parola: 1-3 è tipico. Livello di carattere: 2-6 è tipico. |
|
str |
|
Funzione hash da utilizzare. Opzioni:
|
|
str |
|
Livello di tokenizzazione. Opzioni:
|
|
int |
|
Seme casuale per l'inizializzazione della funzione MinHash. |
Configurare l'indice
Il tipo di indice consigliato per i vettori binari MinHash è MINHASH_LSH, con metrica 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
Creare l'insieme
Creare l'insieme utilizzando i parametri dello schema e dell'indice definiti in precedenza:
client.create_collection(
collection_name="dedup_collection",
schema=schema,
index_params=index_params,
)
// java
// nodejs
// go
# restful
Passo 2: Inserire i documenti
Dopo aver impostato la raccolta, inserire i dati di testo. È sufficiente fornire il testo grezzo: la funzione MinHash genera automaticamente il vettore binario per ogni 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: Ricerca con MinHash
Una volta inseriti i dati, è possibile cercare i documenti quasi duplicati fornendo query di testo grezzo. Milvus converte automaticamente il testo della query in un vettore binario MinHash e recupera i documenti più simili utilizzando la somiglianza Jaccard stimata.
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
Cosa c'è dopo
Ricerca full text: Usare BM25 per la classificazione della rilevanza lessicale invece del rilevamento delle quasi-duplicazioni.
Panoramica degli analizzatori: Configurazione di analizzatori personalizzati per la tokenizzazione del testo.
Indice MINHASH_LSH: Informazioni sulla regolazione dei parametri LSH per il richiamo e le prestazioni.