Heim > Artikel > Web-Frontend > Erstellen Sie „Für Sie“-Empfehlungen mit KI auf Fastly!
Vergessen Sie den Hype; Wo liefert KI echten Mehrwert? Nutzen wir Edge Computing, um die Leistungsfähigkeit der KI zu nutzen und intelligentere Benutzererlebnisse zu schaffen, die außerdem schnell, sicher und zuverlässig sind.
Empfehlungen gibt es überall, und jeder weiß, dass eine stärkere Personalisierung von Web-Erlebnissen diese ansprechender und erfolgreicher macht. Meine Amazon-Homepage weiß, dass ich Einrichtungsgegenstände, Küchenutensilien und im Moment Sommerkleidung mag:
Heutzutage haben Sie auf den meisten Plattformen die Wahl zwischen Schnelligkeit und Personalisierung. Wir bei Fastly glauben, dass Sie – und Ihre Benutzer – beides verdienen. Wenn Ihr Webserver jedes Mal eine Seite generiert, diese nur für einen Endbenutzer geeignet ist, können Sie nicht von der Zwischenspeicherung profitieren, was Edge-Netzwerke wie Fastly gut können.
Wie können Sie also vom Edge-Caching profitieren und dennoch Inhalte personalisieren? Wir haben bereits viel darüber geschrieben, wie man komplexe Client-Anfragen in mehrere kleinere, zwischenspeicherbare Backend-Anfragen aufteilt, und Sie finden Tutorials, Codebeispiele und Demos im Thema Personalisierung auf unserem Entwickler-Hub.
Aber was ist, wenn Sie noch weiter gehen und die Personalisierungsdaten am Edge generieren möchten? Der „Edge“ – die Fastly-Server, die den Datenverkehr Ihrer Website verarbeiten, ist der Punkt, der dem Endbenutzer am nächsten liegt und noch unter Ihrer Kontrolle liegt. Ein großartiger Ort, um Inhalte zu produzieren, die speziell auf einen Benutzer zugeschnitten sind.
Produktempfehlungen sind von Natur aus vorübergehend, spezifisch für einen einzelnen Benutzer und können sich häufig ändern. Aber sie müssen auch nicht bestehen bleiben – wir müssen normalerweise nicht wissen, was wir jeder Person empfohlen haben, sondern nur, ob ein bestimmter Algorithmus eine bessere Konvertierung erzielt als ein anderer. Einige Empfehlungsalgorithmen benötigen Zugriff auf eine große Menge an Statusdaten, z. B. darauf, welche Benutzer Ihnen am ähnlichsten sind und auf deren Kauf- oder Bewertungshistorie. Diese Daten lassen sich jedoch häufig problemlos in großen Mengen vorab generieren.
Grundsätzlich wird beim Generieren von Empfehlungen normalerweise keine Transaktion erstellt, es sind keine Sperren in Ihrem Datenspeicher erforderlich und es werden Eingabedaten verwendet, die entweder sofort in der Sitzung des aktuellen Benutzers verfügbar sind oder in einem Offline-Build-Prozess erstellt wurden.
Klingt, als könnten wir am Rande Empfehlungen generieren!
Werfen wir einen Blick auf die Website des New York Metropolitan Museum of Art:
Zu jedem der rund 500.000 Objekte in der Met-Sammlung gibt es eine Seite mit einem Bild und Informationen dazu. Es gibt auch diese Liste verwandter Objekte:
Dies scheint ein ziemlich einfaches System der Facettierung zu verwenden, um diese Beziehungen herzustellen und mir andere Kunstwerke desselben Künstlers oder andere Objekte im selben Flügel des Museums zu zeigen oder die ebenfalls aus Papier bestehen oder aus demselben stammen Zeitraum.
Das Schöne an diesem System (aus Entwicklersicht!) ist, dass es, da es nur auf einem Eingabeobjekt basiert, vorab in der Seite generiert werden kann.
Was wäre, wenn wir dies durch eine Auswahl von Empfehlungen ergänzen möchten, die auf dem persönlichen Browserverlauf des Endbenutzers basieren, während er auf der Met-Website navigiert, und nicht nur auf diesem einen Objekt?
Es gibt viele Möglichkeiten, dies zu tun, aber ich wollte versuchen, ein Sprachmodell zu verwenden, da KI gerade im Einsatz ist und sie sich wirklich von der Art und Weise unterscheidet, wie es der bestehende Mechanismus für verwandte Kunstwerke der Met zu sein scheint arbeiten. Hier ist der Plan:
Sobald wir das alles erledigt haben, sollten wir dazu in der Lage sein, wie Sie auf der Met-Website durchsuchen:
Et voilà, personalisierte Empfehlungen:
OK, also lasst uns das aufschlüsseln.
Der Rohdatensatz des Met ist eine CSV-Datei mit vielen Spalten und sieht folgendermaßen aus:
Object Number,Is Highlight,Is Timeline Work,Is Public Domain,Object ID,Gallery Number,Department,AccessionYear,Object Name,Title,Culture,Period,Dynasty,Reign,Portfolio,Constituent ID,Artist Role,Artist Prefix,Artist Display Name,Artist Display Bio,Artist Suffix,Artist Alpha Sort,Artist Nationality,Artist Begin Date,Artist End Date,Artist Gender,Artist ULAN URL,Artist Wikidata URL,Object Date,Object Begin Date,Object End Date,Medium,Dimensions,Credit Line,Geography Type,City,State,County,Country,Region,Subregion,Locale,Locus,Excavation,River,Classification,Rights and Reproduction,Link Resource,Object Wikidata URL,Metadata Date,Repository,Tags,Tags AAT URL,Tags Wikidata URL 1979.486.1,False,False,False,1,,The American Wing,1979,Coin,One-dollar Liberty Head Coin,,,,,,16429,Maker," ",James Barton Longacre,"American, Delaware County, Pennsylvania 1794–1869 Philadelphia, Pennsylvania"," ","Longacre, James Barton",American,1794 ,1869 ,,http://vocab.getty.edu/page/ulan/500011409,https://www.wikidata.org/wiki/Q3806459,1853,1853,1853,Gold,Dimensions unavailable,"Gift of Heinz L. Stoppelmann, 1979",,,,,,,,,,,,,,http://www.metmuseum.org/art/collection/search/1,,,"Metropolitan Museum of Art, New York, NY",,, 1980.264.5,False,False,False,2,,The American Wing,1980,Coin,Ten-dollar Liberty Head Coin,,,,,,107,Maker," ",Christian Gobrecht,1785–1844," ","Gobrecht, Christian",American,1785 ,1844 ,,http://vocab.getty.edu/page/ulan/500077295,https://www.wikidata.org/wiki/Q5109648,1901,1901,1901,Gold,Dimensions unavailable,"Gift of Heinz L. Stoppelmann, 1980",,,,,,,,,,,,,,http://www.metmuseum.org/art/collection/search/2,,,"Metropolitan Museum of Art, New York, NY",,,
Einfach genug, um das in zwei Spalten umzuwandeln, eine ID und eine Zeichenfolge:
id,description 1,"One-dollar Liberty Head Coin; Type: Coin; Artist: James Barton Longacre; Medium: Gold; Date: 1853; Credit: Gift of Heinz L. Stoppelmann, 1979" 2,"Ten-dollar Liberty Head Coin; Type: Coin; Artist: Christian Gobrecht; Medium: Gold; Date: 1901; Credit: Gift of Heinz L. Stoppelmann, 1980" 3,"Two-and-a-Half Dollar Coin; Type: Coin; Medium: Gold; Date: 1927; Credit: Gift of C. Ruxton Love Jr., 1967"
Jetzt können wir das Transformers-Paket aus dem Hugging Face AI-Toolset verwenden und Einbettungen jeder dieser Beschreibungen generieren. Wir verwendeten das Satztransformatoren/all-MiniLM-L12-v2-Modell und verwendeten die Hauptkomponentenanalyse (PCA), um die resultierenden Vektoren auf 5 Dimensionen zu reduzieren. Das ergibt so etwas wie:
[ { "id": 1, "vector": [ -0.005544120445847511, -0.030924081802368164, 0.008597176522016525, 0.20186401903629303, 0.0578165128827095 ] }, { "id": 2, "vector": [ -0.005544120445847511, -0.030924081802368164, 0.008597176522016525, 0.20186401903629303, 0.0578165128827095 ] }, … ]
Wir haben davon eine halbe Million, daher ist es nicht möglich, diesen gesamten Datensatz im Speicher der Edge-App zu speichern. Und wir möchten eine benutzerdefinierte Art der Ähnlichkeitssuche für diese Daten durchführen, was ein herkömmlicher Schlüsselwertspeicher nicht bietet. Da wir ein Echtzeit-Erlebnis aufbauen, möchten wir auch wirklich vermeiden, eine halbe Million Vektoren gleichzeitig durchsuchen zu müssen.
Also, lasst uns die Daten partitionieren. Wir können KMeans-Clustering verwenden, um einander ähnliche Vektoren zu gruppieren. Wir haben die Daten in 500 Cluster unterschiedlicher Größe unterteilt und für jeden dieser Cluster einen Mittelpunkt berechnet, der als „Schwerpunktvektor“ bezeichnet wird. Wenn Sie diesen Vektorraum zweidimensional geplottet und vergrößert haben, könnte er etwa so aussehen:
Die roten Kreuze sind die mathematischen Mittelpunkte jedes Vektorclusters, die als Schwerpunkte bezeichnet werden. Sie können als Wegweiser für unseren Raum mit einer halben Million Vektoren dienen. Wenn wir beispielsweise die 10 Vektoren finden möchten, die einem bestimmten Vektor A am ähnlichsten sind, können wir zunächst nach dem nächstgelegenen Schwerpunkt (von 500) suchen und dann unsere Suche nur innerhalb des entsprechenden Clusters durchführen – einem viel überschaubareren Bereich!
Jetzt haben wir 500 kleine Datensätze und einen Index, der Schwerpunktpunkte dem relevanten Datensatz zuordnet. Um eine Echtzeitleistung zu ermöglichen, möchten wir als Nächstes Suchdiagramme vorkompilieren, sodass wir sie nicht zur Laufzeit initialisieren und erstellen müssen und so wenig CPU-Zeit wie möglich verbrauchen können. Ein wirklich schneller Nearest-Neighbor-Algorithmus ist Hierarchical Navigable Small Worlds (HNSW) und verfügt über eine reine Rust-Implementierung, die wir zum Schreiben unserer Edge-App verwenden. Deshalb haben wir eine kleine eigenständige Rust-App geschrieben, um die HNSW-Diagrammstrukturen für jeden Datensatz zu erstellen, und dann Bincode verwendet, um den Speicher der instanziierten Struktur in einen binären Blob zu exportieren.
Jetzt können diese binären Blobs in den KV-Speicher geladen, mit dem Cluster-Index abgeglichen und der Cluster-Index in unsere Edge-App aufgenommen werden.
Mit dieser Architektur können wir Teile des Suchindex bei Bedarf in den Speicher laden. Und da wir nie mehr als ein paar tausend Vektoren gleichzeitig durchsuchen müssen, werden unsere Suchen immer günstig und schnell sein.
Die Anwendung, die wir am Rand ausführen, muss mehrere Arten von Anfragen verarbeiten: