• Acerca de Milvus
  • Comenzar
  • Conceptos
  • Guía del usuario
    • Colecciones
    • Esquema y campos de datos
    • Insertar y eliminar
    • Índices
    • Buscar en
    • Función e inferencia de 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 en bruto en vectores binarios que se aproximan a la similitud de Jaccard entre documentos. Aplica el shingling de texto y múltiples funciones hash para producir vectores de firma de longitud fija, lo que permite una rápida detección de casi duplicados y deduplicación de documentos a escala.

Como función incorporada, MinHash se ejecuta dentro de Milvus y no requiere inferencia de modelo externo o preprocesamiento. Usted inserta texto sin procesar y Milvus genera automáticamente los vectores de firma MinHash.

Límites

  • El campo de salida debe ser un BINARY_VECTOR con una dimensión que satisfaga dim % 32 == 0, porque cada firma MinHash es un valor hash de 32 bits.

  • El dim del campo vectorial binario debe ser igual a 32 * num_hashes. Un desajuste provoca un error.

  • Cuando se utiliza el índice MINHASH_LSH con la salida de la función MinHash, mh_element_bit_width debe ser igual a 32.

Cómo funciona MinHash

Amplíe 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: usted proporciona texto sin procesar como entrada, y Milvus produce un vector binario como salida - manejando internamente todos los pasos intermedios.

El flujo de trabajo general consiste en un proceso de texto compartido utilizado tanto por la entrada de documentos como por el proceso de consulta, seguido de operaciones específicas de fase para el almacenamiento y la recuperación.

Iaqkbfeh8oqggsx6nsocfosondo Iaqkbfeh8oqggsx6nsocfosondo

Proceso de texto compartido

Tanto la ingesta de documentos como el procesamiento de consultas pasan el texto en bruto por la misma transformación de cuatro etapas:

  1. Análisis del texto: El texto es procesado por un analizador (cuando token_level es "word") o utilizado 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. Segmentación: 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 firmas MinHash: Se aplican múltiples funciones hash (H1, H2, ..., Hn, donde n = num_hashes) al conjunto de tejas. Para cada función hash, se selecciona el valor hash mínimo de todas las tejas. La colección 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 vectorial binaria: 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.

Introducción de documentos

Durante la inserción, el vector binario producido 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 cubos, 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 producir un vector binario. Este vector se utiliza para realizar una búsqueda LSH en el índice MINHASH_LSH, que identifica rápidamente los pares de candidatos que probablemente sean similares. A continuación, los candidatos se clasifican según la similitud de Jaccard estimada y se obtienen los K mejores resultados.

Dado que ambas rutas comparten la misma lógica de transformación, dos documentos cuyo contenido se solapa en gran medida 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 la redacción.

Antes de empezar

Antes de utilizar la función MinHash, planifique el esquema de su colección para que incluya lo siguiente:

  • Un campo de texto para el contenido en bruto

    Su colección debe incluir un campo VARCHAR para almacenar texto sin procesar. Este campo sirve de entrada a la función MinHash.

  • Un analizador para el campo de texto (cuando se utiliza la tokenización a nivel de palabra)

    Si token_level está configurado como "word" (por defecto), el campo de texto debe tener un analizador activado. El analizador define cómo se tokeniza el texto antes del shingling. Por defecto, Milvus utiliza el analizador standard. Para configurar un analizador diferente, consulte Elegir el analizador adecuado para su caso de uso.

  • Un campo vectorial binario para la salida 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 una función MinHash

Para utilizar la función MinHash, defínala 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 su 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. Establezca enable_analyzer=True para que Milvus pueda procesar el texto para la generación de firmas MinHash. Por defecto, Milvus utiliza el analizador standard para el análisis de texto. Para configurar un analizador diferente, consulte Elija el analizador adecuado para su caso de uso.

  • Campo vectorial binario (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.

Defina la función y añádala a su 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

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 la similitud pero aumentan el cálculo. Recomendado: 256 (dim = 8192).

shingle_size

int

3

Tamaño del N-grama para shingling. Nivel de palabra: 1-3 es típico. A nivel de carácter: 2-6 es típico.

hash_function

str

"xxhash"

Función hash a utilizar. Opciones:

  • "xxhash" (rápido)

  • "sha1" (más lento, mayor resistencia a 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 n-gram shingling.

  • "char" / "character": aplica n-gram shingling directamente sobre los caracteres brutos (sin analizador).

    El nivel de palabra proporciona una semántica más sólida y una mayor eficacia, pero depende de la tokenización específica del idioma. El nivel de caracteres es independiente del idioma pero produce shingles 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 vectores binarios MinHash es MINHASH_LSH, con tipo métrico 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

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, inserte los datos de texto. Sólo tiene que proporcionar el texto en bruto - 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: Buscar con MinHash

Una vez que haya insertado los datos, busque documentos casi duplicados proporcionando consultas de texto sin procesar. Milvus convierte automáticamente su texto de consulta en un vector binario MinHash y recupera los documentos más similares utilizando la similitud Jaccard estimada.

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

Próximos pasos