• Acerca de Milvus
  • Empezar
  • Conceptos
  • Guía del usuario
    • Colecciones
    • Esquema y campos de datos
    • Insertar y eliminar
    • Índices
    • Buscar
    • Inferencia de funciones y modelos
    • Optimización del almacenamiento
    • Instantáneas
  • Importación de datos
  • Herramientas de IA
  • Guía de administración
  • Herramientas
  • Integraciones
  • Tutoriales
  • Preguntas frecuentes
  • API Reference

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ón dim % 32 == 0, ya que cada firma MinHash es un valor hash de 32 bits.

  • El « dim » del campo de vectores binarios debe ser igual a 32 * 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

Expandir para ver cómo funciona

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

  1. Análisis de texto: el texto se procesa mediante un analizador (cuando token_level es "word") o se utiliza directamente (cuando token_level es "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"].

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

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

  4. Codificación de vectores binarios: cada valor de firma es un hash de 32 bits, y la firma completa se empaqueta en un BINARY_VECTOR de dimensión 32 * 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 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

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

num_hashes

int

Derivado de dim / 32

Número de funciones hash para la generación de firmas. La dimensión del vector binario de salida es igual a 32 * num_hashes. Los valores más altos reducen la varianza en la estimación de similitud, pero aumentan la carga computacional. Recomendado: 256 (dim = 8192).

shingle_size

int

3

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.

hash_function

str

"xxhash"

Función hash a utilizar. Opciones:

  • "xxhash" (rápida)

  • "sha1" (más lento, mayor resistencia a las colisiones).

token_level

str

"word"

Nivel de tokenización. Opciones:

  • "word": utiliza el analizador del campo para la tokenización y, a continuación, aplica el método de shingling de n-gramas.

  • "char" / "character": aplica el «shingling» de n-gramas directamente sobre los caracteres sin procesar (sin analizador).

    El nivel de palabra ofrece una semántica más sólida y una mayor eficiencia, pero depende de la tokenización específica del idioma. El nivel de carácter es independiente del idioma, pero produce fragmentos de mayor dimensión con una semántica más débil.

seed

int

1234

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