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_VECTORdont la dimension satisfait àdim % 32 == 0, car chaque signature MinHash est une valeur de hachage de 32 bits.Le champ
dimdu vecteur binaire doit être égal à32 * num_hashes. Une non-concordance entraîne une erreur.Lors de l'utilisation de l'index
MINHASH_LSHavec la sortie de la fonction MinHash,mh_element_bit_widthdoit être défini sur32.
Fonctionnement de MinHash
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
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 :
Analyse du texte: Le texte est traité par un analyseur (lorsque
token_levelest"word") ou utilisé directement (lorsquetoken_levelest"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"].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"].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.Codage vectoriel binaire: Chaque valeur de signature est un hachage de 32 bits, et la signature complète est comprimée dans un
BINARY_VECTORde dimension32 * 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
VARCHARpour 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_levelest 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'analyseurstandard. 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_VECTORpour 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éfinissezenable_analyzer=Trueafin que Milvus puisse traiter le texte pour la génération de signatures MinHash. Par défaut, Milvus utilise l'analyseurstandardpour 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 |
|---|---|---|---|
|
int |
Dérivé de |
Nombre de fonctions de hachage pour la génération de signatures. La dimension du vecteur binaire de sortie est égale à |
|
int |
|
Taille du N-gramme pour le shingling. Au niveau du mot : 1-3 est typique. Au niveau des caractères : 2-6 est typique. |
|
str |
|
Fonction de hachage à utiliser. Options :
|
|
str |
|
Niveau de tokenisation. Options :
|
|
int |
|
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
Recherche en texte intégral: Utiliser BM25 pour le classement de la pertinence lexicale au lieu de la détection des quasi-doublons.
Aperçu de l'analyseur: Configurer des analyseurs personnalisés pour la tokenisation du texte.
Index MINHASH_LSH: Apprenez à régler les paramètres LSH pour le rappel et la performance.