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
Ich hatte eine umfangreiche
Auf hohem Niveau hatten wir aus technischer Sicht folgende Anforderungen:
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.
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.
Das System soll in der Lage sein, qualitativ hochwertige Empfehlungen basierend auf den Interessen eines Nutzers zu generieren.
Das System sollte sicherstellen können, dass die vom Benutzer bereits angezeigten/abgelehnten Empfehlungen für X Tage nicht erneut angezeigt werden.
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.
Das System sollte schnell sein. Weniger als 150 Millisekunden P99-Latenz.
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.
Ich werde die Lösungen für das Problem einzeln besprechen und dann die allgemeine Funktionsweise des gesamten Systems beschreiben.
Zu diesem Zweck haben wir etwas namens a erstellt
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
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
Das folgende Diagramm ist eine vereinfachte allgemeine Darstellung der Funktionsweise des Systems.
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:
Um diese Empfehlungen zu generieren, müssen wir zunächst den Inhalt eines Beitrags in etwas umwandeln, das sich nennt:
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.
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.
Vektordatenbanken werden überwiegend für die Durchführung einer bestimmten Art von Suche namens „Suche“ verwendet
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:
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.
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 Sie der obigen Abbildung entnehmen können, wurde das System bewusst sehr einfach gehalten. Im Folgenden erfahren Sie, wie das System funktioniert:
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
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
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.
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.
Da alle oben genannten Schritte asynchron hinter den Kulissen durchgeführt werden, haben diese Berechnungen keine Auswirkungen auf das Endbenutzererlebnis.
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 (
Einige Dienste wurden eingeschrieben
Wir benutzen
Wir gebrauchen
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.
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.
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.
Wir nehmen derzeit keine Feinabstimmungen an unseren Einbettungsmodellen vor. Das müssen wir in naher Zukunft tun.
Ich hoffe, Sie fanden diesen Blog hilfreich. Wenn Sie Fragen, Zweifel oder Anregungen haben, können Sie mich gerne unter kontaktieren
Auch hier veröffentlicht.