🚀 NouveautĂ©s du filtrage des mĂ©tadonnĂ©es dans Milvus v2.4.3

Jun 16, 20243 min read

Milvus v2.4.3 a introduit la correspondance de mĂ©tadonnĂ©es sur chaĂźne complĂšte ! 🎉 DĂ©sormais, vous pouvez faire correspondre des chaĂźnes Ă  l’aide de recherches par prĂ©fixe, infixe, suffixe, ou mĂȘme avec caractĂšre gĂ©nĂ©rique.

# Prefix example, matches any string starting with “The”.
expression='title like "The%"'
# Infix example, matches any string with the word “the” anywhere in the sentence.
expression='title like "%the%"'
# Postfix example, matches any string ending with “Rye”.
expression='title like "%Rye"'
# Single character wildcard example, matches any one single character at a specific position.
expression='title like "Flip_ed"'

Dans des blogs prĂ©cĂ©dents, nous n’avions parlĂ© que de la correspondance de chaĂźnes par prĂ©fixe. Cependant, depuis Milvus v2.4.3, toutes les variantes sont Ă©galement possibles, tout comme l’utilisation de valeurs de tableau, soit par correspondances exactes, soit en vĂ©rifiant si des Ă©lĂ©ments du tableau correspondent (contains_any()). đŸ—‚ïžđŸ”

Ces mises à jour rendent le filtrage des métadonnées plus polyvalent et plus puissant !

Rendons tout cela plus clair avec un exemple. Pour ce blog, j’utiliserai les donnĂ©es de films IMDB, que j’ai tĂ©lĂ©chargĂ©es depuis Kaggle.

# Import common libraries.
import sys, os, time, pprint
import pandas as pd

# Read CSV data.
df = pd.read_csv("data/original_data.csv")

# Shortcut the data for demo.
df = df.tail(200)
display(df.head())

Chaque film possùde un champ ‘text’ avec sa description et ses critiques. 📝

Chaque film inclut des mĂ©tadonnĂ©es comme l’annĂ©e de sortie, la note, ainsi que des listes de genres, d’acteurs et de mots-clĂ©s. đŸŽŹâ­ïžđŸ“…

Chaque “ligne” reprĂ©sente un fragment de texte d’une critique de film, sa reprĂ©sentation vectorielle et des mĂ©tadonnĂ©es telles que movie_id, le titre du film, le lien de l’affiche, les genres et les acteurs.

En suivant le modùle habituel de RAG : 📝🎬

  1. Se connecter Ă  Milvus : Tout d’abord, connectez-vous Ă  Milvus Lite, le dĂ©ploiement local de Milvus. C’est notre base de donnĂ©es pour stocker et gĂ©rer les vecteurs. đŸ–„ïžđŸ”—

  2. Transformer le texte des films en vecteurs : Prenez le champ texte de chaque film, qui inclut la description et la critique, et transformez-le en vecteur. Nous utiliserons le modĂšle HuggingFace BAAI/bge-large-en-v1.5 pour cela. đŸ§ âžĄïžđŸ“

  3. đŸ“„đŸ“Š InsĂ©rer les vecteurs et les mĂ©tadonnĂ©es dans Milvus : InsĂ©rez ce vecteur, avec le texte d’origine (appelĂ© le “chunk”) et ses mĂ©tadonnĂ©es (comme l’annĂ©e, la note, les genres, etc.) dans Milvus. đŸ“„đŸ“Š

  4. GĂ©rer les requĂȘtes utilisateur : Transformez la requĂȘte de l’utilisateur en vecteur Ă  l’aide du mĂȘme modĂšle d’embedding. Ensuite, lancez une recherche des plus proches voisins approximatifs pour trouver les vecteurs de donnĂ©es les plus proches du vecteur de requĂȘte. 🔍🎬

Vous pouvez trouver le code complet sur mon GitHub.

Tout d’abord, connectez-vous Ă  Milvus. Vous devrez installer Pymilvus avec pip. (En spĂ©cifiant simplement un nom de fichier local, il utilise Milvus Lite, une base de donnĂ©es vectorielle locale. Si vous avez un autre Milvus, par exemple dĂ©ployĂ© avec docker ou K8s, ou Zilliz Cloud entiĂšrement managĂ©, vous pouvez spĂ©cifier l’URI et le Token pour vous y connecter. Le reste du code fonctionne de la mĂȘme maniĂšre.)

# !python -m pip install -U pymilvus
import pymilvus
# Connect a client to the Milvus Lite server.
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")

Ensuite, segmentez et vectorisez la colonne de texte contenant la critique de film en vecteurs. De nombreuses ressources donnent des exemples de la maniÚre de procéder, je ne montrerai donc pas à nouveau le code ici. Ci-dessous, je montre comment assembler le texte segmenté, la représentation vectorielle et les métadonnées, puis insérer les données dans Milvus.

# Create chunk_list and dict_list in a single loop
dict_list = []
for id, title, chunk, vector, poster_url, director,\
   genres, actors, keywords, film_year, rating in zip(
       df.id, df.Name, chunks, converted_values, df.PosterLink,
       df.Director, df.Genres, df.Actors, df.Keywords,
       df.MovieYear, df.RatingValue):
  
   # Assemble embedding vector, original text chunk, metadata.
   chunk_dict = {
       'movie_index': id,
       'title': title,
       'chunk': chunk.page_content,
       'poster_url': poster_url,
       'director': director,
       'genres': genres,
       'actors': actors,
       'keywords': keywords,
       'film_year': film_year,
       'rating': rating,
       'vector': vector,
   }
   dict_list.append(chunk_dict)

# Insert data into the Milvus collection.
print("Start inserting entities")
start_time = time.time()
client.insert(
   COLLECTION_NAME,
   data=dict_list,
   progress_bar=True)

end_time = time.time()
print(f"Milvus insert time for {len(dict_list)} vectors: ", end="")
print(f"{np.round(end_time - start_time, 2)} seconds")

Maintenant que les donnĂ©es sont dans Milvus, nous sommes prĂȘts Ă  effectuer une recherche !

Recherche Ă  l’aide de filtres de mĂ©tadonnĂ©es de chaĂźne

Disons que nous voulons trouver des films de science-fiction qui prĂ©sentent un futur dystopique avec des robots et qui sont trĂšs bien notĂ©s. Nos donnĂ©es d’exemple contiennent des mĂ©tadonnĂ©es que nous pouvons utiliser pour cette recherche.

Voici un exemple de filtrage de mĂ©tadonnĂ©es utilisant des correspondances de chaĂźne approximatives. Ci-dessous, j’ai encapsulĂ© l’API de recherche Milvus standard uniquement pour afficher plus facilement les mĂ©tadonnĂ©es aprĂšs chaque recherche.

SAMPLE_QUESTION = "Dystopia science fiction with a robot."
TOP_K = 1
# Metadata filters.
expression='rating >= 7'
# Infix string match.
expression=expression + ' && title like "%Panther%"'
formatted_results, contexts, context_metadata = \
     mc_run_search(SAMPLE_QUESTION, expression, TOP_K)

Ressources et lectures complémentaires

Guide de démarrage rapide de Milvus

Utiliser des champs de tableau | Documentation Milvus

https://github.com/milvus-io/pymilvus/blob/2.4/examples/fuzzy_match.py

https://milvus.io/docs/boolean.md#Usage

https://milvus.io/docs/single-vector-search.md#Filtered-search

Mis Ă  jour le Jul 09, 2026