• À propos de Milvus
  • Commencer
  • Concepts
  • Guide de l'utilisateur
    • Collections
    • Schéma et champs de données
    • Insérer et supprimer
    • Index
    • Recherche
    • Inférence des fonctions et des modèles
    • Optimisation du stockage
    • Instantanés
  • Importation de données
  • Outils d'IA
  • Guide d'administration
  • Outils
  • Intégrations
  • Tutoriels
  • FAQ
  • API Reference

Fonction MinHashCompatible with Milvus 3.0.x

La fonction MinHash convertit le texte brut en vecteurs binaires qui se rapprochent de la similarité de Jaccard entre les documents. Elle applique le shingling de texte et plusieurs fonctions de hachage pour produire des vecteurs de signature de longueur fixe, ce qui permet une détection rapide des quasi-doublons et une déduplication des documents à grande échelle.

En tant que fonction intégrée, MinHash s'exécute dans Milvus et ne nécessite pas d'inférence de modèle ou de prétraitement externe. Vous insérez du texte brut et Milvus génère automatiquement les vecteurs de signature MinHash.

Limites

  • Le champ de sortie doit être un BINARY_VECTOR dont la dimension satisfait à dim % 32 == 0, car chaque signature MinHash est une valeur de hachage de 32 bits.

  • Le champ dim du vecteur binaire doit être égal à 32 * num_hashes. Une non-concordance entraîne une erreur.

  • Lors de l'utilisation de l'index MINHASH_LSH avec la sortie de la fonction MinHash, mh_element_bit_width doit être défini sur 32.

Fonctionnement de MinHash

Développez pour voir comment cela fonctionne

MinHash est une technique de hachage sensible à la localité qui estime la similarité de Jaccard entre les ensembles. Dans Milvus, la fonction MinHash suit ce pipeline : vous fournissez du texte brut en entrée et Milvus produit un vecteur binaire en sortie - en gérant toutes les étapes intermédiaires en interne.

Le flux de travail global consiste en un pipeline de traitement de texte partagé utilisé à la fois pour l'ingestion des documents et le traitement des requêtes, suivi d'opérations spécifiques à chaque phase pour le stockage et l'extraction.

Iaqkbfeh8oqggsx6nsocfosondo Iaqkbfeh8oqggsx6nsocfosondo

Pipeline de traitement de texte partagé

L'ingestion de documents et le traitement des requêtes font passer le texte brut par la même transformation en quatre étapes :

  1. Analyse du texte: Le texte est traité par un analyseur (lorsque token_level est "word") ou utilisé directement (lorsque token_level est "char"). La tokenisation au niveau du mot applique l'analyseur configuré sur le champ d'entrée pour segmenter le texte en termes - par exemple, "milvus is vector db" devient ["milvus", "is", "vector", "db"].

  2. Découpage: Les tokens sont divisés en n-grammes qui se chevauchent (shingles) de taille shingle_size. Par exemple, avec 3 grammes au niveau du mot, les tokens ["information", "retrieval", "is", "a", "field"] deviennent des shingles comme ["information retrieval is", "retrieval is a", "is a field"].

  3. Génération de signatures MinHash: Plusieurs fonctions de hachage (H1, H2, ..., Hn, où n = num_hashes) sont appliquées à l'ensemble de shingles. Pour chaque fonction de hachage, la valeur de hachage minimale de tous les bardeaux est sélectionnée. La collection de ces valeurs minimales forme la signature MinHash - une représentation de longueur fixe qui se rapproche de la similarité de Jaccard du document original.

  4. Codage vectoriel binaire: Chaque valeur de signature est un hachage de 32 bits, et la signature complète est comprimée dans un BINARY_VECTOR de dimension 32 * num_hashes.

Ingestion de documents

Lors de l'insertion, le vecteur binaire produit par le pipeline partagé est stocké dans l'index MINHASH_LSH. L'index maintient une table LSH (Locality-Sensitive Hashing) qui regroupe les signatures similaires dans les mêmes godets, ce qui permet une récupération rapide des candidats au moment de la requête.

Traitement des requêtes

Pendant la recherche, le texte de la requête passe par le même pipeline partagé pour produire un vecteur binaire. Ce vecteur est utilisé pour effectuer une recherche LSH dans l'index MINHASH_LSH, qui identifie rapidement les paires de candidats susceptibles d'être similaires. Les candidats sont ensuite classés en fonction de la similarité de Jaccard estimée et les K premiers résultats sont renvoyés.

Comme les deux chemins partagent la même logique de transformation, deux documents dont le contenu se chevauche fortement produisent des signatures MinHash similaires. La fonction est donc efficace pour trouver des doublons, même lorsque les documents diffèrent par l'ordre des mots, le formatage ou des formulations mineures.

Avant de commencer

Avant d'utiliser la fonction MinHash, planifiez votre schéma de collecte de manière à inclure les éléments suivants :

  • Un champ texte pour le contenu brut

    Votre collection doit inclure un champ VARCHAR pour stocker le texte brut. Ce champ sert d'entrée à la fonction MinHash.

  • Un analyseur pour le champ de texte (lors de l'utilisation de l'encodage au niveau du mot)

    Si token_level est défini sur "word" (valeur par défaut), un analyseur doit être activé dans le champ de texte. L'analyseur définit le mode de symbolisation du texte avant la mise en forme. Par défaut, Milvus utilise l'analyseur standard. Pour configurer un autre analyseur, reportez-vous à la section Choisir le bon analyseur pour votre cas d'utilisation.

  • Un champ vectoriel binaire pour la sortie MinHash

    Votre collection doit inclure un champ BINARY_VECTOR pour stocker les vecteurs binaires générés par la fonction MinHash. La dimension doit être égale à 32 * num_hashes.

Étape 1 : Créer une collection avec une fonction MinHash

Pour utiliser la fonction MinHash, définissez-la lors de la création de la collection. La fonction fait partie du schéma de la collection et est appliquée automatiquement lors de l'insertion et de la recherche de données.

Définir les champs du schéma

Le schéma de votre collection doit comprendre au moins trois champs :

  • Champ primaire: Il identifie de manière unique chaque entité de la collection.

  • Champ texte (VARCHAR) : Stocke les documents textuels bruts. Définissez enable_analyzer=True afin que Milvus puisse traiter le texte pour la génération de signatures MinHash. Par défaut, Milvus utilise l'analyseur standard pour l'analyse de texte. Pour configurer un autre analyseur, reportez-vous à la section Choisir le bon analyseur pour votre cas d'utilisation.

  • Champ de vecteurs binaires (BINARY_VECTOR) : Stocke les vecteurs binaires générés automatiquement par la fonction MinHash. La dimension doit être égale à 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

Définition de la fonction MinHash

La fonction MinHash convertit le texte analysé en vecteurs binaires qui se rapprochent de la similarité de Jaccard entre les documents.

Définissez la fonction et ajoutez-la à votre schéma :

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

Options de configuration

Le dictionnaire params de la fonction MinHash accepte les paramètres suivants. Tous les noms de paramètres sont insensibles à la casse.

Paramètre

Type de paramètre

Défaut

Description

num_hashes

int

Dérivé de dim / 32

Nombre de fonctions de hachage pour la génération de signatures. La dimension du vecteur binaire de sortie est égale à 32 * num_hashes. Des valeurs plus élevées réduisent la variance dans l'estimation de la similarité mais augmentent les calculs. Recommandé : 256 (dim = 8192).

shingle_size

int

3

Taille du N-gramme pour le shingling. Au niveau du mot : 1-3 est typique. Au niveau des caractères : 2-6 est typique.

hash_function

str

"xxhash"

Fonction de hachage à utiliser. Options :

  • "xxhash" (rapide)

  • "sha1" (plus lent, plus grande résistance aux collisions).

token_level

str

"word"

Niveau de tokenisation. Options :

  • "word": utilise l'analyseur du champ pour la tokenisation, puis applique le shingling n-gram.

  • "char" / "character": applique le shingling n-gram directement sur les caractères bruts (pas d'analyseur).

    Le niveau mot offre une sémantique plus forte et une plus grande efficacité, mais dépend de la tokenisation spécifique à la langue. Le niveau caractère est indépendant de la langue mais produit des shingles de plus grande dimension avec une sémantique plus faible.

seed

int

1234

Graine aléatoire pour l'initialisation de la fonction MinHash.

Configuration de l'index

Le type d'index recommandé pour les vecteurs binaires MinHash est MINHASH_LSH, avec le type métrique 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

Créer la collection

Créez la collection en utilisant les paramètres de schéma et d'index définis ci-dessus :

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

Étape 2 : Insérer des documents

Après avoir configuré votre collection, insérez des données textuelles. Il vous suffit de fournir le texte brut - la fonction MinHash génère automatiquement le vecteur binaire pour chaque document.

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

Étape 3 : Recherche avec MinHash

Une fois les données insérées, recherchez les documents en quasi-double exemplaire en fournissant des requêtes de texte brut. Milvus convertit automatiquement votre texte d'interrogation en un vecteur binaire MinHash et récupère les documents les plus similaires à l'aide de la similarité Jaccard estimée.

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

Prochaines étapes