Milvus-Metadatenfilterung: JSON- und Metadatenfilterung in Milvus
JSON, oder JavaScript Object Notation, ist ein flexibles Datenformat für Speicherung und Übertragung. Es verwendet Schlüssel-Wert-Paare adaptiv und ist damit perfekt für NoSQL-Datenbanken und API-Ergebnisse. Aufgrund seiner Flexibilität ist es ein beliebtes Datenformat. Suchparameter sind entscheidend, um die Einzelheiten jeder Suchanfrage zu definieren, wie die verwendeten Vektorfelder, die Abfragevektoren und die Begrenzungen für die Anzahl der zurückgegebenen Ergebnisse.
Viele Milvus-Demos beginnen mit Rohtextdaten, wie .txt-, .pdf- oder .csv-Dateitypen. Aber wussten Sie, dass Sie mit Milvus rohes JSON hochladen und damit arbeiten können? Weitere Details finden Sie auf dieser JSON-Dokumentationsseite.
Milvus Client ist ein Wrapper um das Milvus-Collection-Objekt, der ein flexibles JSON-Format „key”:value verwendet, um schemalose Datendefinitionen zu ermöglichen. Weitere Informationen finden Sie in der Milvus Client-Dokumentation.
Der schemalose Milvus Client und Zilliz’ kostenlose Cloud-Stufe sind eine großartige Möglichkeit, Milvus schnell zu nutzen! Milvus Client ist nahezu so schnell wie das vorherige Definieren eines vollständigen Schemas, jedoch mit weniger fehleranfälliger Programmierung. Im Vergleich zu „enable_dynamic_field“ ist Milvus Client viel schneller und bietet einen reibungsloseren Ansatz, um im Voraus weniger Schemadefinition zu verwenden. Das schemalose Schema ist:
- id (str): Name des Primärschlüsselfelds.
- vector (str): Name des Vektorfelds.
Das war’s! Die übrigen Felder können flexibel bestimmt werden, wenn die Daten in Milvus eingefügt werden.
Um dies konkreter zu machen, springen wir in einige Codebeispiele zur Verwendung von Milvus Client. Der vollständige Code befindet sich in meinem Bootcamp github repo.
Codebeispiel – rohe JSON-Daten direkt in Milvus hochladen
Die Rohdaten selbst könnten im JSON-Format vorliegen. Dies ist beispielsweise nützlich, wenn Ihre Daten aus einer NoSQL-Datenbank wie MongoDB stammen. Die unten verwendeten JSON-Daten sind die IMDB-Filmgenre-Klassifikation von 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))
Starten Sie einen kostenlosen Testserver in der Zilliz Cloud. Sie können während einer kostenlosen Testphase bis zu 2 Collections haben, jeweils mit bis zu 1 Million Vektoren. Der Code in diesem Notebook verwendet vollständig verwal
- Wählen Sie die standardmäßige Option "Starter", wenn Sie provisionieren > Create collection > Geben Sie ihr einen Namen > Create cluster and collection.
- Kopieren Sie auf der Cluster-Hauptseite Ihren
API Keyund speichern Sie ihn lokal in einer .env-Variablen ‘ZILLIZ_API_KEY’. - Kopieren Sie ebenfalls auf der Cluster-Hauptseite die
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()}")
Wählen Sie ein Einbettungsmodell. Unten habe ich eines von HuggingFace ausgewählt. Ich führe dies auf meinem Laptop aus, daher muss ich sicherstellen, dass DEVICE=cpu ist.
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}")
Importieren Sie MilvusClient und erstellen Sie die Collection. Beachten Sie, dass wir kein Schema angeben müssen! Außerdem können Sie einfach unseren systemeigenen Standardindex namens AUTOINDEX verwenden. Bei Open Source und Free Tier ist der Standard HNSW. In der kostenpflichtigen Zilliz Cloud wird AUTOINDEX mithilfe proprietärer Indizes weiter optimiert.
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))
Eine einfache Chunking-Strategie besteht darin, das Feld „text“ als einzelnen Chunk beizubehalten, sofern es nicht länger als 512 Zeichen ist. Unten sehen wir, dass das Textfeld der JSON-Daten ziemlich kurz war. Keine Zeilen mussten in kleinere Chunks aufgeteilt werden.
# 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))
Jetzt, da wir Text-Chunks, Vektor-Embeddings für jeden Text-Chunk und alle ursprünglichen Metadaten haben, fügen wir diese Daten in die Milvus-Vektordatenbank ein.
# 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")
Stellen wir eine Frage und rufen Antworten aus unseren Filmdaten ab.
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")
Suchzeit
Wenn wir die Top-2-Ergebnisse durchlaufen, sehen wir Folgendes.
Das sieht ziemlich gut aus. Aber was, wenn wir eine Metadatenfilterung auf dem JSON-Array „Genres“ durchführen möchten?
Metadatenfilterung über JSON-Felder und JSON-Arrays hinweg
Eine neue Funktion in Milvus 2.3 ist die Möglichkeit, rohe JSON-Metadaten zu filtern. Im Folgenden zeige ich ein Beispiel für die Metadatenfilterung mit einem Feld und einem Array.
Nehmen wir an, ich möchte ältere, eher Retro-Filme und ausschließlich das Sci-Fi-Genre sehen.
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")
Wenn man die Top-2-Ergebnisse durchläuft, haben sich die Filmempfehlungen nun geändert, sodass sie dem Filter entsprechen.
Viele Milvus-Demos beginnen mit Rohtextdaten wie .txt-, .pdf- oder .csv-Dateitypen. Diesmal haben wir gesehen, wie man JSON-Daten direkt in eine Milvus-Vektordatenbank-Collection lädt. Außerdem haben wir gesehen, wie man die praktische Metadatenfilterung für JSON-Felder und die json_contains()-Filterung für JSON-Array-Datentypen verwendet. Den vollständigen Code für diesen Blogartikel finden Sie in meinem Bootcamp GitHub-Repo.
Einführung in die Hybridsuche
Hybridsuche ist eine leistungsstarke Funktion in Milvus, mit der Benutzer mehrere Vektorfelder in einer einzigen Suche kombinieren können. Diese Funktion ist besonders nützlich in komplexen Suchszenarien, in denen eine Entität durch mehrere, unterschiedliche Vektoren dargestellt werden kann. Durch die Integration der Ergebnisse mehrerer Vektorsuchen mithilfe von Reranking-Strategien ermöglicht die Hybridsuche den Benutzern, eine höhere Genauigkeit und relevantere Ergebnisse zu erzielen.
In Milvus kann die Hybridsuche verwendet werden, um verschiedene Datentypen wie Text, Bilder und Audio in einer einzigen Suchanfrage zu kombinieren. Dies ermöglicht es Benutzern, umfassendere Suchen durchzuführen und relevantere Ergebnisse abzurufen. Beispielsweise kann eine Hybridsuche Text-Embeddings mit Bild-Embeddings kombinieren, um Produkte zu finden, die sowohl zu einer textuellen Beschreibung als auch zu einem visuellen Beispiel passen.
Um die Hybridsuche in Milvus effektiv zu nutzen, ist es wichtig, die verschiedenen Vektorfelder zu verstehen und zu wissen, wie sie kombiniert werden können. Durch die sorgfältige Auswahl und Kombination von Vektorfeldern können Benutzer die Genauigkeit und Relevanz ihrer Suchergebnisse verbessern. Darüber hinaus kann die Verwendung von Reranking-Strategien dazu beitragen, die Suchergebnisse weiter zu verfeinern und sicherzustellen, dass die relevantesten Ergebnisse zurückgegeben werden.
Datenverwaltung mit Metadaten
Metadaten spielen eine entscheidende Rolle bei der Datenverwaltung in Milvus. Metadaten werden verwendet, um die Struktur und Organisation von Daten zu beschreiben, wodurch sie leichter zu suchen, zu filtern und zu analysieren sind. In Milvus werden Metadaten verwendet, um Datendateien zu verwalten, einschließlich Informationen über die Daten, wie den Collection-Namen, das Vektorfeld und den Indextyp.
Durch die effektive Nutzung von Metadaten können Benutzer die Leistung und Genauigkeit ihrer Suchen verbessern. Metadaten ermöglichen es Benutzern, ihre Daten so zu organisieren, dass sie leicht abgerufen und analysiert werden können. Beispielsweise können Benutzer durch die Verwendung von Metadaten zum Markieren von Daten mit relevanten Schlüsselwörtern schnell nach bestimmten Datenpunkten filtern und suchen.
Neben der Verbesserung der Suchleistung können Metadaten auch dazu beitragen, die Datenintegrität und -konsistenz sicherzustellen. Durch die Verwendung von Metadaten zur Nachverfolgung von Änderungen und Aktualisierungen an Daten können Benutzer sicherstellen, dass ihre Daten korrekt und aktuell bleiben. Dies ist besonders wichtig in großen Datenumgebungen, in denen Daten ständig aktualisiert und geändert werden.
JSON und Metadatenfilterung
JSON (JavaScript Object Notation) ist ein flexibles Datenformat, das häufig in NoSQL-Datenbanken und API-Ergebnissen verwendet wird. Milvus unterstützt das Hochladen und Arbeiten mit rohen JSON-Daten, wodurch die Integration mit anderen Systemen erleichtert wird. Metadatenfilterung ist eine leistungsstarke Funktion in Milvus, mit der Benutzer rohe JSON-Metadaten basierend auf bestimmten Bedingungen filtern können.
Durch die Verwendung von Metadatenfilterung können Benutzer die Genauigkeit ihrer Suchen verbessern und die Menge irrelevanter Daten reduzieren. Beispielsweise können Benutzer JSON-Daten basierend auf bestimmten Feldern oder Werten filtern, etwa Filme nach Genre oder Erscheinungsjahr. Dadurch können Benutzer gezieltere Suchen durchführen und relevantere Ergebnisse abrufen.
In Milvus kann Metadatenfilterung in Kombination mit Vektorsuche verwendet werden, um Suchergebnisse weiter zu verfeinern. Durch das Anwenden von Metadatenfiltern auf Vektorsuchabfragen können Benutzer sicherstellen, dass nur die relevantesten Daten zurückgegeben werden. Dies kann dazu beitragen, die Suchgenauigkeit zu verbessern und die Menge irrelevanter Daten zu reduzieren, die verarbeitet werden müssen.
Erstellen und Verwalten von Indizes für die Vektorsuche
Der Indexaufbau ist ein entscheidender Schritt zur Optimierung der Vektorsuchleistung in Milvus. Ein Index ist eine Datenstruktur, die die Geschwindigkeit des Datenabrufs verbessert, indem sie der Datenbank ermöglicht, bestimmte Daten schnell zu lokalisieren. In Milvus können Indizes auf Vektorfeldern erstellt werden, um die Leistung von Vektorsuchen zu verbessern.
In Milvus sind verschiedene Arten von Indizes verfügbar, jeweils mit eigenen Vorteilen und Anwendungsfällen. Beispielsweise wird der HNSW-Index (Hierarchical Navigable Small World) aufgrund seiner Effizienz und Genauigkeit häufig für hochdimensionale Vektorsuchen verwendet. Andere Indextypen wie IVF (Inverted File) und PQ (Product Quantization) bieten unterschiedliche Kompromisse zwischen Suchgeschwindigkeit und Genauigkeit.
Um Indizes effektiv zu erstellen und zu verwalten, ist es wichtig, die Eigenschaften der Daten und die spezifischen Suchanforderungen zu verstehen. Durch die Auswahl des geeigneten Indextyps und die Abstimmung der Indexparameter können Benutzer die Leistung ihrer Suchen erheblich verbessern. Darüber hinaus kann die regelmäßige Aktualisierung und Pflege von Indizes dazu beitragen, sicherzustellen, dass die Suchleistung optimal bleibt, während sich die Daten weiterentwickeln.
Optimierung der Hybrid-Suchleistung
Die Hybrid-Suchleistung kann durch den Einsatz verschiedener Techniken optimiert werden, darunter Indexaufbau, Metadatenfilterung und Abfrageoptimierung. Durch das Erstellen von Indizes auf Vektor-Feldern können Benutzer die Leistung von Vektorsuchen verbessern. Indizes ermöglichen es der Datenbank, relevante Daten schnell zu lokalisieren, wodurch die für die Durchführung von Suchen erforderliche Zeit reduziert wird.
Metadatenfilterung ist eine weitere wichtige Technik zur Optimierung der Hybrid-Suchleistung. Durch die Verwendung von Metadatenfiltern können Benutzer die Menge irrelevanter Daten reduzieren, die verarbeitet werden müssen, und so Suchgenauigkeit und -geschwindigkeit verbessern. Beispielsweise kann das Filtern von Daten basierend auf bestimmten Feldern oder Werten dazu beitragen, die Suchergebnisse einzugrenzen und sicherzustellen, dass nur die relevantesten Daten zurückgegeben werden.
Abfrageoptimierung ist ebenfalls entscheidend für die Verbesserung der Hybrid-Suchleistung. Durch die Optimierung der Struktur und Parameter von Suchabfragen können Benutzer die für Suchen erforderlichen Rechenressourcen reduzieren und die Leistung verbessern. Dies kann Techniken wie das Bündeln von Abfragen, die Verwendung effizienter Datenstrukturen und die Abstimmung von Abfrageparametern umfassen.
In diesem Abschnitt haben wir Best Practices zur Optimierung der Hybrid-Suchleistung in Milvus besprochen. Durch die Verwendung von Techniken wie Indexaufbau, Metadatenfilterung und Abfrageoptimierung können Benutzer die Genauigkeit und Geschwindigkeit ihrer Suchen verbessern und sicherstellen, dass sie die relevantesten Ergebnisse abrufen.
Weiterlesen

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

The Real Bottlenecks in Autonomous Driving — And How AI Infrastructure Can Solve Them
Autonomous driving faces a data bottleneck. Learn how AI-native vector databases like Zilliz solve scale, cost, and insight challenges across AV pipelines.

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.



