Erste Schritte mit Milvus Hybrid Search
Mit der Veröffentlichung von Milvus 2.4 haben wir die Multi-Vektorsuche und die Möglichkeit der Hybridsuche (Multi-Vektorsuche) eingeführt. Diese neue Funktionalität verbessert die Art und Weise, wie wir Daten suchen und analysieren können, indem sie es den Nutzern ermöglicht, eine hybride Suche durchzuführen, gleichzeitige Abfragen über mehrere Vektorfelder hinweg durchzuführen und die Ergebnisse mit Strategien zur Neueinstufung zu integrieren.
Bei der hybriden Suche, die oft auch als Multivektorsuche bezeichnet wird, werden Suchanfragen über verschiedene Vektorfelder innerhalb desselben Datensatzes durchgeführt. Diese Vektoren können unterschiedliche Facetten von Daten darstellen, verschiedene [Einbettungsmodelle] (https://zilliz.com/blog/choosing-the-right-embedding-model-for-your-data) verwenden oder verschiedene Datenverarbeitungsmethoden einsetzen und die Ergebnisse mit [Re-Rankern] (https://zilliz.com/learn/optimize-rag-with-rerankers-the-role-and-tradeoffs) kombinieren.
In diesem Tutorial lernen Sie, wie Sie die hybriden Suchfunktionen von Milvus 2.4 nutzen können, um Ihre Suche zu verbessern. Wir werden behandeln:
Erstellen von Sparse Embeddings
Dense Einbettungen erstellen
Indizieren Sie Ihre Daten in Milvus
Durchführen einer Multi-Vektorsuche mit derselben Sammlung.
In diesem Tutorial wird der eSci-Datensatz verwendet, ein umfassender Produktsuchdatensatz von Amazon. Zusätzlich verwenden wir das BGE-M3 Modell über die pymilvus[models]-Bibliothek, die es einfacher macht, eine direkte Einbettung in Milvus zu erzeugen.
Einführung in die hybride Suche
Die hybride Suche ist eine leistungsstarke Technik, die die Stärken von spärlichen und dichten Suchmethoden kombiniert, um die Suchergebnisse zu verbessern. Herkömmliche spärliche Suchmethoden sind zwar in bestimmten Szenarien effektiv, leiden aber oft unter einer begrenzten Aussagekraft und mangelnder Flexibilität. Die hybride Suche behebt diese Einschränkungen, indem sie sparse und dense Retrieval-Methoden miteinander verbindet und so genauere und effizientere Suchergebnisse ermöglicht.
Durch die Nutzung der sich ergänzenden Stärken von spärlichen und dichten Vektoren kann die hybride Suche sowohl die genauen Übereinstimmungen als auch die semantischen Nuancen der Daten erfassen. Das Ergebnis ist ein umfassenderes und präziseres Sucherlebnis. Unabhängig davon, ob es sich um Texte, Bilder oder andere Datentypen handelt, kann die hybride Suche die Relevanz und Qualität Ihrer Suchergebnisse erheblich verbessern.
Vektorsuche verstehen
Die Vektorsuche ist eine Art der Suche, die Vektoren zur Darstellung von Daten verwendet. Vektoren sind mathematische Darstellungen, die das Wesentliche von Datenpunkten erfassen und die Berechnung von Ähnlichkeiten zwischen ihnen ermöglichen. Bei der Vektorsuche werden sowohl die Daten als auch die Suchanfragen in Vektoren umgewandelt. Die Ähnlichkeit zwischen dem Abfragevektor und den Datenvektoren wird dann berechnet, und die ähnlichsten Datenpunkte werden als Suchergebnisse zurückgegeben.
Dieser Ansatz ist besonders nützlich für die Suche in großen Datenbeständen, da er eine effiziente und skalierbare Suche nach relevanten Informationen ermöglicht. Die Vektorsuche kann in verschiedenen Bereichen eingesetzt werden, z. B. bei der Bild- und Textsuche, wo sie sich durch das Auffinden [semantisch ähnlicher] (https://zilliz.com/glossary/semantic-similarity) Elemente auszeichnet. Durch die Nutzung der Leistungsfähigkeit von Vektoren können Sie genauere und aussagekräftigere Suchergebnisse erzielen.
Installieren und importieren Sie die benötigten Bibliotheken und erstellen Sie Indizes.
! pip install pymilvus[model] datasets
importiere pandas als pd
from datasets import load_dataset
von pymilvus importieren (
FieldSchema,
CollectionSchema,
DataType,
Sammlung,
AnnSearchRequest,
RRFRanker,
Verbindungen,
)
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
Bereiten Sie den Datensatz vor
Der ESCI-Datensatz ist für das semantische Matching von Abfragen und Produkten konzipiert. In diesem Abschnitt werden wir den ESCI-Datensatz vorbereiten. Wir werden uns darauf konzentrieren, eine Teilmenge der Daten auszuwählen und sicherzustellen, dass sie sauber und bereit für die Verarbeitung sind.
Herunterladen und Auswählen einer Teilmenge
dataset = load_dataset("tasksource/esci", split="train")
datensatz = datensatz.select(bereich(500))
datensatz = datensatz.filter(lambda x: x["product_locale"] == "us")
dataset
Bereinigen der Daten
Die Bereinigung des Datensatzes ist wichtig, um schlechte Suchergebnisse aufgrund von Duplikaten oder fehlenden Informationen zu vermeiden.
source_df = dataset.to_pandas()
df = source_df.drop_duplicates(
subset=["produkt_text", "produkt_titel", "produkt_aufzählungspunkt", "produkt_marke"]
)
# Zeilen mit fehlenden Werten löschen
df = df.dropna(
subset=["product_text", "product_title", "product_bullet_point", "product_brand"]
)
df.head()
Hier ist ein kurzer Blick auf die Daten:
example_id query query_id product_id product_locale esci_label small_version large_version product_title product_description product_bullet_point product_brand product_color product_text
0 0 revent 80 cfm 0 B000MOO21W us Irrelevant 0 1 Panasonic FV-20VQ3 WhisperCeiling 190 CFM Deckenventilator... Keine WhisperCeiling-Ventilatoren verfügen über ein völlig geschlossenes... Panasonic Weiß Panasonic FV-20VQ3 WhisperCeiling 190 CFM Deckenventilator...
2 1 revent 80 cfm 0 B07X3Y6B1V us Exact 0 1 Homewerks 7141-80 Badezimmerventilator Integrierte LED ... Keine AUSGEZEICHNETE LEISTUNG: Dieser Homewerks Badlüfter ... Homewerks 80 CFM Homewerks 7141-80 Badventilator Integrierte LED ...
3 2 revent 80 cfm 0 B07WDM7MQQ us Exact 0 1 Homewerks 7140-80 Badventilator Deckenmontage E... Keine AUSGEZEICHNETE LEISTUNG: Dieser Homewerks Badventilator ... Homewerks Weiß Homewerks 7140-80 Badventilator Deckenmontage E...
4 3 revent 80 cfm 0 B07RH6Z8KW us Exact 0 1 Delta Electronics RAD80L BreezRadiance 80 CFM ... Dieses gebrauchte oder überholte Produkt wurde... Leiser Betrieb mit 1,5 Sone\nEingebaute Thermos... DELTA ELECTRONICS (AMERICAS) LTD. Weiß Delta Electronics RAD80L BreezRadiance 80 CFM ...
5 4 revent 80 cfm 0 B07QJ7WYFQ us Exact 0 1 Panasonic FV-08VRE2 Lüftungsventilator mit Reces... Keine Die Designlösung für Ventilator/Licht-Kombinationen... Panasonic Weiß Panasonic FV-08VRE2 Lüftungsventilator mit Rücklauf...
Mit dem nun vorbereiteten und bereinigten Datensatz können wir [Vektoreinbettungen] (https://zilliz.com/glossary/vector-embeddings) generieren und [in Milvus indizieren] (https://zilliz.com/blog/Milvus-Index-Types-Supported) für unsere hybride Suche.
Generierung von Vektoreinbettungen mit BGE-M3
Sobald Ihre Daten sauber und bereit sind, besteht der nächste Schritt darin, Vektoreinbettungen zu erzeugen. Wir verwenden das BGE-M3 Einbettungsmodell, um die rohen Textdaten in numerische Vektoren umzuwandeln, die die Milvus-Vektordatenbank indizieren und effektiv durchsuchen kann.
Textdaten zusammenführen
Zunächst werden die verschiedenen Textfelder, die mit jedem Produkt verbunden sind, zu einer einheitlichen Textvektordarstellung zusammengefügt. Auf diese Weise können alle relevanten Informationen über das Produkt in einem einzigen Vektor erfasst werden:
df["merged_text"] = df["product_title"] + "\n" + df["product_text"] + "\n" + df["product_bullet_point"]
docs = df["merged_text"].to_list()
Erzeugen von Einbettungen
ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
dense_dim = ef.dim["dense"]
docs_embeddings = ef(docs)
query = "Haben Sie ein Beispiel für ein Panasonic-Produkt?"
abfrage_einbettungen = ef([abfrage])
Einrichten Ihrer Milvus-Sammlung
Nach der Erzeugung von Einbettungen besteht der nächste Schritt darin, diese Vektoren in Milvus zu speichern, indem eine Sammlung erstellt wird, die sowohl dünn besetzte als auch [dichte Vektoren] verarbeiten kann (https://zilliz.com/learn/sparse-and-dense-embeddings).
Verbindung zu Milvus herstellen
Beginnen Sie damit, eine Verbindung zu Ihrem Milvus Server herzustellen:
from pymilvus importiert Verbindungen
connections.connect()
Definieren Sie Ihr Sammelschema
fields = [
# Automatisch generierte ID als Primärschlüssel verwenden
FieldSchema(
name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=8192),
FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
]
schema = CollectionSchema(fields, "")
col = Sammlung("sparse_dense_demo", schema)
Indizes für Vektoren erstellen
sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
dense_index = {"index_type": "FLAT", "metric_type": "COSINE"}
col.create_index("sparse_vector", sparse_index)
col.create_index("dichter_Vektor", dichter_index)
Einfügen der Daten in die Sammlung
entities = [
docs,
docs_embeddings["sparse"],
docs_embeddings["dense"],
]
col.insert(entities)
Ausführen hybrider Suchen in Milvus
Sobald Ihre Milvus-Sammlung mit den erforderlichen Daten und Indizes vorbereitet ist, können wir hybride Suchen durchführen. Dieser Schritt verwendet sowohl Sparse- als auch Dense-Vektoren, um die Sammlung abzufragen und die Ergebnisse mithilfe eines Re-Rankers zu verfeinern.
def query_hybrid_search(query: str):
query_embeddings = ef([query])
sparse_req = AnnSearchRequest(
query_embeddings["sparse"], "sparse_vector", {"metric_type": "IP"}, limit=2
)
dense_req = AnnSearchRequest(
query_embeddings["dense"], "dense_vector", {"metric_type": "COSINE"}, limit=2
)
res = col.hybrid_search(
[sparse_req, dense_req], rerank=RRFRanker(), limit=2, output_fields=["text"]
)
return res
Diese Funktion erzeugt Einbettungen für eine Eingabeanfrage. Sie konstruiert dann zwei "AnnSearchRequest"-Objekte für die spärlichen und dichten Vektoren, wobei sie den Typ der zu verwendenden Ähnlichkeitsmetrik angibt (IP für inneres Produkt und COSINE für Kosinusähnlichkeit). Die Methode hybrid_search** kombiniert die Ergebnisse aus beiden Vektoren mit Hilfe eines RRFRanker, der die kombinierten Ergebnisse neu ordnet, um die relevantesten Übereinstimmungen zu priorisieren.
Beispiel für eine Vektorsuche
Um diese Funktion in Aktion zu sehen, führen wir eine hybride Suche mit einer praktischen Abfrage durch:
query_hybrid_search("Haben Sie ein Produkt von Homewerks?")[0]
Ausgabe
['id: 449353344520491318, distance: 0.032786883413791656, entity: {\'text\': "Homewerks 7141-80 Bad-Ventilator Integrierte LED-Leuchte Deckenmontage Abluft, 1,1 Sone, 80 CFM\\nHomewerks 7141-80 Bad-Ventilator Integrierte LED-Leuchte Deckenmontage Abluft, 1,1 Sone, 80 CFM\\nHomewerks\n80 CFM\nNone\\nÜBERZEUGENDE LEISTUNG: Dieser Bad-Ventilator von Homewerks sorgt für Komfort in Ihrem Zuhause, indem er leise Feuchtigkeit und Nässe im Badezimmer beseitigt. Dieser Abluftventilator hat eine Leistung von 1,1 Sone bei 80 CFM, was bedeutet, dass er Räume von bis zu 80 Quadratmetern bewältigen kann und dabei sehr leise ist...\\nBADVENTILATOREN HILFEN HARSCHEN GERUCH ZU ENTFERNEN: Bei der Reinigung des Badezimmers oder der Toilette werden scharfe Chemikalien verwendet, die einen unangenehmen Geruch hinterlassen können. Die Badventilatoren von Homewerk können mit ihrer starken Belüftung dazu beitragen, diesen Geruch zu beseitigen ...]
Hybride Suche vs. einfache Vektorähnlichkeitssuche
Die Verwendung von nur dichten Einbettungen anstelle einer Mischung aus spärlichen und dichten Einbettungen kann bei Abfragen, die von exakten Schlüsselwortübereinstimmungen oder kategorialen Datenunterscheidungen abhängen, mit denen [spärliche Einbettungen] (https://zilliz.com/learn/enhancing-information-retrieval-learned-sparse-embeddings) gut umgehen können, zu Problemen führen.
Zum Beispiel, wenn man nach einem sehr spezifischen Attribut sucht, wie "Versand inklusive". Dense Embeddings könnten eine breite Palette von Dingen abrufen, die mit den Hauptschlüsselwörtern zusammenhängen, wie z. B. den Produkttyp oder die Marke, aber den entscheidenden Aspekt "Versand inklusive" übersehen.
Vergleichen wir die Verwendung einer hybriden Vektorsuchmaschine mit der Verwendung einer einfachen Vektorsuche mit dichten Einbettungen:
def query_dense_search(query: str):
query_embeddings = ef([query])
search_param = {
"daten": abfrage_einbettungen["dichte"],
"anns_field": "dense_vector",
"param": {"metric_type": "COSINE"},
"limit": 2,
"output_fields": ["text"],
}
res_dense = col.search(**search_param)
return res_dense
> query_dense_search("inklusive Versand")
[
{
"id": "449353344520491390",
"distance": 0.5341320037841797,
"Einheit": {
"text": "BAZIC Self Seal White Envelope 3 5/8" x 6 1/2" #6, No Window Mailing Envelopes, Peel & Seal Mailer for Business Invoice Check (100/Pack), 1-PacknBAZIC Self Seal White Envelope 3 5/8" x 6 1/2" #6, No Window Mailing Envelopes, Peel & Seal Mailer for Business Invoice Check (100/Pack), 1-PacknBAZIC Productsn#6 3/4 (100-count)n<p><strong>Zurück zu BAZIC</strong></p> <p>Unser Ziel ist es, jedem Kunden langlebiges Material zu einem erschwinglichen Preis zu bieten. Seit 1998 haben wir dieses Versprechen gehalten und werden uns jedes Jahr weiter verbessern. Wir haben unsere Marke auf Integrität und Qualität aufgebaut, so dass unsere Kunden genau wissen, was sie erwarten können.</p> <p><strong>VERPFLICHTET DEN WERTEN</strong></p> <p>Wir sind ein werteorientiertes Unternehmen, das sich von den Grundsätzen der Exzellenz durch starkes Produktdesign zu niedrigen Kosten leiten lässt. Unser Engagement für diese Werte spiegelt sich in unserem Bestreben wider, bestehende Produkte zu verbessern und neue, interessante Produkte für unsere Kunden zu entwickeln. Wir leben von Phantasie, Leidenschaft und Führungsstärke. Wir haben großartige Produkte und werden auch weiterhin mit den Erwartungen unserer Kunden wachsen.</p> <p><strong>Erfolg basiert auf Zufriedenheit</strong></p> <p>Hauptsitz in Los Angeles, Kalifornien, Vereinigte Staaten. Bei jedem Produkt, das wir verschicken, erwarten wir eine 100%ige Kundenzufriedenheit. Unser Erfolg beruht auf der individuellen Erfüllung der Kundenwünsche. Wir stellen Produkte her, die man gerne weiterempfiehlt.</p>n#6-3/4 SELF-SEAL WHITE ENVELOPES. Diese selbstschließenden Umschläge im Format 3 5/8" x 6 1/2" inch sind so konzipiert, dass Sie Zeit und Geld sparen. Sie helfen Ihnen, Ihre Sendungen in Rekordzeit zu erledigen.nSICHER. Einfach abziehen und versiegeln, um eine starke, dauerhafte Versiegelung ohne Ablecken oder Befeuchten zu erreichen. Unser Selbstverschlusssystem ist schnell und einfach und hält garantiert dicht, ohne dass Sie Klebeband oder Klebestifte benötigen.nFENSTERLOSES DESIGN. Briefumschläge mit fensterloser Vorderseite zum einfachen Bedrucken, Beschriften oder manuellen Adressieren, perfekt für schnelle Geschäftssendungen in großen Mengen. nWHITE 20LB STOCK. Diese weißen Standardumschläge sind aus schwerem, strapazierfähigem 20-Pfund-Papier gefertigt und eignen sich perfekt für den täglichen Geschäftsgebrauch. nMULTI-PURPOSE. In diese Umschläge passen problemlos Rechnungen, Briefe, Schecks, Geschenkkarten usw. Diese Umschläge können für praktisch alles verwendet werden, wofür Sie sie brauchen!"
}
},
Dasselbe gilt für die hybride Suche
> query_hybrid_search("inklusive Versand")
[
{
"id": "449353344520491358",
"distance": 0.016393441706895828,
"Einheit": {
"text": "ASURION 4 Year Home Improvement Protection Plan $20-29.99nASURION 4 Year Home Improvement Protection Plan $20-29.99nASURIONnNonenAsurion nimmt das Rätselraten aus der Suche nach Produktschutzplänen, die Ihren Bedürfnissen entsprechen. Produkte gehen kaputt - oft zu einem sehr ungünstigen Zeitpunkt. Gut, dass Sie abgesichert sind, denn kein anderer Plan kann Ihre Produkte so schützen wie ein Asurion-Schutzplan. Einfach ausgedrückt: Die Asurion-Schutzpläne decken Ihre Produkte ab, wenn Sie sie am dringendsten benötigen, und das mit einem schnellen und einfachen Schadenersatzverfahren. Kaufen Sie einen Schutzplan von einem Unternehmen, das Sie kennen und dem Sie vertrauen. Legen Sie noch heute einen Asurion-Schutzplan in Ihren Warenkorb! Detaillierte Bedingungen für diesen Plan finden Sie im "Benutzerhandbuch [pdf]" weiter unten.n KEINE ZUSÄTZLICHEN KOSTEN: Sie zahlen 0 $ für Reparaturen - Teile, Arbeit und Versand inbegriffen.n
}
}
]
Hier sehen wir, dass eine hybride Suche ein Produkt finden kann, in dem "Versand" enthalten ist, wohingegen dichte Einbettungen eher zu einem Ergebnis führen, bei dem man etwas versenden kann.
Schlussfolgerung
In diesem Tutorial haben wir eine neue Fähigkeit von Milvus 2.4 erkundet, nämlich die hybride Suche, die eine Vektorsuche über verschiedene Arten von Dateneinbettungen ermöglicht.
Schauen Sie sich [Milvus] (https://github.com/milvus-io/milvus) und den Code auf [Github] (https://github.com/stephen37/ollama_local_rag) an, und teilen Sie Ihre Erfahrungen mit der Community, indem Sie unserem [Discord] (https://discord.gg/FG6hMJStWu) beitreten.
Durchführung einer hybriden Suche
Bei der Durchführung einer hybriden Suche werden sparse und dense Retrieval-Methoden kombiniert, um die Suchergebnisse zu verbessern. Der Prozess umfasst in der Regel die folgenden Schritte:
Datenvorbereitung: Aufbereitung der Daten durch Konvertierung in Vektoren. Dies kann mit Hilfe verschiedener Techniken geschehen, wie z. B. Worteinbettungen für Textdaten oder Bildeinbettungen für Bilddaten. Durch die Umwandlung der Rohdaten in numerische Vektoren ermöglichen Sie eine effiziente Indizierung und Abfrage.
Erstellen von Indizes: Erstellen Sie Indizes für die Datenvektoren. Indizes sind Datenstrukturen, die ein schnelles Nachschlagen und Abrufen von Daten ermöglichen. In Milvus können Sie Indizes sowohl für spärliche als auch für dichte Vektoren erstellen, um sicherzustellen, dass Ihre Suchanfragen schnell und präzise verarbeitet werden können.
Hybride Suche durchführen: Führen Sie eine hybride Suche durch, indem Sie sparse und dense Retrievalmethoden kombinieren. Techniken wie die reziproke Rangfusion können verwendet werden, um die Ergebnisse beider Suchmethoden zusammenzuführen und ein endgültiges Ranking zu erstellen, das ein Gleichgewicht zwischen Präzision und Recall herstellt. Dieser Schritt ist entscheidend, um die Stärken von spärlichen und dichten Vektoren zu nutzen.
Ergebnisse abrufen: Abrufen der Suchergebnisse auf der Grundlage des endgültigen Rankings. Die Suchergebnisse können mit verschiedenen Techniken, wie z. B. der Attributfilterung, weiter gefiltert und verfeinert werden. Dadurch wird sichergestellt, dass dem Nutzer die relevantesten und hochwertigsten Ergebnisse präsentiert werden.
Die hybride Suche bietet mehrere Vorteile, darunter bessere Suchergebnisse, höhere Effizienz und Flexibilität. Sie kann für verschiedene Anwendungen wie die Bild- und Textsuche verwendet werden und lässt sich mit verschiedenen Techniken wie der reziproken Rangfusion und vektorbasierten Methoden umsetzen. Durch die Durchführung einer hybriden Suche können Sie eine umfassendere und genauere Sucherfahrung erzielen, die auf die spezifischen Anforderungen Ihrer Anwendung zugeschnitten ist.
Weiterlesen

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.
