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_VECTORcon una dimensión que satisfagadim % 32 == 0, porque cada firma MinHash es un valor hash de 32 bits.El
dimdel campo vectorial binario debe ser igual a32 * num_hashes. Un desajuste provoca un error.Cuando se utiliza el índice
MINHASH_LSHcon la salida de la función MinHash,mh_element_bit_widthdebe ser igual a32.
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: 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
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:
Análisis del texto: El texto es procesado por un analizador (cuando
token_leveles"word") o utilizado 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"].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"].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.Codificación vectorial binaria: Cada valor de firma es un hash de 32 bits, y la firma completa se empaqueta en un
BINARY_VECTORde dimensión32 * 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
VARCHARpara 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_levelestá 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 analizadorstandard. 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_VECTORpara almacenar los vectores binarios generados por la función MinHash. La dimensión debe ser igual a32 * 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. Establezcaenable_analyzer=Truepara que Milvus pueda procesar el texto para la generación de firmas MinHash. Por defecto, Milvus utiliza el analizadorstandardpara 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 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.
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 |
|---|---|---|---|
|
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-grama para shingling. Nivel de palabra: 1-3 es típico. A nivel de carácter: 2-6 es típico. |
|
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 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
Búsqueda de texto completo: Utilización de BM25 para la clasificación por relevancia léxica en lugar de la detección de casi duplicados.
Visión general del analizador: Configuración de analizadores personalizados para la tokenización de texto.
Índice MINHASH_LSH: Aprenda a ajustar los parámetros de LSH para la recuperación y el rendimiento.