Filtrage des métadonnées Milvus : filtrage JSON et des métadonnées dans Milvus
JSON, ou JavaScript Object Notation, est un format de données flexible pour le stockage et la transmission. Il utilise des paires clé-valeur de manière adaptative, ce qui le rend parfait pour les bases de données NoSQL et les résultats d’API. Grâce à sa flexibilité, c’est un format de données populaire. Les paramètres de recherche sont essentiels pour définir les spécificités de chaque requête de recherche, comme les champs vectoriels utilisés, les vecteurs de requête et les limites du nombre de résultats renvoyés.
De nombreuses démos Milvus commencent avec des données textuelles brutes, comme des fichiers de type .txt, .pdf ou .csv. Mais saviez-vous que vous pouvez téléverser et travailler avec du JSON brut avec Milvus ? Consultez cette page de documentation JSON pour plus de détails.
Milvus Client est une surcouche autour de l’objet collection Milvus qui utilise un format JSON flexible “key”:value afin de permettre des définitions de données sans schéma. Consultez la documentation Milvus Client pour plus d’informations.
Milvus Client sans schéma et l’offre cloud gratuite de Zilliz constituent un excellent moyen d’utiliser Milvus rapidement ! Milvus Client est presque aussi rapide que la définition préalable d’un schéma complet, mais avec un codage moins sujet aux erreurs. Comparé à “enable_dynamic_field”, Milvus Client est beaucoup plus rapide, offrant une approche plus fluide pour utiliser moins de définition de schéma en amont. Le schéma sans schéma est :
- id (str): Nom du champ de clé primaire.
- vector (str): Nom du champ vectoriel.
C’est tout ! Le reste des champs peut être déterminé de manière flexible lorsque les données sont insérées dans Milvus.
Pour rendre cela plus concret, passons à quelques exemples de code montrant comment utiliser Milvus Client. Le code complet se trouve dans mon dépôt github Bootcamp.
Exemple de code - téléverser des données JSON brutes directement dans Milvus
Les données brutes elles-mêmes peuvent être au format JSON. C’est utile, par exemple, si vos données proviennent d’une base de données NoSQL comme MongoDB. Les données JSON utilisées ci-dessous sont la classification des genres de films IMDB de Kaggle
# !pip install numpy pandas json pprint pymilvus torch sentence-transformers
# Import common libraries.
import pandas as pd
import json
# Read JSON data.
df = pd.read_json('data/tiny_parsed_data.json')
# Concatenate Title and Description into 'text' column.
df['text'] = df['title'] + ' ' + df['description']
display(df.head(2))
Démarrez un serveur d’essai gratuit Zilliz cloud. Vous pouvez avoir jusqu’à 2 collections, chacune jusqu’à 1 million de vecteurs, dans un essai gratuit à la fois. Le code de ce notebook utilise pleinement man
- Choisissez l’option par défaut "Starter" lorsque vous provisionnez > Create collection > Donnez-lui un nom > Create cluster and collection.
- Sur la page principale du Cluster, copiez votre
API Keyet stockez-la localement dans une variable .env ‘ZILLIZ_API_KEY’. - Toujours sur la page principale du Cluster, copiez le
Public Endpoint URI.
import os
from pymilvus import connections, utility
TOKEN = os.getenv("ZILLIZ_API_KEY")
# Connect to Zilliz cloud using endpoint URI and API key TOKEN.
CLUSTER_ENDPOINT="https://in03-xxxx.api.gcp-us-west1.zillizcloud.com:443"
connections.connect(
alias='default',
token=TOKEN,
uri=CLUSTER_ENDPOINT,)
# Check if the server is ready and get collection name.
print(f"Type of server: {utility.get_server_version()}")
Choisissez un modèle d’embedding. Ci-dessous, j’en ai choisi un de HuggingFace. Je l’exécute sur mon ordinateur portable, je dois donc m’assurer que DEVICE=cpu.
import torch
from sentence_transformers import SentenceTransformer
# Initialize torch settings
torch.backends.cudnn.deterministic = True
DEVICE = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')
# Load the model from huggingface model hub.
model_name = "WhereIsAI/UAE-Large-V1"
encoder = SentenceTransformer(model_name, device=DEVICE)
# Get the model parameters and save for later.
EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
# View model parameters.
print(f"model_name: {model_name}")
print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
Importez MilvusClient et créez la collection. Notez que nous n’avons pas besoin de spécifier un schéma ! De plus, vous pouvez simplement utiliser notre index système par défaut, appelé AUTOINDEX. En open source et en offre gratuite, l’index par défaut est HNSW. Sur Zilliz cloud payant, AUTOINDEX sera davantage optimisé à l’aide d’index propriétaires.
from pymilvus import MilvusClient
import pprint
# Set the Milvus collection name.
COLLECTION_NAME = "imdb_metadata"
# Use no-schema Milvus client.
mc = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN)
# Check if the collection already exists, if so drop it.
has = utility.has_collection(COLLECTION_NAME)
if has:
drop_result = utility.drop_collection(COLLECTION_NAME)
print(f"Successfully dropped collection: `{COLLECTION_NAME}`")
# Create the collection.
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,
# skip setting params, if using AUTOINDEX
)
print(f"Successfully created collection: `{COLLECTION_NAME}`")
pprint.pprint(mc.describe_collection(COLLECTION_NAME))
Une stratégie simple de découpage consiste à conserver le champ ‘text’ comme un seul segment, sauf s’il dépasse 512 caractères de longueur. Ci-dessous, nous pouvons voir que le champ de texte des données JSON était assez court. Aucune ligne n’a dû être divisée en segments plus petits.
# Use the embedding model parameters.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Chunk a batch of data from pandas DataFrame and inspect it.
BATCH_SIZE = 100
batch = imdb_chunk_text(BATCH_SIZE, df, chunk_size)
display(batch.head(2))
Maintenant que nous avons des segments de texte, des embeddings vectoriels pour chaque segment de texte, et toutes les métadonnées d’origine, insérons ces données dans la base de données vectorielle Milvus.
# Convert the DataFrame to a list of dictionaries
chunk_list = batch.to_dict(orient='records')
# Insert data into the Milvus collection.
start_time = time.time()
insert_result = mc.insert( COLLECTION_NAME, data=chunk_list, progress_bar=True )
end_time = time.time()
print(f"Milvus Client insert time for {batch.shape[0]} vectors: {end_time - start_time} seconds")
Posons une question et récupérons des réponses à partir de nos données de films.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='film_year >= 2019', )
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
temps de recherche
En parcourant les 2 meilleurs résultats, nous voyons.
Cela semble plutôt bon. Mais que faire si nous voulons effectuer un filtrage de métadonnées sur le tableau JSON ‘Genres’ ?
Filtrage des métadonnées dans les champs JSON et les tableaux JSON
Une nouvelle fonctionnalité de Milvus 2.3 est la capacité à filtrer les métadonnées JSON brutes. Ci-dessous, je vais montrer un exemple utilisant le filtrage des métadonnées avec un champ et un tableau.
Disons que je voulais voir des films plus anciens, plus rétro, et strictement du genre Sci-Fi.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='json_contains(Genres, "Sci-Fi") and film_year < 2019',
)
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
En parcourant les 2 meilleurs résultats, les recommandations de films ont maintenant changé pour correspondre au filtre.
De nombreuses démos Milvus commencent avec des données textuelles brutes telles que des types de fichiers .txt, .pdf ou .csv. Cette fois, nous avons vu comment charger des données JSON directement dans une collection de base de données vectorielle Milvus. Nous avons également vu comment utiliser le filtrage pratique des métadonnées sur les champs JSON et le filtragejson_contains() sur les types de données de tableaux JSON. Le code complet de cet article de blog se trouve dans mon dépôt GitHub Bootcamp.
Introduction à la recherche hybride
La recherche hybride est une fonctionnalité puissante de Milvus qui permet aux utilisateurs de combiner plusieurs champs vectoriels en une seule recherche. Cette fonctionnalité est particulièrement utile dans les scénarios de recherche complexes où une entité peut être représentée par plusieurs vecteurs divers. En intégrant les résultats de plusieurs recherches vectorielles à l’aide de stratégies de reranking, la recherche hybride permet aux utilisateurs d’atteindre une précision plus élevée et des résultats plus pertinents.
Dans Milvus, la recherche hybride peut être utilisée pour combiner différents types de données, tels que le texte, les images et l’audio, en une seule requête de recherche. Cela permet aux utilisateurs d’effectuer des recherches plus complètes et de récupérer des résultats plus pertinents. Par exemple, une recherche hybride peut combiner des embeddings de texte avec des embeddings d’images pour trouver des produits qui correspondent à la fois à une description textuelle et à un exemple visuel.
Pour utiliser efficacement la recherche hybride dans Milvus, il est important de comprendre les différents champs vectoriels et la manière dont ils peuvent être combinés. En sélectionnant et en combinant soigneusement les champs vectoriels, les utilisateurs peuvent améliorer la précision et la pertinence de leurs résultats de recherche. De plus, l’utilisation de stratégies de reranking peut aider à affiner davantage les résultats de recherche et à garantir que les résultats les plus pertinents sont renvoyés.
Gérer les données avec les métadonnées
Les métadonnées jouent un rôle crucial dans la gestion des données dans Milvus. Les métadonnées sont utilisées pour décrire la structure et l’organisation des données, ce qui facilite la recherche, le filtrage et l’analyse. Dans Milvus, les métadonnées sont utilisées pour gérer les fichiers de données, y compris les informations sur les données, telles que le nom de la collection, le champ vectoriel et le type d’index.
En utilisant efficacement les métadonnées, les utilisateurs peuvent améliorer les performances et la précision de leurs recherches. Les métadonnées permettent aux utilisateurs d’organiser leurs données de manière à les rendre faciles à récupérer et à analyser. Par exemple, en utilisant les métadonnées pour étiqueter les données avec des mots-clés pertinents, les utilisateurs peuvent rapidement filtrer et rechercher des points de données spécifiques.
En plus d’améliorer les performances de recherche, les métadonnées peuvent également contribuer à garantir l’intégrité et la cohérence des données. En utilisant les métadonnées pour suivre les changements et les mises à jour des données, les utilisateurs peuvent s’assurer que leurs données restent exactes et à jour. Cela est particulièrement important dans les environnements de données à grande échelle où les données sont constamment mises à jour et modifiées.
JSON et filtrage des métadonnées
JSON (JavaScript Object Notation) est un format de données flexible largement utilisé dans les bases de données NoSQL et les résultats d’API. Milvus prend en charge le téléversement et l’utilisation de données JSON brutes, ce qui facilite l’intégration avec d’autres systèmes. Le filtrage des métadonnées est une fonctionnalité puissante de Milvus qui permet aux utilisateurs de filtrer les métadonnées JSON brutes en fonction de conditions spécifiques.
En utilisant le filtrage des métadonnées, les utilisateurs peuvent améliorer la précision de leurs recherches et réduire la quantité de données non pertinentes. Par exemple, les utilisateurs peuvent filtrer des données JSON en fonction de champs ou de valeurs spécifiques, comme le filtrage de films par genre ou par année de sortie. Cela permet aux utilisateurs d’effectuer des recherches plus ciblées et de récupérer des résultats plus pertinents.
Dans Milvus, le filtrage des métadonnées peut être utilisé en combinaison avec la recherche vectorielle pour affiner davantage les résultats de recherche. En appliquant des filtres de métadonnées aux requêtes de recherche vectorielle, les utilisateurs peuvent s’assurer que seules les données les plus pertinentes sont renvoyées. Cela peut contribuer à améliorer la précision de la recherche et à réduire la quantité de données non pertinentes devant être traitées.
Création et gestion des index pour la recherche vectorielle
La création d’index est une étape essentielle dans l’optimisation des performances de recherche vectorielle dans Milvus. Un index est une structure de données qui améliore la vitesse de récupération des données en permettant à la base de données de localiser rapidement des données spécifiques. Dans Milvus, des index peuvent être créés sur des champs vectoriels afin d’améliorer les performances des recherches vectorielles.
Différents types d’index sont disponibles dans Milvus, chacun avec ses propres avantages et cas d’utilisation. Par exemple, l’index HNSW (Hierarchical Navigable Small World) est couramment utilisé pour les recherches vectorielles à haute dimension en raison de son efficacité et de sa précision. D’autres types d’index, tels qu’IVF (Inverted File) et PQ (Product Quantization), offrent différents compromis entre vitesse et précision de recherche.
Pour créer et gérer efficacement les index, il est important de comprendre les caractéristiques des données et les exigences spécifiques de recherche. En sélectionnant le type d’index approprié et en ajustant les paramètres de l’index, les utilisateurs peuvent améliorer considérablement les performances de leurs recherches. De plus, la mise à jour et la maintenance régulières des index peuvent aider à garantir que les performances de recherche restent optimales à mesure que les données évoluent.
Optimisation des performances de la recherche hybride
Les performances de la recherche hybride peuvent être optimisées à l’aide de diverses techniques, notamment la création d’index, le filtrage des métadonnées et l’optimisation des requêtes. En créant des index sur les champs vectoriels, les utilisateurs peuvent améliorer les performances des recherches vectorielles. Les index permettent à la base de données de localiser rapidement les données pertinentes, réduisant ainsi le temps nécessaire pour effectuer les recherches.
Le filtrage des métadonnées est une autre technique importante pour optimiser les performances de la recherche hybride. En utilisant des filtres de métadonnées, les utilisateurs peuvent réduire la quantité de données non pertinentes devant être traitées, améliorant ainsi la précision et la rapidité de la recherche. Par exemple, filtrer les données en fonction de champs ou de valeurs spécifiques peut aider à restreindre les résultats de recherche et à garantir que seules les données les plus pertinentes sont renvoyées.
L’optimisation des requêtes est également cruciale pour améliorer les performances de la recherche hybride. En optimisant la structure et les paramètres des requêtes de recherche, les utilisateurs peuvent réduire les ressources de calcul nécessaires aux recherches et améliorer les performances. Cela peut inclure des techniques telles que le regroupement des requêtes, l’utilisation de structures de données efficaces et l’ajustement des paramètres de requête.
Dans cette section, nous avons abordé les bonnes pratiques pour optimiser les performances de la recherche hybride dans Milvus. En utilisant des techniques telles que la création d’index, le filtrage des métadonnées et l’optimisation des requêtes, les utilisateurs peuvent améliorer la précision et la vitesse de leurs recherches, en s’assurant de récupérer les résultats les plus pertinents.
Continuer à lire

How Zilliz Ended Up at the Center of NVIDIA’s Unstructured Data Story at GTC 2026
If unstructured data is the context of AI, then the ceiling of AI applications will be set not just by models, but by how mature the infrastructure for unstructured data becomes.

Introducing Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud
We're announcing the general availability of Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud.

Build for the Boom: Why AI Agent Startups Should Build Scalable Infrastructure Early
Explore strategies for developing AI agents that can handle rapid growth. Don't let inadequate systems undermine your success during critical breakthrough moments.



