Phrase Match with Slop in Milvus 2.6 : Comment améliorer la précision de la recherche plein texte au niveau de la phrase ?
Alors que les données non structurées continuent d'exploser et que les modèles d'IA deviennent de plus en plus intelligents, la recherche vectorielle est devenue la couche de recherche par défaut pour de nombreux systèmes d'IA - pipelines RAG, recherche d'IA, agents, moteurs de recommandation, etc. Elle fonctionne parce qu'elle capture le sens : non seulement les mots tapés par les utilisateurs, mais aussi l'intention qui les sous-tend.
Cependant, une fois que ces applications sont mises en production, les équipes découvrent souvent que la compréhension sémantique n'est qu'un aspect du problème de recherche. De nombreuses charges de travail dépendent également de règles textuelles strictes, telles que la correspondance avec une terminologie exacte, la préservation de l'ordre des mots ou l'identification de phrases ayant une signification technique, juridique ou opérationnelle.
Milvus 2.6 supprime ce clivage en introduisant la recherche plein texte native directement dans la base de données vectorielle. Grâce aux index de jetons et de positions intégrés au moteur principal, Milvus peut interpréter l'intention sémantique d'une requête tout en appliquant des contraintes précises au niveau des mots clés et des phrases. Il en résulte un pipeline de recherche unifié dans lequel le sens et la structure se renforcent mutuellement plutôt que de vivre dans des systèmes distincts.
Lacorrespondance des phrases est un élément clé de cette capacité de recherche en texte intégral. Elle identifie les séquences de termes qui apparaissent ensemble et dans l'ordre, ce qui est essentiel pour détecter les modèles de journaux, les signatures d'erreurs, les noms de produits et tout texte dans lequel l'ordre des mots définit la signification. Dans ce billet, nous expliquerons comment Phrase Match fonctionne dans Milvus, comment slop ajoute la flexibilité nécessaire au texte du monde réel et pourquoi ces fonctionnalités rendent la recherche vectorielle hybride en texte intégral non seulement possible mais pratique au sein d'une base de données unique.
Qu'est-ce que Phrase Match ?
La correspondance de phrases est un type de requête en texte intégral dans Milvus qui se concentre sur la structure, c'est-à-diresur la question de savoir si une séquence de mots apparaît dans le même ordre à l'intérieur d'un document. Lorsqu'aucune flexibilité n'est autorisée, la requête se comporte de manière stricte : les termes doivent apparaître l'un à côté de l'autre et dans le même ordre. Une requête telle que "robotics machine learning" ne correspond donc que si ces trois mots apparaissent sous la forme d'une phrase continue.
La difficulté réside dans le fait que le texte réel se comporte rarement de manière aussi nette. Le langage naturel introduit du bruit : des adjectifs supplémentaires se glissent dans le texte, les journaux réorganisent les champs, les noms de produits s'enrichissent de modificateurs, et les auteurs humains n'écrivent pas en pensant aux moteurs de recherche. Une correspondance stricte entre les phrases se brise facilement - un mot inséré, une reformulation ou un terme interverti peut entraîner une erreur. Et dans de nombreux systèmes d'IA, en particulier ceux qui sont confrontés à la production, l'omission d'une ligne de journal pertinente ou d'une phrase déclenchant une règle n'est pas acceptable.
Milvus 2.6 résout ce problème à l'aide d'un mécanisme simple : la marge de manœuvre. Ce mécanisme définit la marge de manœuvre autorisée entre les termes de la requête. Au lieu de considérer une phrase comme fragile et inflexible, la marge de manœuvre vous permet de décider si un mot supplémentaire est tolérable, ou deux, ou même si une légère réorganisation doit toujours être considérée comme une correspondance. La recherche de phrases passe ainsi d'un test binaire de type "réussite/échec" à un outil de recherche contrôlé et adaptable.
Pour comprendre pourquoi cela est important, imaginez que vous recherchiez dans les journaux toutes les variantes de l'erreur de réseau familière "connexion réinitialisée par un pair". En pratique, vos journaux pourraient ressembler à ceci :
connection reset by peer
connection fast reset by peer
connection was suddenly reset by the peer
peer reset connection by ...
peer unexpected connection reset happened
À première vue, tous ces éléments représentent le même événement sous-jacent. Mais les méthodes d'extraction courantes se heurtent à des difficultés :
BM25 se heurte à la structure.
Il considère la requête comme un ensemble de mots-clés, sans tenir compte de l'ordre dans lequel ils apparaissent. Tant que les mots "connexion" et "pair" apparaissent quelque part, BM25 peut classer le document dans une catégorie élevée, même si l'expression est inversée ou sans rapport avec le concept que vous recherchez réellement.
La recherche vectorielle se heurte à des contraintes.
Les emboîtements sont excellents pour capturer le sens et les relations sémantiques, mais ils ne peuvent pas appliquer une règle telle que "ces mots doivent apparaître dans cette séquence". Vous pouvez retrouver des messages sémantiquement liés, mais ne pas trouver le modèle structurel exact requis pour le débogage ou la conformité.
La correspondance de phrases comble le fossé entre ces deux approches. En utilisant la marge, vous pouvez spécifier exactement le degré de variation acceptable :
slop = 0- Correspondance exacte (tous les termes doivent apparaître de manière contiguë et dans l'ordre).slop = 1- Autoriser un mot supplémentaire (couvre les variations courantes en langue naturelle avec un seul terme inséré).slop = 2- Autoriser l'insertion de plusieurs mots (pour les formulations plus descriptives ou verbeuses).slop = 3- Autoriser la réorganisation (pour les phrases inversées ou mal ordonnées, ce qui est souvent le cas le plus difficile dans les textes du monde réel).
Au lieu d'espérer que l'algorithme de notation "fasse bien les choses", vous déclarez explicitement la tolérance structurelle requise par votre application.
Fonctionnement de la correspondance des phrases dans Milvus
Alimentée par la bibliothèque du moteur de recherche Tantivy, la correspondance de phrases dans Milvus est mise en œuvre au-dessus d'un index inversé avec des informations de position. Au lieu de vérifier uniquement si les termes apparaissent dans un document, il vérifie qu'ils apparaissent dans le bon ordre et à une distance contrôlable.
Le diagramme ci-dessous illustre le processus :
1. Tokénisation du document (avec les positions)
Lorsque des documents sont insérés dans Milvus, les champs de texte sont traités par un analyseur qui divise le texte en tokens (mots ou termes) et enregistre la position de chaque token dans le document. Par exemple, doc_1 est transformé en tokens sous la forme suivante : : machine (pos=0), learning (pos=1), boosts (pos=2), efficiency (pos=3).
2. Création d'un index inversé
Ensuite, Milvus crée un index inversé. Au lieu de mettre en correspondance les documents avec leur contenu, l'index inversé met en correspondance chaque mot-clé avec les documents dans lesquels il apparaît, ainsi qu'avec toutes les positions enregistrées de ce mot-clé dans chaque document.
3. Correspondance des phrases
Lorsqu'une requête de phrase est exécutée, Milvus utilise d'abord l'index inversé pour identifier les documents qui contiennent tous les mots-clés de la requête. Il valide ensuite chaque candidat en comparant les positions des jetons pour s'assurer que les termes apparaissent dans le bon ordre et dans la limite de la distance autorisée slop. Seuls les documents qui satisfont à ces deux conditions sont renvoyés en tant que correspondances.
Le diagramme ci-dessous résume le fonctionnement de la recherche de syntagmes de bout en bout.
Comment activer la comparaison de phrases dans Milvus ?
La concordance des phrases fonctionne sur les champs de type VARCHARle type de chaîne dans Milvus. Pour l'utiliser, vous devez configurer votre schéma de collecte de manière à ce que Milvus effectue une analyse de texte et stocke les informations de position pour le champ. Pour ce faire, vous devez activer deux paramètres : enable_analyzer et enable_match.
Définir enable_analyzer et enable_match
Pour activer la correspondance des phrases pour un champ VARCHAR spécifique, définissez les deux paramètres sur True lorsque vous définissez le schéma du champ. Ensemble, ils indiquent à Milvus de
tokeniser le texte (via
enable_analyzer), etconstruire un index inversé avec des décalages positionnels (via
enable_match).
La correspondance de phrases repose sur ces deux étapes : l'analyseur décompose le texte en tokens et l'index de correspondance stocke l'emplacement de ces tokens, ce qui permet d'effectuer des requêtes efficaces basées sur les phrases et les mots-clés.
Vous trouverez ci-dessous un exemple de configuration de schéma qui active la comparaison de phrases sur un champ text:
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name=“id”,
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
schema.add_field(
field_name=‘text’, # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name=“embeddings”,
datatype=DataType.FLOAT_VECTOR,
dim=5
)
Recherche avec correspondance de phrases : Comment la pente affecte l'ensemble de candidats
Une fois que vous avez activé la correspondance pour une rubrique VARCHAR dans votre schéma de collection, vous pouvez effectuer des correspondances de phrases à l'aide de l'expression PHRASE_MATCH.
Remarque : l'expression PHRASE_MATCH ne tient pas compte des majuscules et des minuscules. Vous pouvez utiliser PHRASE_MATCH ou phrase_match.
Dans les opérations de recherche, la correspondance de phrases est généralement appliquée avant le classement par similarité vectorielle. Elle filtre d'abord les documents sur la base de contraintes textuelles explicites, réduisant ainsi l'ensemble des candidats. Les documents restants sont ensuite reclassés à l'aide de vecteurs intégrés.
L'exemple ci-dessous montre comment différentes valeurs de slop affectent ce processus. En ajustant le paramètre slop, vous contrôlez directement les documents qui passent le filtre de phrases et qui passent à l'étape du classement vectoriel.
Supposons que vous ayez une collection nommée tech_articles contenant les cinq entités suivantes :
| doc_id | texte |
|---|---|
| 1 | L'apprentissage automatique améliore l'efficacité de l'analyse des données à grande échelle |
| 2 | L'apprentissage d'une approche basée sur la machine est essentiel pour les progrès de l'IA moderne |
| 3 | Les architectures de machines d'apprentissage profond optimisent les charges de calcul |
| 4 | Les machines améliorent rapidement les performances des modèles pour un apprentissage continu |
| 5 | L'apprentissage d'algorithmes avancés de machine augmente les capacités de l'IA |
slop=1
Le filtre est appliqué aux documents qui contiennent l'expression "machine d'apprentissage" avec une légère flexibilité.
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”,
data=[query_vector],
filter=filter_slop1,
search_params={“params”: {“nprobe”: 10}},
limit=10,
output_fields=[“id”, “text”]
)
Résultats de la recherche :
| doc_id | texte |
|---|---|
| 2 | L'apprentissage d'une approche basée sur la machine est vital pour les progrès de l'IA moderne |
| 3 | Les architectures des machines d'apprentissage profond optimisent les charges de calcul |
| 5 | L'apprentissage d'algorithmes avancés augmente les capacités de l'IA |
slop=2
Cet exemple autorise une pente de 2, ce qui signifie que jusqu'à deux jetons supplémentaires (ou termes inversés) sont autorisés entre les mots "machine" et "apprentissage".
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
Résultats de la recherche :
| doc_id | texte |
|---|---|
| 1 | L'apprentissage automatique renforce l'efficacité de l'analyse des données à grande échelle |
| 3 | Les architectures de machines d'apprentissage profond optimisent les charges de calcul. |
slop=3
Dans cet exemple, une pente de 3 offre encore plus de flexibilité. Le filtre recherche "machine learning" avec un maximum de trois positions de jetons autorisées entre les mots.
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
Résultats de la recherche :
| doc_id | texte |
|---|---|
| 1 | L'apprentissage automatique renforce l'efficacité de l'analyse des données à grande échelle |
| 2 | L'apprentissage d'une approche basée sur la machine est essentiel pour les progrès de l'IA moderne |
| 3 | Les architectures de machines d'apprentissage profond optimisent les charges de calcul |
| 5 | L'apprentissage d'algorithmes avancés augmente les capacités de l'IA |
Conseils rapides : Ce qu'il faut savoir avant d'activer la correspondance des phrases dans Milvus
Phrase Match prend en charge le filtrage au niveau de la phrase, mais son activation implique plus qu'une configuration au moment de la requête. Il est utile de connaître les considérations associées avant de l'appliquer dans un environnement de production.
L'activation de la correspondance de phrases sur un champ crée un index inversé, ce qui augmente l'utilisation de l'espace de stockage. Le coût exact dépend de facteurs tels que la longueur du texte, le nombre de jetons uniques et la configuration de l'analyseur. Lorsque l'on travaille avec des champs de texte volumineux ou des données à cardinalité élevée, il convient de prendre en compte ces frais généraux dès le départ.
La configuration de l'analyseur est un autre choix de conception essentiel. Une fois qu'un analyseur est défini dans le schéma de collecte, il ne peut plus être modifié. Pour passer ultérieurement à un autre analyseur, il faut abandonner la collection existante et la recréer avec un nouveau schéma. C'est pourquoi le choix d'un analyseur doit être considéré comme une décision à long terme plutôt que comme une expérience.
Le comportement de Phrase Match est étroitement lié à la façon dont le texte est tokenisé. Avant d'appliquer un analyseur à une collection entière, il est recommandé d'utiliser la méthode
run_analyzerpour inspecter le résultat de la tokenisation et confirmer qu'il correspond à vos attentes. Cette étape peut permettre d'éviter des erreurs subtiles et des résultats de requête inattendus par la suite. Pour plus d'informations, reportez-vous à la section Vue d'ensemble des analyseurs.
Conclusion
La correspondance de phrases est un type de recherche plein texte de base qui permet des contraintes de niveau de phrase et de position au-delà de la simple correspondance de mots-clés. En opérant sur l'ordre et la proximité des jetons, elle fournit un moyen prévisible et précis de filtrer les documents sur la base de la manière dont les termes apparaissent réellement dans le texte.
Dans les systèmes de recherche modernes, la correspondance de phrases est généralement appliquée avant le classement vectoriel. Elle limite d'abord l'ensemble des candidats aux documents qui satisfont explicitement aux phrases ou structures requises. La recherche vectorielle est ensuite utilisée pour classer ces résultats en fonction de leur pertinence sémantique. Ce modèle est particulièrement efficace dans des scénarios tels que l'analyse de journaux, la recherche de documentation technique et les pipelines RAG, où les contraintes textuelles doivent être appliquées avant que la similarité sémantique ne soit prise en compte.
Avec l'introduction du paramètre slop dans Milvus 2.6, Phrase Match devient plus tolérant à la variation du langage naturel tout en conservant son rôle de mécanisme de filtrage plein texte. Cela rend les contraintes au niveau de la phrase plus faciles à appliquer dans les flux de travail de recherche de production.
👉 Essayez-le avec les scripts de démonstration et explorez Milvus 2.6 pour voir comment la recherche d'information basée sur les phrases s'intègre dans votre pile.
Vous avez des questions ou souhaitez approfondir l'une des fonctionnalités de la dernière version de Milvus ? Rejoignez notre canal Discord ou déposez des questions sur GitHub. Vous pouvez également réserver une session individuelle de 20 minutes pour obtenir des informations, des conseils et des réponses à vos questions dans le cadre des Milvus Office Hours.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



