Función MinHashCompatible with Milvus 3.0.x
La función MinHash convierte texto sin procesar en vectores binarios que aproximan la similitud de Jaccard entre documentos. Aplica el fraccionamiento de texto y múltiples funciones hash para generar vectores de firma de longitud fija, lo que permite una detección rápida de casi duplicados y la deduplicación de documentos a gran escala.
Al tratarse de una función integrada, MinHash se ejecuta dentro de Milvus y no requiere inferencia de modelos externos ni preprocesamiento. Basta con introducir el texto sin procesar y Milvus genera automáticamente los vectores de firma MinHash.
Límites
El campo de salida debe ser un campo de vectores binarios (
BINARY_VECTOR) con una dimensión que cumpla con la relacióndim % 32 == 0, ya que cada firma MinHash es un valor hash de 32 bits.El «
dim» del campo de vectores binarios debe ser igual a32 * num_hashes. Si no coinciden, se produce un error.Al utilizar el índice «
MINHASH_LSH» con la salida de la función MinHash, «mh_element_bit_width» debe establecerse en «32».
Cómo funciona MinHash
MinHash es una técnica de hash sensible a la localidad que estima la similitud de Jaccard entre conjuntos. En Milvus, la función MinHash sigue este proceso: se proporciona texto sin procesar como entrada y Milvus genera un vector binario como salida, gestionando internamente todos los pasos intermedios.
El flujo de trabajo general consiste en un proceso compartido de procesamiento de texto utilizado tanto para la ingesta de documentos como para el procesamiento de consultas, seguido de operaciones específicas de cada fase para el almacenamiento y la recuperación.
Iaqkbfeh8oqggsx6nsocfosondo
Proceso compartido de procesamiento de texto
Tanto la ingesta de documentos como el procesamiento de consultas someten el texto sin procesar a la misma transformación en cuatro etapas:
Análisis de texto: el texto se procesa mediante un analizador (cuando
token_leveles"word") o se utiliza directamente (cuandotoken_leveles"char"). La tokenización a nivel de palabra aplica el analizador configurado en el campo de entrada para segmentar el texto en términos; por ejemplo,"milvus is vector db"se convierte en["milvus", "is", "vector", "db"].División en «shingles»: Los tokens se dividen en n-gramas superpuestos (shingles) de tamaño
shingle_size. Por ejemplo, con 3-gramas a nivel de palabra, los tokens["information", "retrieval", "is", "a", "field"]se convierten en «shingles» como["information retrieval is", "retrieval is a", "is a field"].Generación de la firma MinHash: Se aplican múltiples funciones hash (H1, H2, …, Hn, donde n =
num_hashes) al conjunto de shingles. Para cada función hash, se selecciona el valor hash mínimo de entre todos los «shingles». El conjunto de estos valores mínimos forma la firma MinHash: una representación de longitud fija que se aproxima a la similitud de Jaccard del documento original.Codificación de vectores binarios: cada valor de firma es un hash de 32 bits, y la firma completa se empaqueta en un
BINARY_VECTORde dimensión32 * num_hashes.
Ingesta de documentos
Durante la inserción, el vector binario generado por el proceso compartido se almacena en el índice « MINHASH_LSH ». El índice mantiene una tabla LSH (Locality-Sensitive Hashing) que agrupa firmas similares en los mismos compartimentos, lo que permite una rápida recuperación de candidatos en el momento de la consulta.
Procesamiento de consultas
Durante la búsqueda, el texto de la consulta pasa por el mismo proceso compartido para generar un vector binario. Este vector se utiliza para realizar una búsqueda LSH en el índice MINHASH_LSH, lo que identifica rápidamente pares de candidatos que probablemente sean similares. Sin el refinamiento de Jaccard, Milvus devuelve candidatos LSH que no están ordenados según la similitud estimada de Jaccard. Cuando se habilita el refinamiento de Jaccard, Milvus utiliza las firmas MinHash sin procesar almacenadas para clasificar los candidatos según la similitud de Jaccard estimada y devolver los K mejores resultados.
Dado que ambas vías comparten la misma lógica de transformación, dos documentos con contenido muy solapado producen firmas MinHash similares. Esto hace que la función sea eficaz para encontrar casi-duplicados, incluso cuando los documentos difieren en el orden de las palabras, el formato o pequeñas variaciones en la redacción.
Antes de empezar
Antes de utilizar la función MinHash, planifica el esquema de tu colección para que incluya lo siguiente:
Un campo de texto para el contenido sin procesar
Tu colección debe incluir un campo «
VARCHAR» para almacenar texto sin procesar. Este campo sirve como entrada para la función MinHash.Un analizador para el campo de texto (cuando se utilice la tokenización a nivel de palabra)
Si «
token_level» está configurado en «"word"» (valor predeterminado), el campo de texto debe tener un analizador habilitado. El analizador define cómo se tokeniza el texto antes del shingling. De forma predeterminada, Milvus utiliza el analizador «standard». Para configurar un analizador diferente, consulta «Elegir el analizador adecuado para tu caso de uso».Un campo de vector binario para la salida de MinHash
Su colección debe incluir un campo «
BINARY_VECTOR» para almacenar los vectores binarios generados por la función MinHash. La dimensión debe ser igual a «32 * num_hashes».
Paso 1: Crear una colección con la función MinHash
Para utilizar la función MinHash, defínela al crear la colección. La función pasa a formar parte del esquema de la colección y se aplica automáticamente durante la inserción y la búsqueda de datos.
Definir los campos del esquema
El esquema de la colección debe incluir al menos tres campos:
Campo primario: identifica de forma única cada entidad de la colección.
Campo de texto (
VARCHAR): almacena documentos de texto sin procesar. Establece «enable_analyzer=True» para que Milvus pueda procesar el texto y generar la firma MinHash. De forma predeterminada, Milvus utiliza el analizador «standard» para el análisis de texto. Para configurar un analizador diferente, consulta «Elegir el analizador adecuado para tu caso de uso».Campo de vectores binarios (
BINARY_VECTOR): Almacena vectores binarios generados automáticamente por la función MinHash. La dimensión debe 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 la función MinHash
La función MinHash convierte el texto analizado en vectores binarios que aproximan la similitud de Jaccard entre documentos.
Define la función y añádela a tu 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
Opciones de configuración
El diccionario ` params ` de la función `MinHash` acepta los siguientes parámetros. Los nombres de los parámetros no distinguen entre mayúsculas y minúsculas.
Parámetro |
Tipo |
Valor por defecto |
Descripción |
|---|---|---|---|
|
int |
Derivado de |
Número de funciones hash para la generación de firmas. La dimensión del vector binario de salida es igual a |
|
int |
|
Tamaño del N-gram para el shingling. A nivel de palabra: lo habitual es 1-3. A nivel de carácter: lo habitual es 2-6. |
|
str |
|
Función hash a utilizar. Opciones:
|
|
str |
|
Nivel de tokenización. Opciones:
|
|
int |
|
Semilla aleatoria para la inicialización de la función MinHash. |
Configurar el índice
El tipo de índice recomendado para los vectores binarios de MinHash es « MINHASH_LSH », con el 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
Establece with_raw_data en True si las búsquedas van a utilizar el refinamiento de Jaccard. Las firmas MinHash sin procesar son necesarias para calcular la similitud de Jaccard estimada para los candidatos devueltos por la consulta LSH.
Crear la colección
Crea la colección utilizando los parámetros de esquema e índice definidos anteriormente:
client.create_collection(
collection_name="dedup_collection",
schema=schema,
index_params=index_params,
)
// java
// nodejs
// go
# restful
Paso 2: Insertar documentos
Una vez configurada la colección, inserta los datos de texto. Solo tienes que proporcionar el texto sin procesar; la función MinHash genera automáticamente el vector binario 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
Paso 3: Realizar búsquedas con MinHash
Una vez introducidos los datos, busca documentos casi duplicados realizando consultas con texto sin procesar. Milvus convierte automáticamente cada consulta en un vector binario MinHash. Activa el refinamiento de Jaccard para clasificar los candidatos LSH según la similitud de Jaccard estimada.
search_params = {
"metric_type": "MHJACCARD",
"params": {
"mh_search_with_jaccard": True,
"refine_k": 3,
},
}
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
Establece ` mh_search_with_jaccard ` en ` True ` para habilitar el refinamiento de Jaccard. ` refine_k ` controla la capacidad del conjunto de candidatos utilizada para el refinamiento. Milvus utiliza ` max(refine_k, limit) ` como capacidad, pero puede refinar menos candidatos si la búsqueda LSH devuelve menos coincidencias. Aumentar ` refine_k ` puede mejorar la calidad de los resultados a costa de un mayor esfuerzo computacional.
Próximos pasos
Búsqueda de texto completo: utiliza BM25 para la clasificación por relevancia léxica en lugar de la detección de casi duplicados.
Descripción general del analizador: configura analizadores personalizados para la tokenización de texto.
Índice MINHASH_LSH: Infórmate sobre cómo ajustar los parámetros LSH para mejorar la recuperación y el rendimiento.