paint-brush
So erstellen Sie eine einfache Empfehlungs-Engine ohne maschinelles Lernenvon@thestartupdeveloper
712 Lesungen
712 Lesungen

So erstellen Sie eine einfache Empfehlungs-Engine ohne maschinelles Lernen

von Aditya Kumar11m2024/03/18
Read on Terminal Reader

Zu lang; Lesen

Dieser Artikel befasst sich mit der Entwicklung einer Empfehlungs-Engine ohne Modelle für maschinelles Lernen und bietet Einblicke in die wichtigsten Anforderungen, die Systemarchitektur und die verwendeten Tools. Entdecken Sie Strategien zur Erfassung von Benutzerinteressen, zur Generierung hochwertiger Empfehlungen und zur Sicherstellung einer optimalen Systemleistung.
featured image - So erstellen Sie eine einfache Empfehlungs-Engine ohne maschinelles Lernen
Aditya Kumar HackerNoon profile picture
0-item


Empfehlungssysteme sind zu einem festen und unverzichtbaren Bestandteil unseres Lebens geworden. Diese intelligenten Algorithmen spielen eine entscheidende Rolle bei der Gestaltung unserer Online-Erlebnisse und beeinflussen die Inhalte, die wir konsumieren, die Produkte, die wir kaufen, und die Dienstleistungen, die wir nutzen. Ob wir Inhalte auf Plattformen wie Netflix streamen, neue Musik auf Spotify entdecken oder online einkaufen, Empfehlungssysteme arbeiten im Hintergrund daran, unsere Interaktionen zu personalisieren und zu verbessern.


Das Einzigartige an diesen Empfehlungssystemen ist ihre Fähigkeit, unsere Präferenzen auf der Grundlage historischer Verhaltens- und Benutzermuster zu verstehen und vorherzusagen. Durch die Analyse unserer bisherigen Entscheidungen kuratieren diese Systeme maßgeschneiderte Vorschläge, die uns Zeit und Mühe sparen und uns gleichzeitig Inhalte/Produkte vorstellen, die unseren Interessen entsprechen. Dies erhöht die Benutzerzufriedenheit und fördert die Entdeckung, indem es uns neue und relevante Angebote vorstellt, auf die wir sonst möglicherweise nicht gestoßen wären.


Auf hoher Ebene verstehen Entwickler, dass diese Algorithmen auf maschinellen Lern- und Deep-Learning-Systemen (auch neuronale Netze genannt) basieren . Aber was wäre, wenn ich Ihnen sagen würde, dass es eine Möglichkeit gibt, eine Empfehlungsmaschine zu erstellen, ohne sich die Mühe zu machen, Ihre neuronalen Netze einzusetzen? Netz- oder maschinelles Lernmodell?


Diese Frage ist besonders relevant im Zusammenhang mit Start-ups im Früh- und Mittelstadium, da diese nicht über Unmengen an strukturierten Daten verfügen, um ihre Modelle zu trainieren. Und wie wir bereits wissen, liefern die meisten Modelle des maschinellen Lernens ohne geeignete Trainingsdaten keine genauen Vorhersagen.


Ich habe kürzlich eine grundlegende Empfehlungs-Engine für a erstellt und bereitgestellt Voice-First-soziales Netzwerk , was zu einem Anstieg unserer Schlüsselkennzahlen um 40 % führte. Zum Zeitpunkt der Erstellung dieses Blogs generiert das System mehr als 30 Millionen Empfehlungen pro Monat. Obwohl dieses Empfehlungssystem für ein soziales Netzwerk entwickelt wurde, können Sie die grundlegende Architektur auf jeden Anwendungsfall anwenden, beispielsweise auf Produktempfehlungen, Musikempfehlungen, Inhaltsempfehlungen auf Text- und Videoplattformen oder alles andere. Lassen Sie mich zunächst die Problemstellung beschreiben.


Problemstellung aus ingenieurwissenschaftlicher Sicht

Ich hatte eine umfangreiche Produktanforderungsdokument Und nachfolgendes technisches Anforderungsdokument weil wir das Empfehlungssystem für ein Produkt entwickelt haben, das bereits täglich von Tausenden von Benutzern verwendet wird. Aber um diesen Blog kurz und auf den Punkt zu bringen, werde ich nur die allgemeinen Anforderungen aufschreiben und dann die Lösung derselben diskutieren. Wenn Sie ein Empfehlungssystem für Ihr Produkt aufbauen (einfach oder auf neuronaler Netzbasis) und irgendwo nicht weiterkommen, können Sie mich gerne unter kontaktieren Twitter oder Linkedin , und ich beantworte gerne Ihre Fragen.


Auf hohem Niveau hatten wir aus technischer Sicht folgende Anforderungen:


  1. Das System soll in der Lage sein, die Interessen eines Nutzers in Form von Schlüsselwörtern zu erfassen. Das System sollte auch in der Lage sein, das Interesse eines Benutzers anhand bestimmter Schlüsselwörter zu klassifizieren.


  2. Das System sollte in der Lage sein, das Interesse eines Benutzers an anderen Benutzern zu erfassen. Es sollte in der Lage sein, den Grad des Interesses eines Benutzers an Inhalten zu klassifizieren, die von einem anderen Benutzer erstellt wurden.


  3. Das System soll in der Lage sein, qualitativ hochwertige Empfehlungen basierend auf den Interessen eines Nutzers zu generieren.


  4. Das System sollte sicherstellen können, dass die vom Benutzer bereits angezeigten/abgelehnten Empfehlungen für X Tage nicht erneut angezeigt werden.


  5. Das System sollte über eine Logik verfügen , um sicherzustellen, dass die Beiträge derselben Ersteller nicht auf derselben Seite gruppiert werden. Das System sollte sein Bestes geben, um sicherzustellen, dass, wenn ein Benutzer zehn Beiträge (unsere Seitengröße) konsumiert, alle von verschiedenen Erstellern stammen.


  6. Das System sollte schnell sein. Weniger als 150 Millisekunden P99-Latenz.


  7. Alle anderen nichtfunktionalen Anforderungen wie Hochverfügbarkeit, Skalierbarkeit, Sicherheit, Zuverlässigkeit, Wartbarkeit usw. sollten erfüllt sein.


Auch hier handelt es sich um eine stark vereinfachte Liste von Problemstellungen. In Wirklichkeit waren die Dokumente mehr als 3.000 Wörter lang, da sie auch viele Randfälle und Eckfälle abdeckten, die bei der Integration dieser Empfehlungsmaschine in unsere bestehenden Systeme auftreten können. Kommen wir zur Lösung.


Lösung – High-Level-Funktion der Empfehlungs-Engine

Ich werde die Lösungen für das Problem einzeln besprechen und dann die allgemeine Funktionsweise des gesamten Systems beschreiben.

Unser erstes Problem besteht darin, die Interessen des Benutzers zu erfassen und sein Interessenniveau mit einem bestimmten Interesse zu definieren

Zu diesem Zweck haben wir etwas namens a erstellt soziales Diagramm . Vereinfacht ausgedrückt speichert ein Social Graph die Beziehungen und Verbindungen zwischen verschiedenen Entitäten in einem sozialen Netzwerk. Diese Entitäten können unterschiedliche Benutzer oder eine Beziehung von Benutzern mit einem bestimmten Interesse sein. Soziale Graphen sind eine wirkungsvolle Möglichkeit, die Beziehungen innerhalb eines bestimmten Systems zu verstehen und zu strukturieren. Der Kürze halber werde ich den Social Graph nicht im Detail erklären, aber ich empfehle Ihnen, ihn zu googeln, um mehr darüber zu erfahren. Im Folgenden finden Sie eine vereinfachte Version des sozialen Diagramms, das ich für unsere Empfehlungsmaschine erstellt habe.


Beispiel für ein soziales Diagramm


Wie Sie dem obigen Bild entnehmen können, speichern wir viele Informationen, wie z. B. die Anzahl der Interaktionen (Likes, Kommentare, Shares) und die Aktualität dieser Interaktionen (wann sie zuletzt stattgefunden haben), als Beziehungsdaten zwischen zwei Benutzern sowie zwischen ein Benutzer und ein Interesse. Wir speichern sogar die Beziehung zwischen zwei unterschiedlichen Interessenschlüsselwörtern. ich benutzte Amazon Neptun , eine verwaltete Diagrammdatenbank von AWS, um dieses soziale Diagramm zu speichern. Sie können jede andere Diagrammdatenbank verwenden, z. B. Neo4j, JanusGraph, ArrangoDB usw.


Bei diesen Interessenschlüsselwörtern handelt es sich überwiegend um Substantive. Es gibt ein System, das den Inhalt eines Beitrags in diese Schlüsselwörter (Substantive) unterteilt. Es wird von AWS Comprehend unterstützt. ein NLP-Dienst (Natural Language Processing), der maschinelles Lernen nutzt, um Text in Entitäten, Schlüsselphrasen usw. aufzuteilen. Auch hier können Sie alle verwalteten NLP-Dienste (mehrere verfügbar) verwenden, um dasselbe zu erreichen. Sie müssen Ihre maschinellen Lernmodelle nicht erlernen oder einsetzen! Wenn Sie maschinelles Lernen bereits verstehen, können Sie es überprüfen Open-Source-NLP-Modelle auch auf Huggingface .


Unser zweites Problem besteht darin, qualitativ hochwertige Empfehlungen basierend auf den Interessen eines Benutzers zu generieren

Das folgende Diagramm ist eine vereinfachte allgemeine Darstellung der Funktionsweise des Systems.

vereinfachte allgemeine Darstellung der Funktionsweise des Empfehlungssystems.


Obwohl das oben Genannte einfach aussieht, passiert bei jedem Schritt noch viel mehr, und diese Dinge müssen sorgfältig durchdacht und dann programmiert werden, um sicherzustellen, dass das System optimal funktioniert.


Lassen Sie es mich Schritt für Schritt erklären:


Schritt 1 – Konvertieren von Beitragsinhalten in Vektoreinbettungen

Um diese Empfehlungen zu generieren, müssen wir zunächst den Inhalt eines Beitrags in etwas umwandeln, das sich nennt: Vektoreinbettungen . Mit dem jüngsten Anstieg des Brandings von LLMs, OpenAI (die Hersteller von ChatGPT) und Vektordatenbanken , Vektoreinbettungen werden zu einem alltäglichen Begriff. Ich werde nicht im Detail darauf eingehen, was sie sind und wie sie funktionieren, aber ich empfehle dringend, mehr über sie zu lesen. Aber bei der Generierung brauchbarer Kandidaten für einen Feed müssen auch Dinge wie der Datenschutz und die Moderation des Inhalts berücksichtigt werden (Entfernung von Schimpfwörtern, Beleidigungen, sexuellen Inhalten, Belästigung, Filterung blockierter Benutzer usw.).


Zum Generieren der Vektoreinbettungen können Sie je nach Anwendungsfall jedes bekannte Einbettungsmodell wie das OpenAI-Einbettungsmodell , Amazon Titan oder ein beliebiges Open-Source -Texteinbettungsmodell verwenden. Wir haben uns wegen der günstigen Preisgestaltung, Leistung und Benutzerfreundlichkeit für Amazon Titan entschieden.


Schritt 2 – Fragen Sie das Interesse des Benutzers ab

Jetzt wird es interessant. Sie möchten die Abfragen basierend auf Ihren spezifischen Geschäftsanforderungen entwerfen. Beispielsweise legen wir beim Abfragen von Interessen mehr Wert auf die Aktualität des Engagements als auf die Anzahl der Interaktionen mit einem bestimmten Schlüsselwort oder Benutzer. Wir führen auch mehrere parallele Abfragen durch, um verschiedene Arten von Interessen des Benutzers zu ermitteln – Stichwort oder anderer Benutzer. Da wir mehrere Feeds für einen einzelnen Benutzer generieren, führen wir je nach Trend auch einige Abfragen aus, die ein bestimmtes Thema bewerben (z. B. werden Sie in der Nähe von Weihnachten viele Beiträge zum Thema Weihnachten oder Beiträge zum Thema Erdbeben sehen, wenn ein Erdbeben stattgefunden hat). Es versteht sich von selbst, dass dieses Thema nur dann in den Abfrageergebnissen auftaucht, wenn der Benutzer im Laufe seiner Reise Interesse daran bekundet hat.


Wählen Sie also die Logik aus, die zu Ihrem Geschäftsanwendungsfall und dem Verhalten passt, das Sie steuern möchten, und führen Sie mehrere Abfragen aus, um eine ausreichend große Liste aller Benutzerinteressen zu erhalten.


Schritt 3 – Führen Sie eine ANN-Suche basierend auf den gefundenen Interessen durch

Vektordatenbanken werden überwiegend für die Durchführung einer bestimmten Art von Suche namens „Suche“ verwendet Suche nach dem ungefähren nächsten Nachbarn (ANN). Auch hier sollte die Art und Weise, wie Sie verschiedene Interessen kategorisieren und ob Sie eine große ANN-Suche oder parallele Differenzsuchen durchführen, vollständig von Ihrem Anwendungsfall und Ihren Geschäftsanforderungen abhängen. Ich empfehle, mehr als nur kohortenbasierte Suchen durchzuführen und die Ergebnisse dann zu ordnen (wir werden dies später in diesem Blog besprechen), um das beste Endbenutzererlebnis zu erzielen. In diesem Fall findet die ANN-Suche andere Beiträge auf der Plattform, die den Interessen des Benutzers ähnlich (näher) sind.


Schritt 4 – Speichern Sie die Ergebnisse in einer Cache-Datenbank mit Reihenfolge.

Cache-Datenbank, weil eines der Probleme, die wir lösen müssen, die Geschwindigkeit ist. Wir haben sortierte Redis- Sets verwendet, um die eindeutigen IDs der Beiträge für einen bestimmten Benutzer zu speichern. Wir haben nach Redis sortierte Sätze verwendet, da die Reihenfolge der Beiträge im Feed eines Benutzers entscheidend ist. Ein weiteres Problem, das Sie lösen müssen, besteht darin, dass das „ System über eine Logik verfügen sollte , um sicherzustellen, dass die Beiträge derselben Ersteller nicht auf derselben Seite gruppiert werden“. Um die Wiederholung von Inhalten desselben Erstellers zu vermeiden, haben wir einen einfachen Algorithmus geschrieben, der sicherstellt, dass wir keinen weiteren Beitrag desselben Erstellers einfügen, wenn der Beitrag eines bestimmten Erstellers an einer beliebigen Position im Feed eines bestimmten Benutzers (sortierte Gruppe) eingefügt wird für aufeinanderfolgende zehn Positionen (wir haben eine Seitengröße von 10, während wir den Feed an den Endbenutzer liefern, daher haben wir ihn statisch gehalten, um Komplexität zu vermeiden).


Bei der Entscheidung über die Reihenfolge einer bestimmten Empfehlung des Benutzers haben wir die folgenden Dinge berücksichtigt:


  1. Die Stärke der Beziehung zu einem bestimmten Interesse (oder einem anderen Benutzer) für diesen Benutzer : Sie wird durch eine arithmetische Formel bestimmt, die verschiedene Datenpunkte aus dem sozialen Diagramm übernimmt. Bei all dem handelt es sich um Engagement-Daten wie den Zeitstempel der zuletzt erstellten Likes, die Anzahl der erstellten Likes, den letzten Kommentar usw. Das Engagement-Verhalten der Nutzer ist der Indikator für ihr Interesse an etwas.


  2. Die Beliebtheit des Beitrags auf der Plattform: Um dies zu ermitteln, haben wir einen Algorithmus erstellt, der verschiedene Faktoren wie Engagement, Engagement-zu-Impression-Verhältnisse, Anzahl der einzelnen Benutzer, die sich engagiert haben, usw. berücksichtigt, um daraus einen Engagement-Score zu generieren auf Plattformebene posten.


In einigen Feeds legen wir Wert auf Beliebtheit. in anderen Fällen priorisieren wir den sozialen Graphen. Aber meistens sind sie alle eine gesunde Mischung aus beidem.


Wie das System funktioniert

Wie Sie der obigen Abbildung entnehmen können, wurde das System bewusst sehr einfach gehalten. Im Folgenden erfahren Sie, wie das System funktioniert:


  1. Wenn Benutzer A einen Beitrag erstellt, löst der Postdienst nach dem Speichern dieses Beitrags ein Pub/Sub-Ereignis in einer Warteschlange aus, das von einem Hintergrunddienst zur Kandidatengenerierung empfangen wird. Wir gebrauchen Google Pub/Sub für die Pub/Sub-Funktionalität.


  2. Dieser Hintergrunddienst empfängt diese asynchron und führt die zuvor besprochenen Funktionen aus – Datenschutzprüfungen, Moderationsprüfungen und Schlüsselwortgenerierung – und generiert dann die Vektoreinbettungen und speichert sie in der Vektordatenbank. Wir benutzen AstraDB als unsere Vektordatenbank (Später besprochen).


  3. Immer wenn ein Benutzer nach der Aktualisierung unserer Haupt-NoSQL-Datenbank interagiert (Gefällt mir/Kommentar/Teilen usw.), löst der Post-Service ein Pub/Sub-Ereignis für den Empfehlungs-Engine-Service aus.


  4. Dieser Empfehlungs-Engine-Dienst aktualisiert die Diagrammdatenbank und aktualisiert dann den empfohlenen Feed des Benutzers nahezu in Echtzeit, indem er die ANN-Suche durchführt und die Redis-Datenbank aktualisiert. Je mehr Benutzer interagieren, desto besser wird der Feed. Es gibt Überprüfungen, um sicherzustellen, dass die Empfehlungen nicht auf eine bestimmte Liste von Schlüsselwörtern ausgerichtet sind . Diese Prüfungen werden durchgeführt, während wir die Graph-Datenbank abfragen. Dieser Dienst aktualisiert auch den Engagement-Score asynchron. Die Engagement-Scores werden auch für Benutzer neu berechnet, die den Beitrag ansehen.


  5. Da alle oben genannten Schritte asynchron hinter den Kulissen durchgeführt werden, haben diese Berechnungen keine Auswirkungen auf das Endbenutzererlebnis.


  6. Der Feed wird schließlich über einen Feed-Dienst dem Endbenutzer bereitgestellt. Da dieser Dienst lediglich eine Suche auf Redis und unserer Haupt-NoSQL-Datenbank durchführt ( DyanmoDB ), seine P99-Latenz beträgt weniger als 110 Millisekunden. Beide Datenbanken geben Abfrageergebnisse unabhängig von der Skalierung mit einer Latenz im einstelligen Millisekundenbereich zurück.


Verwendete Tools und Technologien

  1. Einige Dienste wurden eingeschrieben Gehen Sie zur Programmiersprache , während andere eingeschrieben wurden NodeJS (mit Typoskript).


  2. Wir benutzen AstraDB von Datastax als unsere Vektordatenbank. Zu dieser Entscheidung kamen wir, nachdem wir mehrere andere Datenbanken wie Pinecone, Milvus und Weaviate ausgewertet hatten. Neben den hervorragenden Abfrage- und Indizierungsfunktionen für Vektor- und andere Datentypen bietet es einen preisgünstigen, serverlosen Preisplan. Es läuft auf einer Cassandra-Engine, die wir in mehreren anderen Funktionen unserer Plattform als Datenbank verwenden, und bietet eine CQL-Abfrageschnittstelle, die sehr entwicklerfreundlich ist. Ich empfehle dringend, es für Ihre Vektoranwendungsfälle auszuprobieren.


  3. Wir gebrauchen Google Pub/Sub für unsere asynchrone Kommunikation, da sie bei unserem derzeitigen Umfang (wenige Lakh Gesamtbenutzer, einige Tausend täglich aktive Benutzer) äußerst kosteneffektiv ist. Ich habe es auf einer Skala von ein paar Millionen Benutzern mit Tausenden von Ereignissen pro Sekunde ausgeführt. Es funktioniert gut und lässt sich mühelos verwenden und erweitern.


  4. Redis - Geschwindigkeit, Einfachheit und leistungsstarke Datenstruktur. Ich glaube nicht, dass ich darüber diskutieren muss, warum Redis im Jahr 2024 eingeführt wird.


  5. DynamoDB - Auch hier ist es hoch skalierbar und einfach zu verwenden, und wir betreiben es im serverlosen Modus, wo unsere Gesamtrechnung trotz Hunderttausender Abfragen pro Minute recht niedrig ist. Es bietet außerdem sehr leistungsstarke Indizierungsfunktionen und eine Latenzzeit im einstelligen Millisekundenbereich beim Lesen und Schreiben.


Probleme, die in Zukunft gelöst werden müssen

Wie Sie sich vorstellen können, kann dasselbe Setup optimiert werden, um eine grundlegende Empfehlungs-Engine für jeden Anwendungsfall zu erstellen. Da es sich bei uns jedoch um ein soziales Netzwerk handelt, müssen wir später einige Anpassungen vornehmen, um dieses System effizienter zu machen.


  1. Auf der Social-Graph-Ebene werden Algorithmen für maschinelles Lernen/Deep-Learning benötigt, um die Schlüsselwörter und Benutzer vorherzusagen, die für den Benutzer am relevantesten sind. Derzeit ist der Datensatz zu klein, um genaue Vorhersagen zu treffen, da es sich um ein sehr neues Produkt handelt. Wenn jedoch die Datenmenge wächst, müssen wir die aktuellen einfachen Abfragen und Formeln durch die Ausgabe von Algorithmen für maschinelles Lernen ersetzen.


  2. Beziehungen zwischen verschiedenen Schlüsselwörtern und Benutzern müssen verfeinert und detaillierter gestaltet werden. Sie sind derzeit auf einem sehr hohen Niveau. Aber sie müssen tiefer gehen. Wir müssen zunächst die Beziehungen zweiten und dritten Grades in unserem Diagramm untersuchen, um die Empfehlungen zu verfeinern.


  3. Wir nehmen derzeit keine Feinabstimmungen an unseren Einbettungsmodellen vor. Das müssen wir in naher Zukunft tun.


Schlussbemerkung

Ich hoffe, Sie fanden diesen Blog hilfreich. Wenn Sie Fragen, Zweifel oder Anregungen haben, können Sie mich gerne unter kontaktieren Twitter , Linkedin oder Instagram . Teilen Sie diesen Artikel mit Ihren Freunden und Kollegen.


Auch hier veröffentlicht.