Schlüsselwortbasierte Suche
Wir bei Tokopedia sind uns bewusst, dass unser Produktkorpus nur dann seinen Wert entfaltet, wenn unsere Käufer Produkte finden können, die für sie relevant sind, daher bemühen wir uns, die Relevanz der Suchergebnisse zu verbessern.
Um diese Bemühungen zu unterstützen, führen wir die Ähnlichkeitssuche auf Tokopedia ein. Wenn Sie die Suchergebnisseite auf mobilen Geräten aufrufen, finden Sie eine "..."-Schaltfläche, die Ihnen die Möglichkeit gibt, nach ähnlichen Produkten wie dem Produkt zu suchen.
Schlüsselwortbasierte Suche
Tokopedia Search verwendet Elasticsearch für die Suche und das Ranking von Produkten. Für jede Suchanfrage wird zunächst Elasticsearch abgefragt, das die Produkte entsprechend der Suchanfrage einstuft. Elasticsearch speichert jedes Wort als eine Folge von Zahlen, die ASCII- (oder UTF-) Codes für jeden Buchstaben darstellen. Es baut einen invertierten Index auf, um schnell herauszufinden, welche Dokumente Wörter aus der Benutzeranfrage enthalten, und findet dann die beste Übereinstimmung unter ihnen mit Hilfe verschiedener Bewertungsalgorithmen. Diese Bewertungsalgorithmen achten wenig auf die Bedeutung der Wörter, sondern eher darauf, wie häufig sie in dem Dokument vorkommen, wie nahe sie beieinander liegen usw. Die ASCII-Darstellung enthält offensichtlich genügend Informationen, um die Semantik zu vermitteln (schließlich können wir Menschen sie verstehen). Leider gibt es für den Computer keinen guten Algorithmus, um ASCII-kodierte Wörter anhand ihrer Bedeutung zu vergleichen.
Vektorielle Darstellung
Eine Lösung für dieses Problem wäre eine alternative Darstellung, die nicht nur etwas über die im Wort enthaltenen Buchstaben aussagt, sondern auch etwas über seine Bedeutung. Wir könnten zum Beispiel kodieren , mit welchen anderen Wörtern unser Wort häufig zusammen verwendet wird (dargestellt durch den wahrscheinlichen Kontext). Wir würden dann annehmen, dass ähnliche Kontexte für ähnliche Dinge stehen, und versuchen, sie mit mathematischen Methoden zu vergleichen. Wir könnten sogar einen Weg finden, ganze Sätze nach ihrer Bedeutung zu kodieren.
Blog_Wie wir die semantische Suche nutzen, um unsere Suche 10x intelligenter zu machen_2.png
Auswahl einer Suchmaschine für die Einbettungsähnlichkeit
Da wir nun über Merkmalsvektoren verfügen, stellt sich die Frage, wie wir aus der großen Menge von Vektoren diejenigen herausfinden können, die dem Zielvektor ähnlich sind. Was die Suchmaschine für Einbettungen betrifft, so haben wir POC mit mehreren auf Github verfügbaren Maschinen ausprobiert, darunter FAISS, Vearch und Milvus.
Basierend auf den Ergebnissen der Lasttests ziehen wir Milvus den anderen Engines vor. Einerseits haben wir FAISS bereits in anderen Teams eingesetzt und wollten daher etwas Neues ausprobieren. Im Vergleich zu Milvus ist FAISS eher eine zugrundeliegende Bibliothek und daher nicht ganz einfach zu benutzen. Als wir mehr über Milvus erfuhren, entschieden wir uns schließlich für Milvus wegen seiner zwei Hauptmerkmale:
Milvus ist sehr einfach zu benutzen. Alles, was Sie tun müssen, ist, sein Docker-Image zu ziehen und die Parameter auf der Grundlage Ihres eigenen Szenarios zu aktualisieren.
Milvus unterstützt mehrere Indizes und verfügt über eine ausführliche Dokumentation.
Kurz gesagt, Milvus ist sehr benutzerfreundlich und die Dokumentation ist sehr ausführlich. Wenn Sie auf ein Problem stoßen, können Sie in der Regel Lösungen in der Dokumentation finden; andernfalls können Sie jederzeit Unterstützung von der Milvus-Community erhalten.
Milvus-Cluster-Dienst
Nachdem wir uns für Milvus als Feature-Vektor-Suchmaschine entschieden hatten, beschlossen wir, Milvus für einen unserer Ads-Service-Anwendungsfälle zu verwenden, bei dem wir Keywords mit niedriger Füllrate mit Keywords mit hoher Füllrate abgleichen wollten. Wir konfigurierten einen Standalone-Knoten in einer Entwicklungsumgebung (DEV) und begannen mit der Auslieferung, die bereits seit einigen Tagen gut lief und uns verbesserte CTR/CVR-Metriken lieferte. Wenn ein Standalone-Knoten in der Produktionsumgebung ausfiele, würde der gesamte Dienst nicht mehr verfügbar sein. Wir müssen also einen hochverfügbaren Suchdienst bereitstellen.
Milvus bietet sowohl Mishards, eine Cluster-Sharding-Middleware, als auch Milvus-Helm für die Konfiguration. In Tokopedia verwenden wir Ansible-Playbooks für die Einrichtung der Infrastruktur, also haben wir ein Playbook für die Infrastruktur-Orchestrierung erstellt. Das folgende Diagramm aus der Milvus-Dokumentation zeigt, wie Mishards funktioniert:
Blog_How we used semantic search to make our search 10x smarter_3.png
Mishards kaskadiert eine Anfrage von Upstream bis hinunter zu seinen Untermodulen, die die Upstream-Anfrage aufteilen, und sammelt dann die Ergebnisse der Unterdienste und gibt sie an Upstream zurück. Die Gesamtarchitektur der Mishards-basierten Clusterlösung ist unten dargestellt: Blog_How we used semantic search to make our search 10x smarter_4.jpeg
Die offizielle Dokumentation bietet eine klare Einführung in Mishards. Bei Interesse können Sie sich auf Mishards beziehen.
In unserem Schlüsselwort-zu-Schlüsselwort-Dienst haben wir einen beschreibbaren Knoten, zwei schreibgeschützte Knoten und eine Mishards-Middleware-Instanz in GCP mithilfe von Milvus Ansible eingerichtet. Bislang läuft das System stabil. Ein wesentlicher Bestandteil der effizienten Abfrage von Millionen-, Milliarden- oder sogar Billionen-Vektordatensätzen, auf die sich Suchmaschinen für Ähnlichkeitsanalysen stützen, ist die Indizierung, ein Prozess zur Organisation von Daten, der die Big-Data-Suche drastisch beschleunigt.
Wie beschleunigt die Vektorindizierung die Ähnlichkeitssuche?
Ähnlichkeitssuchmaschinen arbeiten, indem sie Eingaben mit einer Datenbank vergleichen, um Objekte zu finden, die der Eingabe am ähnlichsten sind. Die Indizierung ist der Prozess der effizienten Organisation von Daten und spielt eine wichtige Rolle, wenn es darum geht, die Ähnlichkeitssuche nützlich zu machen, indem zeitaufwändige Abfragen in großen Datensätzen drastisch beschleunigt werden. Nachdem ein großer Vektordatensatz indiziert wurde, können Abfragen zu Clustern oder Teilmengen von Daten geleitet werden, die mit hoher Wahrscheinlichkeit Vektoren enthalten, die einer Eingabeabfrage ähnlich sind. In der Praxis bedeutet dies, dass ein gewisses Maß an Genauigkeit geopfert werden muss, um Abfragen auf wirklich großen Vektordaten zu beschleunigen.
Es kann eine Analogie zu einem Wörterbuch gezogen werden, in dem die Wörter alphabetisch sortiert sind. Wenn man ein Wort nachschlägt, kann man schnell zu einem Abschnitt navigieren, der nur Wörter mit demselben Anfangsbuchstaben enthält, was die Suche nach der Definition des eingegebenen Wortes drastisch beschleunigt.
Sie fragen sich, wie es weitergeht?
Blog_Wie wir die semantische Suche nutzen, um unsere Suche 10x intelligenter zu machen_5.jpeg
Wie oben gezeigt, gibt es keine Lösung, die für alle geeignet ist. Wir wollen immer die Leistung des Modells verbessern, das für die Ermittlung der Einbettungen verwendet wird.
Außerdem wollen wir aus technischer Sicht mehrere Lernmodelle gleichzeitig laufen lassen und die Ergebnisse der verschiedenen Experimente vergleichen. Weitere Informationen zu unseren Experimenten, z. B. zur Bild- und Videosuche, finden Sie an dieser Stelle.
Referenzen:
- Mishards Docs:https://milvus.io/docs/v0.10.2/mishards.md
- Mishards: https://github.com/milvus-io/milvus/tree/master/shards
- Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
Dieser Blog-Artikel wurde von https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821 übernommen.
Lesen Sie andere Anwenderberichte, um mehr über die Herstellung von Dingen mit Milvus zu erfahren.
- Vektorielle Darstellung
- Auswahl einer Suchmaschine für die Einbettungsähnlichkeit
- Milvus-Cluster-Dienst
- Wie beschleunigt die Vektorindizierung die Ähnlichkeitssuche?
- Sie fragen sich, wie es weitergeht?
- Referenzen:
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word