🚀 Novità sul filtraggio dei metadati in Milvus v2.4.3
Milvus v2.4.3 ha introdotto il matching dei metadati sull’intera stringa! 🎉 Ora puoi effettuare il matching di stringhe usando ricerche per prefisso, infisso, suffisso o persino con caratteri jolly.
# 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"'
Nei blog precedenti, abbiamo parlato solo del matching di stringhe per prefisso. Tuttavia, da Milvus v2.4.3, sono possibili anche tutte le varianti, così come l’uso di valori array, sia tramite corrispondenze esatte sia verificando se qualche elemento nell’array corrisponde (contains_any()). 🗂️🔍
Questi aggiornamenti rendono il filtering dei metadati più versatile e potente!
Rendiamo tutto più chiaro con un esempio. Per questo blog userò i dati dei film IMDB, che ho scaricato da 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())
Ogni film ha un campo ‘text’ con la sua descrizione e le recensioni. 📝
Ogni film include metadati come l’anno di uscita, la valutazione e liste di generi, attori e parole chiave. 🎬⭐️📅
Ogni “riga” rappresenta un chunk di testo di una recensione di un film, la sua rappresentazione vettoriale e metadati come movie_id, titolo del film, link al poster, generi e attori.
Seguendo il consueto pattern RAG: 📝🎬
Connettersi a Milvus: Per prima cosa, connettiti a Milvus Lite, il deployment locale di Milvus. Questo è il nostro database per archiviare e gestire i vettori. 🖥️🔗
Trasformare il testo dei film in vettori: Prendi il campo di testo di ogni film, che include la descrizione e la recensione, e trasformalo in un vettore. Per questo useremo il modello HuggingFace BAAI/bge-large-en-v1.5. 🧠➡️📏
📥📊 Inserire vettori e metadati in Milvus: Inserisci questo vettore, insieme al testo originale (chiamato “chunk”) e ai suoi metadati (come anno, valutazione, generi, ecc.) in Milvus. 📥📊
Gestire le query degli utenti: Trasforma la query dell’utente in un vettore usando lo stesso modello di embedding. Poi, esegui una ricerca Approximate Nearest Neighbors per trovare i vettori di dati più vicini al vettore della query. 🔍🎬
Puoi trovare il codice completo sul mio GitHub.
Per prima cosa, connettiti a Milvus. Dovrai installare Pymilvus con pip. (Specificando solo un nome di file locale, viene usato Milvus Lite, un database vettoriale locale. Se hai altri Milvus, come docker o K8s distribuiti, oppure Zilliz Cloud completamente gestito, puoi specificare URI e Token per connetterti a essi. Il resto del codice funziona allo stesso modo.)
# !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")
Successivamente, suddividi in chunk e incorpora in vettori la colonna di testo contenente la recensione del film. Molte risorse mostrano esempi di come farlo, quindi non mostrerò di nuovo il codice qui. Qui sotto, mostro come assemblare il testo suddiviso in chunk, la rappresentazione vettoriale e i metadati, e inserire i dati in Milvus.
# Crea chunk_list e dict_list in un singolo ciclo
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):
# Assembla il vettore di embedding, il chunk di testo originale, i metadati.
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)
# Inserisci i dati nella collection Milvus.
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")
Ora che i dati sono in Milvus, siamo pronti per la ricerca!
Ricerca usando filtri di metadati stringa
Supponiamo di voler trovare film di fantascienza che abbiano un futuro distopico con robot e siano molto apprezzati. I nostri dati di esempio hanno metadati che possiamo usare per questa ricerca.
Ecco un esempio di filtraggio dei metadati usando corrispondenze di stringhe fuzzy. Di seguito, ho racchiuso la vanilla Milvus search API solo per visualizzare più facilmente i metadati dopo ogni ricerca.
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)
Risorse e ulteriori letture
Usa i campi array | Documentazione 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
Continua a leggere

VDBBench Adds Cost-Aware Benchmarking for Vector Databases
Compare Zilliz Cloud, Pinecone, and turbopuffer with VDBBench cost-aware vector database benchmarks across latency, freshness, multitenancy, and cold starts.

Vector Databases vs. Key-Value Databases
Use a vector database for AI-powered similarity search; use a key-value database for high-throughput, low-latency simple data lookups.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



