🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI

HomeBlogsPresentamos Milvus 2.5: búsqueda de texto completo, filtrado de metadatos más potente y mejoras en la usabilidad.

Presentamos Milvus 2.5: búsqueda de texto completo, filtrado de metadatos más potente y mejoras en la usabilidad.

  • Engineering
December 17, 2024
Ken Zhang, Stefan Webb, Jiang Chen

Resumen

Estamos encantados de presentar la última versión de Milvus, 2.5, que introduce una nueva y potente capacidad: la búsqueda de texto completo, también conocida como búsqueda léxica o por palabras clave. Si no está familiarizado con la búsqueda, la búsqueda de texto completo le permite encontrar documentos buscando palabras o frases específicas dentro de ellos, de forma similar a como se busca en Google. Esto complementa nuestras capacidades de búsqueda semántica, que entienden el significado de la búsqueda en lugar de buscar sólo palabras exactas.

Utilizamos la métrica estándar BM25 para la similitud entre documentos, y nuestra implementación se basa en vectores dispersos, lo que permite un almacenamiento y una recuperación más eficientes. Para quienes no estén familiarizados con el término, los vectores dispersos son una forma de representar texto en la que la mayoría de los valores son cero, lo que los hace muy eficientes a la hora de almacenarlos y procesarlos: imagínese una enorme hoja de cálculo en la que sólo unas pocas celdas contienen números y el resto están vacías. Este enfoque encaja bien en la filosofía de producto de Milvus, en la que el vector es la entidad de búsqueda principal.

Un aspecto adicional digno de mención de nuestra implementación es la capacidad de insertar y consultar texto directamente en lugar de tener que convertir manualmente el texto en vectores dispersos. Milvus da así un paso más hacia el procesamiento completo de datos no estructurados.

Pero esto es sólo el principio. Con el lanzamiento de la versión 2.5, hemos actualizado la hoja de ruta del producto Milvus. En futuras iteraciones de Milvus, nos centraremos en desarrollar las capacidades de Milvus en cuatro direcciones clave:

  • Procesamiento racionalizado de datos no estructurados;
  • Mejor calidad y eficacia de la búsqueda;
  • Facilitar la gestión de datos;
  • Reducción de costes mediante avances algorítmicos y de diseño

Nuestro objetivo es construir una infraestructura de datos que pueda almacenar y recuperar información de forma eficiente en la era de la IA.

Búsqueda de texto completo mediante Sparse-BM25

Aunque la búsqueda semántica suele tener mejor conocimiento del contexto y comprensión de la intención, cuando un usuario necesita buscar nombres propios específicos, números de serie o una frase que coincida completamente, la recuperación de texto completo con concordancia de palabras clave suele producir resultados más precisos.

Para ilustrar esto con un ejemplo:

  • La búsqueda semántica es mejor cuando se pregunta: "Buscar documentos sobre soluciones de energías renovables".
  • La búsqueda de texto completo es mejor cuando necesitas: "Encontrar documentos que mencionen el Tesla Model 3 2024"

En nuestra versión anterior (Milvus 2.4), los usuarios tenían que preprocesar su texto utilizando una herramienta separada (el módulo BM25EmbeddingFunction de PyMilvus) en sus propias máquinas antes de poder buscarlo. Este enfoque tenía varias limitaciones: no podía manejar bien conjuntos de datos crecientes, requería pasos de configuración adicionales y hacía que todo el proceso fuera más complicado de lo necesario. Para los técnicos, las principales limitaciones eran que sólo podía funcionar en una única máquina; el vocabulario y otras estadísticas del corpus utilizadas para la puntuación BM25 no podían actualizarse a medida que cambiaba el corpus; y la conversión de texto a vectores en el lado del cliente es menos intuitiva si se trabaja directamente con texto.

Milvus 2.5 lo simplifica todo. Ahora puede trabajar con su texto directamente:

  • Almacenar sus documentos de texto originales tal cual
  • Realice búsquedas mediante consultas en lenguaje natural
  • Obtenga los resultados en formato legible

Entre bastidores, Milvus se encarga automáticamente de todas las conversiones vectoriales complejas, lo que facilita el trabajo con datos de texto. Esto es lo que llamamos nuestro enfoque "Doc in, Doc out": usted trabaja con texto legible y nosotros nos encargamos del resto.

Implementación técnica

Para aquellos interesados en los detalles técnicos, Milvus 2.5 añade la capacidad de búsqueda de texto completo a través de su implementación Sparse-BM25 incorporada, que incluye:

  • Un Tokenizer construido sobre tantivy: Milvus se integra ahora con el próspero ecosistema tantivy
  • Capacidad de ingesta y recuperación de documentos en bruto: Soporte para la ingesta directa y la consulta de datos de texto
  • Puntuación de relevancia BM25: Internalización de la puntuación BM25, basada en vectores dispersos.

Decidimos trabajar con el ecosistema tantivy bien desarrollado y construir el tokenizador de texto Milvus sobre tantivy. En el futuro, Milvus soportará más tokenizadores y expondrá el proceso de tokenización para ayudar a los usuarios a comprender mejor la calidad de la recuperación. También exploraremos tokenizadores basados en aprendizaje profundo y estrategias stemmer para optimizar aún más el rendimiento de la búsqueda de texto completo. A continuación se muestra un ejemplo de código para utilizar y configurar el tokenizador:

# Tokenizer configuration
schema.add_field(
    field_name='text',
    datatype=DataType.VARCHAR,
    max_length=65535,
    enable_analyzer=True, # Enable tokenizer on this column
    analyzer_params={"type": "english"},  # Configure tokenizer parameters, here we choose the english template, fine-grained configuration is also supported
    enable_match=True, # Build an inverted index for Text_Match
)

Tras configurar el tokenizador en el esquema de la colección, los usuarios pueden registrar el texto en la función bm25 mediante el método add_function. Esto se ejecutará internamente en el servidor Milvus. Todos los flujos de datos posteriores, como adiciones, eliminaciones, modificaciones y consultas, pueden completarse operando sobre la cadena de texto sin procesar, en contraposición a la representación vectorial. Véase a continuación un ejemplo de código sobre cómo ingerir texto y realizar búsquedas de texto completo con la nueva API:

# Define the mapping relationship between raw text data and vectors on the schema
bm25_function = Function(
    name="text_bm25_emb",
    input_field_names=["text"], # Input text field
    output_field_names=["sparse"], # Internal mapping sparse vector field
    function_type=FunctionType.BM25, # Model for processing mapping relationship
)

schema.add_function(bm25_function)
...
# Support for raw text in/out
MilvusClient.insert('demo', [
    {'text': 'Artificial intelligence was founded as an academic discipline in 1956.'},
    {'text': 'Alan Turing was the first person to conduct substantial research in AI.'},
    {'text': 'Born in Maida Vale, London, Turing was raised in southern England.'},
])

MilvusClient.search(
    collection_name='demo',
    data=['Who started AI research?'],
    anns_field='sparse',
    limit=3
)

Hemos adoptado una implementación de la puntuación de relevancia BM25 que representa las consultas y los documentos como vectores dispersos, denominada Sparse-BM25. Esto desbloquea muchas optimizaciones basadas en vectores dispersos, tales como:

Milvus consigue capacidades de búsqueda híbrida a través de su vanguardista implementación Sparse-BM25, que integra la búsqueda de texto completo en la arquitectura de la base de datos vectorial. Al representar las frecuencias de términos como vectores dispersos en lugar de índices invertidos tradicionales, Sparse-BM25 permite optimizaciones avanzadas, como la indexación de grafos, la cuantización de productos (PQ) y la cuantización escalar (SQ). Estas optimizaciones minimizan el uso de memoria y aceleran el rendimiento de la búsqueda. Al igual que el enfoque de índice invertido, Milvus admite la entrada de texto sin formato y la generación interna de vectores dispersos. Esto le permite trabajar con cualquier tokenizador y captar cualquier palabra que aparezca en el corpus que cambia dinámicamente.

Además, la poda heurística descarta los vectores dispersos de bajo valor, lo que mejora aún más la eficiencia sin comprometer la precisión. A diferencia de los enfoques anteriores que utilizan vectores dispersos, éste puede adaptarse a un corpus en crecimiento, y no a la precisión de la puntuación BM25.

  1. Creación de índices de grafos en el vector disperso, que funciona mejor que el índice invertido en consultas con texto largo, ya que el índice invertido necesita más pasos para terminar de emparejar los tokens de la consulta;
  2. Aprovechamiento de técnicas de aproximación para acelerar la búsqueda con un impacto mínimo en la calidad de la recuperación, como la cuantificación vectorial y la poda heurística;
  3. Unificar la interfaz y el modelo de datos para realizar búsquedas semánticas y de texto completo, mejorando así la experiencia del usuario.
# Creating an index on the sparse column
index_params.add_index(
    field_name="sparse",
    index_type="AUTOINDEX",  # Default WAND index
    metric_type="BM25" # Configure relevance scoring through metric_type
)

# Configurable parameters at search time to speed up search
search_params = {
    'params': {'drop_ratio_search': 0.6}, # WAND search parameter configuration can speed up search
}

En resumen, Milvus 2.5 ha ampliado su capacidad de búsqueda más allá de la búsqueda semántica introduciendo la recuperación de texto completo, lo que facilita a los usuarios la creación de aplicaciones de IA de alta calidad. Éstos son sólo los pasos iniciales en el espacio de la búsqueda Sparse-BM25 y prevemos que habrá más medidas de optimización que probar en el futuro.

Filtros de búsqueda de coincidencias de texto

Una segunda función de búsqueda de texto lanzada con Milvus 2.5 es Text Match, que permite al usuario filtrar la búsqueda a entradas que contengan una cadena de texto específica. Esta función también se basa en la tokenización y se activa con enable_match=True.

Cabe señalar que con Text Match, el tratamiento del texto de la consulta se basa en la lógica de OR tras la tokenización. Por ejemplo, en el ejemplo siguiente, el resultado devolverá todos los documentos (utilizando el campo "texto") que contengan "vector" o "base de datos".

filter = "TEXT_MATCH(text, 'vector database')"

Si su escenario requiere que coincidan tanto 'vector' como 'base de datos', entonces necesitará escribir dos Coincidencias de Texto separadas y superponerlas con AND para lograr su objetivo.

filter = "TEXT_MATCH(text, 'vector') and TEXT_MATCH(text, 'database')"

Mejora significativa del rendimiento del filtrado escalar

Nuestro énfasis en el rendimiento del filtrado escalar tiene su origen en nuestro descubrimiento de que la combinación de la recuperación vectorial y el filtrado de metadatos puede mejorar enormemente el rendimiento y la precisión de las consultas en diversos escenarios. Estos escenarios van desde aplicaciones de búsqueda de imágenes, como la identificación de esquinas en la conducción autónoma, hasta escenarios RAG complejos en bases de conocimiento empresariales. Por lo tanto, es muy adecuado para que los usuarios empresariales lo implementen en escenarios de aplicación de datos a gran escala.

En la práctica, muchos factores, como la cantidad de datos que se están filtrando, la organización de los datos y el modo de búsqueda, pueden afectar al rendimiento. Para solucionar esto, Milvus 2.5 introduce tres nuevos tipos de índices: Índice BitMap, Índice invertido de matriz e Índice invertido después de tokenizar el campo de texto Varchar. Estos nuevos índices pueden mejorar significativamente el rendimiento en casos de uso del mundo real.

En concreto:

  1. BitMap Index se puede utilizar para acelerar el filtrado de etiquetas (operadores comunes incluyen in, array_contains, etc.), y es adecuado para escenarios con menos datos de categoría de campo (cardinalidad de datos). El principio es determinar si una fila de datos tiene un determinado valor en una columna, con 1 para sí y 0 para no, y luego mantener una lista BitMap. El siguiente gráfico muestra la comparación de pruebas de rendimiento que realizamos basándonos en el escenario de negocio de un cliente. En este escenario, el volumen de datos es de 500 millones, la categoría de datos es 20, diferentes valores tienen diferentes proporciones de distribución (1%, 5%, 10%, 50%), y el rendimiento bajo diferentes cantidades de filtrado también varía. Con un filtrado del 50%, podemos conseguir una ganancia de rendimiento de 6,8 veces mediante BitMap Index. Cabe destacar que a medida que aumenta la cardinalidad, en comparación con el índice BitMap, el índice invertido mostrará un rendimiento más equilibrado.

  1. Text Match se basa en el índice invertido después de tokenizar el campo de texto. Su rendimiento supera con creces la función Wildcard Match (es decir, like + %) que proporcionamos en 2.4. De acuerdo con los resultados de nuestras pruebas internas, las ventajas de Text Match son muy claras, especialmente en escenarios de consultas concurrentes, en los que puede lograr un aumento de hasta 400 veces el QPS.

En cuanto al procesamiento de datos JSON, tenemos previsto introducir en versiones posteriores de 2.5.x la construcción de índices invertidos para claves especificadas por el usuario y el registro de información de ubicación por defecto para todas las claves con el fin de acelerar el análisis sintáctico. Esperamos que ambos aspectos mejoren significativamente el rendimiento de las consultas de JSON y Dynamic Field. Tenemos previsto mostrar más información en futuras notas de la versión y blogs técnicos, así que permanezca atento.

Nueva interfaz de gestión

Gestionar una base de datos no debería requerir una licenciatura en informática, pero sabemos que los administradores de bases de datos necesitan herramientas potentes. Por eso hemos introducido la WebUI de gestión de clústeres, una nueva interfaz basada en web accesible en la dirección de su clúster en el puerto 9091/webui. Esta herramienta de observabilidad proporciona:

  • Paneles de supervisión en tiempo real que muestran métricas de todo el clúster
  • Análisis detallados de memoria y rendimiento por nodo
  • Información de segmentos y seguimiento de consultas lentas
  • Indicadores de salud del sistema y estado de los nodos
  • Herramientas fáciles de usar para solucionar problemas complejos del sistema

Aunque esta interfaz aún está en fase beta, la estamos desarrollando activamente basándonos en los comentarios de los usuarios administradores de bases de datos. Las futuras actualizaciones incluirán diagnósticos asistidos por IA, funciones de gestión más interactivas y capacidades mejoradas de observación de clústeres.

Documentación y experiencia del desarrollador

Hemos renovado completamente nuestra documentación y experiencia SDK/API para hacer Milvus más accesible, manteniendo la profundidad para los usuarios experimentados. Las mejoras incluyen:

  • Un sistema de documentación reestructurado con una progresión más clara de los conceptos básicos a los avanzados.
  • Tutoriales interactivos y ejemplos reales que muestran implementaciones prácticas
  • Referencias completas de la API con ejemplos prácticos de código
  • Un diseño del SDK más fácil de usar que simplifica las operaciones comunes
  • Guías ilustradas que facilitan la comprensión de conceptos complejos.
  • Un asistente de documentación basado en inteligencia artificial (ASK AI) para obtener respuestas rápidas.

El SDK/API actualizado se centra en mejorar la experiencia de los desarrolladores a través de interfaces más intuitivas y una mejor integración con la documentación. Creemos que notará estas mejoras cuando trabaje con la serie 2.5.x.

Sin embargo, sabemos que el desarrollo de la documentación y el SDK es un proceso continuo. Seguiremos optimizando tanto la estructura del contenido como el diseño del SDK basándonos en los comentarios de la comunidad. Únete a nuestro canal de Discord para compartir tus sugerencias y ayudarnos a seguir mejorando.

Resumen

Milvus 2.5 contiene 13 nuevas características y varias optimizaciones a nivel de sistema, aportadas no sólo por Zilliz sino por la comunidad de código abierto. Sólo hemos tocado algunas de ellas en este post y le animamos a visitar nuestra nota de lanzamiento y los documentos oficiales para obtener más información.

Like the article? Spread the word

Sigue Leyendo