Heim > Web-Frontend > js-Tutorial > Hauptteil

Erstellen Sie „Für Sie'-Empfehlungen mit KI auf Fastly!

王林
Freigeben: 2024-08-07 21:54:53
Original
1015 Leute haben es durchsucht

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:

Build

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.

Der Anwendungsfall „Für Sie“.

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!

Ein Beispiel aus der Praxis

Werfen wir einen Blick auf die Website des New York Metropolitan Museum of Art:

Build

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:

Build

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?

Hinzufügen personalisierter Empfehlungen

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:

  1. Laden Sie den Open-Access-Sammlungsdatensatz des Met herunter.
  2. Führen Sie es durch ein Sprachmodell, um Vektoreinbettungen zu erstellen – Zahlenlisten, die für maschinelle Lernaufgaben geeignet sind.
  3. Erstellen Sie eine leistungsstarke Ähnlichkeitssuchmaschine für die resultierenden halben Million Vektoren (die die Kunstwerke der Met darstellen) und laden Sie sie in den KV-Store, damit wir sie von Fastly Compute verwenden können.

Sobald wir das alles erledigt haben, sollten wir dazu in der Lage sein, wie Sie auf der Met-Website durchsuchen:

  1. Verfolgen Sie die Kunstwerke, die Sie besuchen, in einem Cookie.
  2. Suchen Sie nach den Vektoren, die diesen Kunstwerken entsprechen.
  3. Berechnen Sie einen durchschnittlichen Vektor, der Ihre Surfinteressen repräsentiert.
  4. Gib das in unsere Ähnlichkeitssuchmaschine ein, um die ähnlichsten Kunstwerke zu finden.
  5. Laden Sie Details zu diesen Kunstwerken aus der Met's Object API und erweitern Sie die Seite mit personalisierten Empfehlungen.

Et voilà, personalisierte Empfehlungen:

Build

OK, also lasst uns das aufschlüsseln.

Erstellen des Datensatzes

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",,,
Nach dem Login kopieren

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"
Nach dem Login kopieren

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 ]
  },
  …
]
Nach dem Login kopieren

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:

Build

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.

Erstellen der Edge-App

Die Anwendung, die wir am Rand ausführen, muss mehrere Arten von Anfragen verarbeiten:

  • HTML-Seiten: Wir rufen diese von metmuseum.org ab und wandeln die Antwort um, um zusätzliches Front-End-
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage