• Informazioni su Milvus
  • Iniziare
  • Concetti
  • Guida per l'utente
    • Collezioni
    • Schema e campi dati
    • Inserisci e cancella
    • Indici
    • Ricerca
    • Funzione e inferenza del modello
    • Ottimizzazione dello stoccaggio
    • Istantanee
  • Importazione dei dati
  • Strumenti AI
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

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_VECTOR con una dimensione che soddisfa dim % 32 == 0, perché ogni firma MinHash è un valore hash a 32 bit.

  • Il campo dim del vettore binario deve essere uguale a 32 * num_hashes. Una mancata corrispondenza causa un errore.

  • Quando si utilizza l'indice MINHASH_LSH con l'output della funzione MinHash, mh_element_bit_width deve essere impostato su 32.

Come funziona MinHash

Espandere per vedere come funziona

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 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:

  1. Analisi del testo: Il testo viene elaborato da un analizzatore (quando token_level è "word") o utilizzato direttamente (quando token_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"].

  2. 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"].

  3. 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.

  4. Codifica vettoriale binaria: Ogni valore della firma è un hash a 32 bit e l'intera firma è racchiusa in un BINARY_VECTOR di dimensione 32 * 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 VARCHAR per 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'analizzatore standard. 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_VECTOR per memorizzare i vettori binari generati dalla funzione MinHash. La dimensione deve essere uguale a 32 * 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. Impostare enable_analyzer=True in modo che Milvus possa elaborare il testo per la generazione della firma MinHash. Per impostazione predefinita, Milvus utilizza l'analizzatore standard per 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 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

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

num_hashes

int

Derivato da dim / 32

Numero di funzioni hash per la generazione della firma. La dimensione del vettore binario di uscita è uguale a 32 * num_hashes. Valori più alti riducono la varianza nella stima della somiglianza, ma aumentano il calcolo. Consigliato: 256 (dim = 8192).

shingle_size

int

3

Dimensione dell'N-gramma per lo shingling. Livello di parola: 1-3 è tipico. Livello di carattere: 2-6 è tipico.

hash_function

str

"xxhash"

Funzione hash da utilizzare. Opzioni:

  • "xxhash" (veloce)

  • "sha1" (più lento, maggiore resistenza alle collisioni).

token_level

str

"word"

Livello di tokenizzazione. Opzioni:

  • "word": utilizza l'analizzatore del campo per la tokenizzazione, quindi applica lo shingling n-gram.

  • "char" / "character": applica lo shingling n-gram direttamente sui caratteri grezzi (senza analizzatore).

    Il livello parola fornisce una semantica più forte e una maggiore efficienza, ma dipende dalla tokenizzazione specifica della lingua. Il livello di carattere è indipendente dalla lingua, ma produce shingle più dimensionali con una semantica più debole.

seed

int

1234

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.