Allgemeine Architektur
Mit dem explosionsartigen Wachstum des Internet-Datenvolumens steigen einerseits die Produktmenge und die Produktkategorien auf den gängigen E-Commerce-Plattformen, andererseits wird es für die Benutzer immer schwieriger, die gewünschten Produkte zu finden.
Vipshop ist ein führender Online-Discounter für Markenartikel in China. Das Unternehmen bietet Verbrauchern in ganz China hochwertige und beliebte Markenprodukte zu einem erheblichen Preisnachlass gegenüber den Einzelhandelspreisen an. Um das Einkaufserlebnis für seine Kunden zu optimieren, beschloss das Unternehmen, ein personalisiertes Suchempfehlungssystem zu entwickeln, das auf den Schlüsselwörtern der Benutzeranfrage und den Benutzerporträts basiert.
Die Kernfunktion des E-Commerce-Suchempfehlungssystems besteht darin, aus einer großen Anzahl von Produkten geeignete Produkte zu finden und sie den Nutzern entsprechend ihrer Suchabsicht und Präferenz anzuzeigen. In diesem Prozess muss das System die Ähnlichkeit zwischen den Produkten und den Suchintentionen und -präferenzen der Benutzer berechnen und den Benutzern die TopK-Produkte mit der höchsten Ähnlichkeit empfehlen.
Daten wie Produktinformationen, Suchabsichten und Präferenzen der Nutzer sind allesamt unstrukturierte Daten. Wir haben versucht, die Ähnlichkeit solcher Daten mit CosineSimilarity(7.x) der Suchmaschine Elasticsearch (ES) zu berechnen, aber dieser Ansatz hat die folgenden Nachteile
Lange Rechenzeit - die durchschnittliche Latenzzeit für das Abrufen von TopK-Ergebnissen aus Millionen von Einträgen beträgt etwa 300 ms.
Hohe Wartungskosten für ES-Indizes - derselbe Satz von Indizes wird sowohl für Warenmerkmalsvektoren als auch für andere verwandte Daten verwendet, was die Indexerstellung kaum erleichtert, aber eine riesige Datenmenge erzeugt.
Wir haben versucht, unser eigenes lokal sensitives Hash-Plug-in zu entwickeln, um die CosineSimilarity-Berechnung von ES zu beschleunigen. Obwohl die Leistung und der Durchsatz nach der Beschleunigung erheblich verbessert wurden, war die Latenzzeit von 100+ ms immer noch schwierig, um die tatsächlichen Anforderungen an die Online-Produktabfrage zu erfüllen.
Nach einer gründlichen Recherche entschieden wir uns für Milvus, eine Open-Source-Vektordatenbank, die im Vergleich zu der üblicherweise verwendeten eigenständigen Faiss den Vorteil hat, dass sie eine verteilte Bereitstellung, mehrsprachige SDKs und eine Trennung von Lesen und Schreiben unterstützt.
Mithilfe verschiedener Deep-Learning-Modelle wandeln wir massive unstrukturierte Daten in Merkmalsvektoren um und importieren die Vektoren in Milvus. Mit der hervorragenden Leistung von Milvus kann unser E-Commerce-Suchempfehlungssystem effizient die TopK-Vektoren abfragen, die den Zielvektoren ähnlich sind.
Allgemeine Architektur
 Wie im Diagramm dargestellt, besteht die Gesamtarchitektur des Systems aus zwei Hauptteilen.
Schreibprozess: Die durch das Deep-Learning-Modell erzeugten Element-Merkmalsvektoren (im Folgenden als Elementvektoren bezeichnet) werden normalisiert und in MySQL geschrieben. MySQL liest dann die verarbeiteten Item-Merkmalsvektoren mithilfe des Datensynchronisierungstools (ETL) und importiert sie in die Vektordatenbank Milvus.
Lesevorgang: Der Suchdienst erhält die Merkmalsvektoren der Benutzerpräferenzen (im Folgenden als Benutzervektoren bezeichnet) auf der Grundlage der Schlüsselwörter der Benutzerabfrage und der Benutzerporträts, fragt ähnliche Vektoren in Milvus ab und ruft die TopK-Item-Vektoren ab.
Milvus unterstützt sowohl inkrementelle Datenaktualisierungen als auch vollständige Datenaktualisierungen. Bei jeder inkrementellen Aktualisierung wird der vorhandene Objektvektor gelöscht und ein neuer Objektvektor eingefügt, was bedeutet, dass jede neu aktualisierte Sammlung neu indiziert wird. Dies eignet sich besser für ein Szenario mit mehr Lese- und weniger Schreibvorgängen. Daher wählen wir die Methode der vollständigen Datenaktualisierung. Darüber hinaus dauert es nur wenige Minuten, die gesamten Daten in Stapeln von mehreren Partitionen zu schreiben, was einer Aktualisierung nahezu in Echtzeit entspricht.
Die Milvus-Schreibknoten führen alle Schreibvorgänge durch, einschließlich der Erstellung von Datensammlungen, der Erstellung von Indizes, dem Einfügen von Vektoren usw., und bieten der Öffentlichkeit Dienste mit Schreibdomänennamen an. Milvus-Leseknoten führen alle Lesevorgänge durch und stellen der Öffentlichkeit Dienste mit reinen Lese-Domänennamen zur Verfügung.
Während die aktuelle Version von Milvus das Umschalten von Sammlungsaliasen nicht unterstützt, führen wir Redis ein, um nahtlos zwischen mehreren vollständigen Datensammlungen umzuschalten.
Der Leseknoten muss nur vorhandene Metadateninformationen und Vektordaten oder Indizes aus MySQL, Milvus und dem verteilten Dateisystem GlusterFS lesen, so dass die Lesefähigkeit durch den Einsatz mehrerer Instanzen horizontal erweitert werden kann.
Details zur Implementierung
Datenaktualisierung
Der Datenaktualisierungsdienst umfasst nicht nur das Schreiben von Vektordaten, sondern auch die Erkennung des Datenvolumens von Vektoren, den Aufbau von Indizes, das Vorladen von Indizes, die Kontrolle von Aliasen, usw. Der Gesamtprozess sieht wie folgt aus. Prozess
Nehmen wir an, dass SammlungA vor dem Aufbau der gesamten Daten einen Datendienst für die Öffentlichkeit bereitstellt und die gesamten Daten, die verwendet werden, an SammlungA gerichtet werden (
redis key1 = CollectionA
). Der Zweck des Aufbaus der Gesamtdaten ist die Erstellung einer neuen Sammlung CollectionB.Überprüfung der Warendaten - Überprüfung der Positionsnummer der Warendaten in der MySQL-Tabelle, Vergleich der Warendaten mit den vorhandenen Daten in SammlungA. Die Warnung kann nach Menge oder Prozentsatz eingestellt werden. Wenn die eingestellte Menge (Prozentsatz) nicht erreicht wird, werden die gesamten Daten nicht aufgebaut, was als Fehlschlag dieses Aufbauprozesses angesehen wird und den Alarm auslöst; sobald die eingestellte Menge (Prozentsatz) erreicht ist, beginnt der gesamte Datenaufbauprozess.
Start des Aufbaus der gesamten Daten - Initialisierung des Alias der gesamten Daten, die aufgebaut werden, und Aktualisierung von Redis. Nach der Aktualisierung wird der Alias der gesamten Daten, die erstellt werden, an CollectionB (
redis key2 = CollectionB
) weitergeleitet.Erstellen Sie eine neue vollständige Sammlung - stellen Sie fest, ob CollectionB existiert. Wenn ja, löschen Sie sie, bevor Sie eine neue Sammlung erstellen.
Schreiben von Datenstapeln - Berechnen Sie die Partitions-ID der einzelnen Warendaten mit ihrer eigenen ID mithilfe der Modulo-Operation und schreiben Sie die Daten in mehreren Partitionen stapelweise in die neu erstellte Sammlung.
Erstellen und Vorladen des Index - Erstellen eines Index (
createIndex()
) für die neue Sammlung. Die Indexdatei wird auf dem verteilten Speicherserver GlusterFS gespeichert. Das System simuliert automatisch Abfragen auf die neue Sammlung und lädt den Index zum Aufwärmen der Abfrage vor.Überprüfung der Sammlungsdaten - Überprüfung der Anzahl der Daten in der neuen Sammlung, Vergleich der Daten mit der bestehenden Sammlung und Festlegen von Alarmen auf der Grundlage der Menge und des Prozentsatzes. Wenn die eingestellte Anzahl (Prozentsatz) nicht erreicht wird, wird die Sammlung nicht umgestellt und der Erstellungsprozess wird als Fehlschlag betrachtet, wodurch der Alarm ausgelöst wird.
Umschalten der Sammlung - Alias-Kontrolle. Nach der Aktualisierung von Redis wird der gesamte verwendete Datenalias in die SammlungB (
redis key1 = CollectionB
) umgeleitet, der ursprüngliche Redis-Schlüssel2 wird gelöscht, und der Erstellungsprozess ist abgeschlossen.
Datenabruf
Die Milvus-Partitionsdaten werden mehrmals aufgerufen, um die Ähnlichkeit zwischen den Benutzervektoren, die auf der Grundlage der Schlüsselwörter der Benutzerabfrage und des Benutzerporträts ermittelt wurden, und dem Objektvektor zu berechnen. Nach der Zusammenführung werden die TopK-Objektvektoren zurückgegeben. Der gesamte Arbeitsablauf sieht wie folgt aus: workflowIn der folgenden Tabelle sind die wichtigsten an diesem Prozess beteiligten Dienste aufgeführt. Es ist ersichtlich, dass die durchschnittliche Latenzzeit für den Abruf der TopK-Vektoren etwa 30 ms beträgt.
Dienst | Rolle | Eingabe-Parameter | Ausgabe-Parameter | Antwort-Latenzzeit |
---|---|---|---|---|
Erfassung von Benutzervektoren | Abrufen des Benutzervektors | Benutzerinfo + Abfrage | Benutzervektor | 10 ms |
Milvus-Suche | Berechnet die Vektorähnlichkeit und liefert TopK-Ergebnisse | Benutzer-Vektor | Element-Vektor | 10 Sekunden |
Logik der Zeitplanung | Gleichzeitiges Abrufen und Zusammenführen von Ergebnissen | Mehrkanalig abgerufene Item-Vektoren und die Ähnlichkeitsbewertung | TopK-Elemente | 10 Minuten |
Implementierungsprozess:
- Basierend auf den Schlüsselwörtern der Benutzerabfrage und dem Benutzerporträt wird der Benutzervektor durch das Deep-Learning-Modell berechnet.
- Abrufen des Sammlungsalias der gesamten verwendeten Daten aus Redis currentInUseKeyRef und Abrufen von Milvus CollectionName. Bei diesem Prozess handelt es sich um einen Datensynchronisierungsdienst, d. h. der Alias wird nach der Aktualisierung der gesamten Daten auf Redis umgestellt.
- Milvus wird gleichzeitig und asynchron mit dem User-Vektor aufgerufen, um Daten aus verschiedenen Partitionen derselben Sammlung zu erhalten. Milvus berechnet die Ähnlichkeit zwischen dem User-Vektor und dem Item-Vektor und gibt die TopK ähnlichen Item-Vektoren in jeder Partition zurück.
- Die aus jeder Partition zurückgegebenen TopK-Element-Vektoren werden zusammengeführt und die Ergebnisse in umgekehrter Reihenfolge der Ähnlichkeitsdistanz geordnet, die mit dem inneren Produkt von IP berechnet wird (je größer die Distanz zwischen den Vektoren, desto ähnlicher sind sie). Die endgültigen TopK-Item-Vektoren werden zurückgegeben.
Ein Blick in die Zukunft
Gegenwärtig kann die Milvus-basierte Vektorsuche kontinuierlich bei der Suche nach Empfehlungsszenarien eingesetzt werden, und ihre hohe Leistung gibt uns mehr Spielraum bei der Dimensionalität des Modells und der Auswahl des Algorithmus.
Milvus wird eine entscheidende Rolle als Middleware für weitere Szenarien spielen, einschließlich der Erinnerung an die Suche auf der Hauptseite und Empfehlungen für alle Szenarien.
Die drei am meisten erwarteten Funktionen von Milvus für die Zukunft sind folgende
- Logik für das Umschalten von Sammlungsalias - koordinieren Sie das Umschalten zwischen Sammlungen ohne externe Komponenten.
- Filtermechanismus - Milvus v0.11.0 unterstützt den ES DSL-Filtermechanismus nur in der Standalone-Version. Das neu veröffentlichte Milvus 2.0 unterstützt die skalare Filterung und die Trennung von Lesen und Schreiben.
- Speicherunterstützung für Hadoop Distributed File System (HDFS) - Das von uns verwendete Milvus v0.10.6 unterstützt nur die POSIX-Dateischnittstelle, und wir haben GlusterFS mit FUSE-Unterstützung als Speicher-Backend eingesetzt. HDFS ist jedoch in Bezug auf Leistung und einfache Skalierung die bessere Wahl.
Lehren und bewährte Praktiken
- Bei Anwendungen, bei denen Lesevorgänge im Vordergrund stehen, kann eine Lese-Schreib-Trennung die Verarbeitungsleistung erheblich steigern und die Leistung verbessern.
- Dem Milvus-Java-Client fehlt ein Mechanismus zur Wiederherstellung der Verbindung, da der vom Rückrufdienst verwendete Milvus-Client im Speicher resident ist. Wir müssen unseren eigenen Verbindungspool aufbauen, um die Verfügbarkeit der Verbindung zwischen dem Java-Client und dem Server durch Heartbeat-Tests sicherzustellen.
- Gelegentlich treten bei Milvus langsame Abfragen auf. Dies ist auf eine unzureichende Aufwärmphase der neuen Sammlung zurückzuführen. Durch die Simulation der Abfrage auf die neue Sammlung wird die Indexdatei in den Speicher geladen, um das Aufwärmen des Index zu erreichen.
- nlist ist der Indexaufbauparameter und nprobe ist der Abfrageparameter. Sie müssen einen angemessenen Schwellenwert entsprechend Ihrem Geschäftsszenario durch Drucktest-Experimente ermitteln, um ein Gleichgewicht zwischen Abrufleistung und Genauigkeit herzustellen.
- Bei einem Szenario mit statischen Daten ist es effizienter, zunächst alle Daten in die Sammlung zu importieren und später Indizes zu erstellen.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word