🚀 Essayez Zilliz Cloud, la version entièrement gérée de Milvus, gratuitement—découvrez des performances 10x plus rapides ! Essayez maintenant>>

milvus-logo
LFAI

HomeBlogsPrésentation de Milvus 2.5 : recherche plein texte, filtrage plus puissant des métadonnées et améliorations de la convivialité !

Présentation de Milvus 2.5 : recherche plein texte, filtrage plus puissant des métadonnées et améliorations de la convivialité !

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

Vue d'ensemble

Nous sommes ravis de vous présenter la dernière version de Milvus, la 2.5, qui introduit une nouvelle fonctionnalité puissante : la recherche en texte intégral, également connue sous le nom de recherche lexicale ou par mot-clé. Si vous êtes novice en matière de recherche, la recherche en texte intégral vous permet de trouver des documents en recherchant des mots ou des phrases spécifiques à l'intérieur de ceux-ci, de la même manière que vous effectuez une recherche dans Google. Elle complète nos capacités de recherche sémantique existantes, qui comprennent le sens de votre recherche au lieu de se contenter de trouver des mots exacts.

Nous utilisons la métrique standard BM25 pour la similarité des documents, et notre implémentation est basée sur des vecteurs épars, ce qui permet un stockage et une récupération plus efficaces. Pour ceux qui ne sont pas familiers avec ce terme, les vecteurs épars sont une manière de représenter le texte où la plupart des valeurs sont nulles, ce qui les rend très efficaces à stocker et à traiter - imaginez une énorme feuille de calcul où seules quelques cellules contiennent des nombres, le reste étant vide. Cette approche s'inscrit parfaitement dans la philosophie du produit Milvus, où le vecteur est l'entité de recherche principale.

Un autre aspect remarquable de notre mise en œuvre est la possibilité d'insérer et d'interroger du texte directement, plutôt que de demander aux utilisateurs de convertir manuellement le texte en vecteurs épars. Milvus fait ainsi un pas de plus vers le traitement intégral des données non structurées.

Mais ce n'est que le début. Avec la sortie de la version 2.5, nous avons mis à jour la feuille de route des produits Milvus. Dans les prochaines itérations de Milvus, nous nous concentrerons sur l'évolution des capacités de Milvus dans quatre directions clés :

  • Traitement rationalisé des données non structurées ;
  • Amélioration de la qualité et de l'efficacité des recherches ;
  • Gestion plus facile des données ;
  • Réduction des coûts grâce à des avancées en matière d'algorithmes et de conception

Notre objectif est de construire une infrastructure de données capable de stocker et de récupérer efficacement les informations à l'ère de l'IA.

Recherche en texte intégral via Sparse-BM25

Bien que la recherche sémantique ait généralement une meilleure connaissance du contexte et une meilleure compréhension de l'intention, lorsqu'un utilisateur doit rechercher des noms propres spécifiques, des numéros de série ou une phrase qui correspond parfaitement, la recherche en texte intégral avec correspondance des mots clés produit souvent des résultats plus précis.

Illustrons cela par un exemple :

  • La recherche sémantique excelle lorsque vous demandez : "Trouver des documents sur les solutions en matière d'énergie renouvelable"
  • La recherche en texte intégral est meilleure lorsque vous avez besoin de : "Trouver des documents mentionnant la Tesla Model 3 2024"

Dans notre version précédente (Milvus 2.4), les utilisateurs devaient prétraiter leur texte à l'aide d'un outil distinct (le module BM25EmbeddingFunction de PyMilvus) sur leurs propres machines avant de pouvoir effectuer une recherche. Cette approche présentait plusieurs limites : elle ne permettait pas de gérer correctement les ensembles de données croissants, nécessitait des étapes de configuration supplémentaires et rendait l'ensemble du processus plus compliqué que nécessaire. Pour les techniciens, les principales limitations étaient les suivantes : elle ne pouvait fonctionner que sur une seule machine ; le vocabulaire et les autres statistiques du corpus utilisés pour la notation BM25 ne pouvaient pas être mis à jour à mesure que le corpus changeait ; et la conversion du texte en vecteurs du côté client est moins intuitive que si l'on travaillait directement avec le texte.

Milvus 2.5 simplifie tout. Vous pouvez désormais travailler directement avec votre texte :

  • stocker vos documents textuels originaux tels quels
  • Effectuer des recherches à l'aide de requêtes en langage naturel
  • Obtenir les résultats sous une forme lisible

En coulisses, Milvus gère automatiquement toutes les conversions vectorielles complexes, ce qui facilite le travail avec les données textuelles. C'est ce que nous appelons notre approche "Doc in, Doc out" : vous travaillez avec du texte lisible et nous nous occupons du reste.

Mise en œuvre technique

Pour ceux qui s'intéressent aux détails techniques, Milvus 2.5 ajoute la capacité de recherche plein texte grâce à sa mise en œuvre Sparse-BM25 intégrée, y compris :

  • Un tokenizer construit sur tantivy: Milvus s'intègre désormais à l'écosystème florissant de tantivy.
  • La capacité d'ingérer et de récupérer des documents bruts: Prise en charge de l'ingestion et de l'interrogation directes de données textuelles
  • Notation de la pertinence BM25: Internalisation de la notation BM25, implémentée sur la base de vecteurs épars

Nous avons choisi de travailler avec l'écosystème bien développé de tantivy et de construire le tokenizer de texte Milvus sur tantivy. À l'avenir, Milvus prendra en charge davantage de tokenizers et exposera le processus de tokenisation afin d'aider les utilisateurs à mieux comprendre la qualité de l'extraction. Nous explorerons également des tokenizers basés sur l'apprentissage profond et des stratégies de stemmer afin d'optimiser les performances de la recherche en texte intégral. Vous trouverez ci-dessous un exemple de code pour l'utilisation et la configuration du tokenizer :

# 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
)

Après avoir configuré le tokenizer dans le schéma de la collection, les utilisateurs peuvent enregistrer le texte dans la fonction bm25 via la méthode add_function. Cette méthode sera exécutée en interne dans le serveur Milvus. Tous les flux de données ultérieurs, tels que les ajouts, les suppressions, les modifications et les requêtes, peuvent être réalisés en opérant sur la chaîne de texte brute, par opposition à la représentation vectorielle. Voir l'exemple de code ci-dessous pour savoir comment ingérer du texte et effectuer une recherche en texte intégral avec la nouvelle 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
)

Nous avons adopté une implémentation de l'évaluation de la pertinence BM25 qui représente les requêtes et les documents sous forme de vecteurs épars, appelée Sparse-BM25. Cela permet de débloquer de nombreuses optimisations basées sur les vecteurs épars, telles que :

Milvus offre des capacités de recherche hybrides grâce à son implémentation de pointe Sparse-BM25, qui intègre la recherche en texte intégral dans l'architecture de la base de données vectorielle. En représentant les fréquences des termes sous forme de vecteurs épars au lieu des index inversés traditionnels, Sparse-BM25 permet des optimisations avancées, telles que l'indexation par graphe, la quantification par produit (PQ) et la quantification scalaire (SQ). Ces optimisations minimisent l'utilisation de la mémoire et accélèrent les performances de recherche. Semblable à l'approche de l'index inversé, Milvus prend en charge le texte brut en tant qu'entrée et génère des vecteurs épars en interne. Cela lui permet de travailler avec n'importe quel tokéniseur et de saisir n'importe quel mot figurant dans le corpus en évolution dynamique.

En outre, l'élagage heuristique permet d'éliminer les vecteurs épars de faible valeur, ce qui améliore encore l'efficacité sans compromettre la précision. Contrairement à l'approche précédente utilisant des vecteurs épars, elle peut s'adapter à un corpus croissant, et non à la précision de la notation BM25.

  1. Construction d'index de graphe sur le vecteur clairsemé, qui donne de meilleurs résultats que l'index inversé pour les requêtes comportant un texte long, car l'index inversé a besoin de plus d'étapes pour finir de faire correspondre les tokens de la requête ;
  2. L'utilisation de techniques d'approximation pour accélérer la recherche avec un impact mineur sur la qualité de la recherche, telles que la quantification des vecteurs et l'élagage basé sur des heuristiques ;
  3. l'unification de l'interface et du modèle de données pour la recherche sémantique et la recherche en texte intégral, ce qui améliore l'expérience de l'utilisateur.
# 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 résumé, Milvus 2.5 a étendu ses capacités de recherche au-delà de la recherche sémantique en introduisant la recherche en texte intégral, ce qui permet aux utilisateurs de créer plus facilement des applications d'IA de haute qualité. Il ne s'agit là que de premières étapes dans l'espace de recherche Sparse-BM25 et nous pensons qu'il y aura d'autres mesures d'optimisation à essayer à l'avenir.

Filtres de recherche de correspondance de texte

Une deuxième fonction de recherche de texte a été lancée avec Milvus 2.5 : la correspondance de texte, qui permet à l'utilisateur de filtrer la recherche sur les entrées contenant une chaîne de texte spécifique. Cette fonction repose également sur la tokenisation et est activée à l'adresse enable_match=True.

Il convient de noter qu'avec Text Match, le traitement du texte de la requête est basé sur la logique du OU après la tokenisation. Par exemple, dans l'exemple ci-dessous, le résultat renverra tous les documents (utilisant le champ "texte") qui contiennent soit "vecteur" soit "base de données".

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

Si votre scénario exige une correspondance à la fois avec "vector" et "database", vous devez écrire deux correspondances de texte distinctes et les superposer à l'aide de AND pour atteindre votre objectif.

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

Amélioration significative des performances du filtrage scalaire

L'accent mis sur les performances du filtrage scalaire provient de notre découverte que la combinaison de la recherche vectorielle et du filtrage des métadonnées peut grandement améliorer les performances et la précision des requêtes dans divers scénarios. Ces scénarios vont des applications de recherche d'images telles que l'identification des cas de figure dans la conduite autonome aux scénarios complexes de RAG dans les bases de connaissances d'entreprise. Il est donc tout à fait approprié pour les utilisateurs en entreprise de mettre en œuvre des scénarios d'application de données à grande échelle.

Dans la pratique, de nombreux facteurs tels que la quantité de données filtrées, l'organisation des données et la méthode de recherche peuvent affecter les performances. Pour y remédier, Milvus 2.5 introduit trois nouveaux types d'index : l'index BitMap, l'index inversé de tableau et l'index inversé après la tokenisation du champ de texte Varchar. Ces nouveaux index peuvent améliorer de manière significative les performances dans les cas d'utilisation réels.

Plus précisément, l'index BitMap peut être utilisé pour améliorer les performances dans les cas d'utilisation réels :

  1. L'index BitMap peut être utilisé pour accélérer le filtrage des balises (les opérateurs courants incluent in, array_contains, etc.), et convient aux scénarios avec moins de données de catégories de champs (cardinalité des données). Le principe consiste à déterminer si une ligne de données possède une certaine valeur sur une colonne, avec 1 pour oui et 0 pour non, puis à maintenir une liste BitMap. Le graphique suivant montre la comparaison des tests de performance que nous avons effectuée sur la base d'un scénario d'entreprise d'un client. Dans ce scénario, le volume de données est de 500 millions, la catégorie de données est de 20, les différentes valeurs ont des proportions de distribution différentes (1 %, 5 %, 10 %, 50 %), et les performances sous différentes quantités de filtrage varient également. Avec un filtrage de 50 %, nous pouvons obtenir un gain de performance de 6,8 fois grâce à l'index BitMap. Il convient de noter qu'à mesure que la cardinalité augmente, l'index inversé présente des performances plus équilibrées que l'index BitMap.

  1. Lacorrespondance de texte est basée sur l'index inversé une fois que le champ de texte a été transformé en jeton. Ses performances dépassent de loin celles de la fonction Wildcard Match (c'est-à-dire like + %) que nous avons fournie dans la version 2.4. D'après les résultats de nos tests internes, les avantages de la correspondance de texte sont très clairs, en particulier dans les scénarios de requêtes simultanées, où elle peut multiplier par 400 la vitesse de traitement des requêtes.

En ce qui concerne le traitement des données JSON, nous prévoyons d'introduire dans les versions ultérieures de la version 2.5.x la construction d'indices inversés pour les clés spécifiées par l'utilisateur et l'enregistrement d'informations de localisation par défaut pour toutes les clés afin d'accélérer l'analyse syntaxique. Nous prévoyons que ces deux domaines amélioreront considérablement les performances des requêtes JSON et Dynamic Field. Nous prévoyons de présenter plus d'informations dans les prochaines notes de version et blogs techniques, alors restez à l'écoute !

Nouvelle interface de gestion

La gestion d'une base de données ne devrait pas nécessiter un diplôme d'informatique, mais nous savons que les administrateurs de bases de données ont besoin d'outils puissants. C'est pourquoi nous avons introduit la Cluster Management WebUI, une nouvelle interface web accessible à l'adresse de votre cluster sur le port 9091/webui. Cet outil d'observabilité fournit

  • des tableaux de bord de surveillance en temps réel affichant des mesures à l'échelle de la grappe
  • des analyses détaillées de la mémoire et des performances par nœud
  • Informations sur les segments et suivi des requêtes lentes
  • Indicateurs de santé du système et état des nœuds
  • des outils de dépannage faciles à utiliser pour les problèmes complexes du système.

Bien que cette interface soit encore en version bêta, nous la développons activement en nous appuyant sur les commentaires des administrateurs de bases de données. Les prochaines mises à jour incluront des diagnostics assistés par l'IA, des fonctions de gestion plus interactives et des capacités améliorées d'observabilité des clusters.

Documentation et expérience des développeurs

Nous avons entièrement remanié notre documentation et notre expérience SDK/API afin de rendre Milvus plus accessible tout en conservant une certaine profondeur pour les utilisateurs expérimentés. Les améliorations comprennent

  • Un système de documentation restructuré avec une progression plus claire des concepts de base aux concepts avancés
  • Des tutoriels interactifs et des exemples concrets qui présentent des mises en œuvre pratiques.
  • Des références d'API complètes avec des exemples de code pratiques
  • Une conception plus conviviale du SDK qui simplifie les opérations courantes
  • des guides illustrés qui facilitent la compréhension des concepts complexes
  • un assistant de documentation alimenté par l'IA (ASK AI) pour des réponses rapides.

La mise à jour du SDK/API vise à améliorer l'expérience des développeurs grâce à des interfaces plus intuitives et à une meilleure intégration de la documentation. Nous pensons que vous remarquerez ces améliorations lorsque vous travaillerez avec la série 2.5.x.

Cependant, nous savons que le développement de la documentation et du SDK est un processus continu. Nous continuerons à optimiser la structure du contenu et la conception du SDK en fonction des commentaires de la communauté. Rejoignez notre canal Discord pour nous faire part de vos suggestions et nous aider à nous améliorer encore.

Résumé

Milvus 2.5 contient 13 nouvelles fonctionnalités et plusieurs optimisations au niveau du système, apportées non seulement par Zilliz mais aussi par la communauté open-source. Nous n'avons abordé que quelques-unes d'entre elles dans ce billet et vous encourageons à consulter notre note de mise à jour et les documents officiels pour plus d'informations !

Like the article? Spread the word

Continuer à Lire