paint-brush
機械学習を使用せずに基本的なレコメンデーション エンジンを構築する方法@thestartupdeveloper
712 測定値
712 測定値

機械学習を使用せずに基本的なレコメンデーション エンジンを構築する方法

Aditya Kumar
Aditya Kumar HackerNoon profile picture

Aditya Kumar

@thestartupdeveloper

This blog is meant for all those developers who want...

11 分 read2024/03/18
Read on Terminal Reader
Read this story in a terminal
Print this story

長すぎる; 読むには

この記事では、機械学習モデルを使用しないレコメンデーション エンジンの開発について詳しく説明し、主要な要件、システム アーキテクチャ、および使用されるツールについての洞察を提供します。ユーザーの関心を捉え、高品質の推奨事項を生成し、最適なシステム パフォーマンスを確保するための戦略を発見します。
featured image - 機械学習を使用せずに基本的なレコメンデーション エンジンを構築する方法
Aditya Kumar HackerNoon profile picture
Aditya Kumar

Aditya Kumar

@thestartupdeveloper

This blog is meant for all those developers who want to learn how to build complex products from scratch. The ones that

0-item

STORY’S CREDIBILITY

Guide

Guide

Walkthroughs, tutorials, guides, and tips. This story will teach you how to do something new or how to do something better.


レコメンデーション システムは、私たちの生活に不可欠な要素となっています。これらのインテリジェントなアルゴリズムは、私たちのオンライン体験を形成する上で極めて重要であり、私たちが消費するコンテンツ、購入する製品、探索するサービスに影響を与えます。私たちがNetflixなどのプラットフォームでコンテンツをストリーミングしている場合でも、 Spotifyで新しい音楽を発見している場合でも、オンライン ショッピングをしている場合でも、レコメンデーション システムは舞台裏で静かに動作して、私たちのインタラクションをパーソナライズし、強化しています。


これらのレコメンデーション システムのユニークな要素は、過去の行動やユーザー パターンに基づいて私たちの好みを理解し、予測する機能です。これらのシステムは、私たちの過去の選択を分析することで、カスタマイズされた提案を厳選し、私たちの時間と労力を節約しながら、私たちの興味に合ったコンテンツ/製品を紹介します。これにより、ユーザーの満足度が向上し、発見が促進され、他の方法では出会うことのなかった新しく関連性の高い製品が私たちに提供されます。


大まかに言えば、開発者は、これらのアルゴリズムが機械学習および深層学習システム (ニューラル ネットワークとも呼ばれます) によって強化されていることを理解していますが、ニューラル ネットワークを導入するという苦労をせずにレコメンデーション エンジンを構築する方法があると言ったらどうなるでしょうか。ネットそれとも機械学習モデル?


この質問は、モデルをトレーニングするための大量の構造化データを持っていないため、初期および中期のスタートアップのコンテキストに特に関連します。そして、すでにご存知のとおり、ほとんどの機械学習モデルは、適切なトレーニング データがなければ正確な予測を提供できません。


私は最近、基本的なレコメンデーション エンジンを構築してデプロイしました。音声ファーストのソーシャル ネットワークこれにより、主要な指標が 40% 増加しました。このブログの執筆時点では、システムは毎月 3,000 万件を超える推奨事項を生成しています。このレコメンデーション システムはソーシャル ネットワーク用に構築されていますが、基本的なアーキテクチャは、製品のレコメンデーション、音楽のレコメンデーション、テキストやビデオ プラットフォームでのコンテンツのレコメンデーションなど、あらゆるユースケースに適用できます。まずは問題文の説明から始めましょう。


エンジニアリングの観点からの問題ステートメント

私は広範な製品要件文書そしてその後のエンジニアリング要件文書なぜなら、私たちは毎日何千人ものユーザーがすでに使用している製品の推奨システムを構築していたからです。ただし、このブログを短く、的を射たものにするために、大まかな要件のみを書き、それからその解決策について説明します。製品のレコメンデーション システム (シンプルまたはニューラル ネット ベース) を構築していて、どこかで行き詰まっている場合は、お気軽に私までご連絡ください。ツイッターまたはリンクトインご質問に喜んでお答えいたします。


大まかに言うと、エンジニアリングの観点から次の要件がありました。


  1. システムは、ユーザーの興味をキーワードの形で捉えることができる必要があります。システムは、ユーザーが特定のキーワードに対して持つ関心のレベルを分類できる必要もあります。


  2. システムは、他のユーザーに対するユーザーの関心を捉えることができなければなりません。別のユーザーが作成したコンテンツに対するユーザーの関心のレベルを分類できる必要があります。


  3. システムは、ユーザーの興味に基づいて高品質の推奨事項を生成できなければなりません。


  4. システムは、ユーザーがすでに表示または拒否した推奨事項が X 日間再表示されないようにする必要があります。


  5. システムには、同じ作成者からの投稿が同じページにグループ化されないようにするロジックが必要です。システムは、ユーザーが 10 件の投稿 (ページ サイズ) を利用する場合、それらすべてが異なる作成者によるものであることを保証するために最善を尽くす必要があります。


  6. システムは高速でなければなりません。 P99 遅延は 150 ミリ秒未満。


  7. 高可用性、拡張性、セキュリティ、信頼性、保守性など、他のすべての非機能要件を満たす必要があります。


繰り返しますが、これは問題ステートメントの非常に単純化されたリストです。実際には、このレコメンデーション エンジンを既存のシステムに統合する際に発生する可能性のあるエッジ ケースやコーナー ケースも多数カバーしているため、ドキュメントは 3000 ワード以上の長さになりました。解決策に進みましょう。


ソリューション - レコメンデーション エンジンの高レベルの動作

問題の解決策を 1 つずつ説明し、その後、システム全体の全体的な動作について説明します。

最初の問題は、ユーザーの興味を捉え、特定の興味に対するユーザーの興味レベルを定義することです。

このために、と呼ばれるものを作成しました。ソーシャルグラフ。簡単に言うと、ソーシャル グラフは、ソーシャル ネットワーク内のさまざまなエンティティ間の関係とつながりを保存します。これらのエンティティは、さまざまなユーザー、または特定の関心を持つユーザーの関係である可能性があります。ソーシャル グラフは、特定のシステム内の関係を理解して構造化するための強力な方法です。簡潔にするために、ソーシャル グラフについては詳しく説明しませんが、Google で調べて詳しく知ることをお勧めします。以下は、レコメンデーション エンジン用に構築したソーシャル グラフの簡易バージョンです。


ソーシャルグラフのサンプル

ソーシャルグラフのサンプル


上の画像からわかるように、インタラクション (いいね!、コメント、シェア) の数やこれらのインタラクションの最新性 (最後に発生した時期) など、多くの情報を 2 人のユーザー間の関係データとして、またユーザー間の関係データとして保存しています。ユーザーと興味。 2 つの異なる関心キーワード間の関係も保存しています。私が使用したアマゾン ネプチューンこのソーシャル グラフを保存するために、AWS によるマネージド グラフ データベースが使用されます。 Neo4j、JanusGraph、ArrangoDBなどの他のグラフ データベースを使用できます。


これらの興味のあるキーワードは主に名詞です。投稿内容をこれらのキーワード(名詞)に分解するシステムが整備されています。これはAWS comprehend を利用しています。機械学習を使用してテキストをエンティティやキー フレーズなどに分割する自然言語処理 (NLP) サービス。ここでも、マネージド NLP サービス (いくつか利用可能) を使用して同じことを実行できます。機械学習モデルを学習したりデプロイしたりする必要はありません。機械学習をすでに理解している場合は、確認してください。オープンソースの NLP モデルと Huggingface


2 番目の問題は、ユーザーの興味に基づいて高品質の推奨事項を生成することです。

次の図は、システムがどのように動作するかを概略的に示したものです。

レコメンデーション システムがどのように機能するかを簡略化した高レベルで表現したもの。

レコメンデーション システムがどのように機能するかを簡略化した高レベルで表現したもの。


上記は簡単そうに見えますが、各ステップではさらに多くの処理が行われており、システムが最適に動作するようにこれらのことを慎重に検討し、プログラムする必要があります。


段階的に説明しましょう:


ステップ 1 - 投稿コンテンツをベクター埋め込みに変換する

これらの推奨事項を生成するには、まず投稿のコンテンツを次のようなものに変換する必要があります。ベクトル埋め込み。最近、LLM、OpenAI(ChatGPT の作成者)、およびベクトルデータベース, ベクトル埋め込みは日常用語になりつつあります。これらが何であるか、またどのように機能するかについては詳しく説明しませんが、詳しく読むことを強くお勧めします。ただし、フィードの実行可能な候補を生成するには、コンテンツのプライバシーやモデレーション (冒涜的な言葉、虐待、性的コンテンツ、ハラスメントの削除、ブロックされたユーザーのフィルタリングなど) なども考慮する必要があります。


ベクター埋め込みを生成するには、ユースケースに応じて、OpenAI 埋め込みモデルAmazon titan 、または任意のオープンソーステキスト埋め込みモデルなどの著名な埋め込みモデルを使用できます。手頃な価格設定、パフォーマンス、操作の容易さのため、 Amazon Titanを選択しました。


ステップ 2 - ユーザーの関心を問い合わせる

さて、ここからが興味深いことになります。特定のビジネス ニーズに基づいてクエリを設計する必要があります。たとえば、特定のキーワードやユーザーとのエンゲージメントの数よりも、関心事項をクエリする際のエンゲージメントの最新性を重視します。また、複数の並列クエリを実行して、ユーザーのさまざまな種類の関心 (キーワードや他のユーザー) を見つけます。 1 人のユーザーに対して複数のフィードを生成するため、傾向に応じて特定のトピックを宣伝するクエリも実行します (たとえば、クリスマスが近づくとクリスマス関連の投稿が多く表示され、地震が発生した場合は地震関連の投稿が表示されます)。言うまでもなく、このトピックは、ユーザーが旅行の中でトピックにある程度の関心を示した場合にのみクエリ結果に表示されます。


したがって、ビジネス ユース ケースと推進したい動作に適したロジックを選択し、複数のクエリを実行して、ユーザーの関心事項すべてを含む十分な大きさのリストを取得します。


ステップ 3 - 見つかった興味に基づいて ANN 検索を実行する

ベクトル データベースは主に、と呼ばれる特定の種類の検索を実行するために使用されます。近似最近傍検索(ANN)。繰り返しになりますが、さまざまな関心を分類する方法、および 1 つの大規模な ANN 検索を実行するか、並行した差分検索を実行するかは、完全にユースケースとビジネス要件に基づく必要があります。最高のエンドユーザーエクスペリエンスを実現するために、コホートベースの検索以上のことを実行し、結果を順序付けすることをお勧めします (これについてはこのブログで後ほど説明します)。この場合、ANN 検索が行うことは、ユーザーの興味に似た (より近い) プラットフォーム上の他の投稿を見つけることです。


ステップ 4 - 結果を順序付けしてキャッシュ データベースに保存します。

解決する必要がある問題の 1 つは速度であるため、データベースをキャッシュします。特定のユーザーの投稿の一意の ID を保存するために、 redisソート セットを使用しました。ユーザーのフィード内の投稿の順序が重要であるため、redis ソートセットを使用しました。また、解決しなければならないもう 1 つの問題は、「システムには、同じ作成者からの投稿が同じページにグループ化されないようにするロジックが必要である」ということです。同じ作成者からのコンテンツの繰り返しを避けるために、特定の作成者の投稿が特定のユーザーのフィード (並べ替えられたセット) 内の任意の位置に挿入された場合に、同じ作成者からの別の投稿が挿入されないことを保証する単純なアルゴリズムを作成しました。連続する 10 個の位置に対して (エンド ユーザーにフィードを提供する際のページ サイズは 10 なので、複雑さを避けるために静的なままにしました)。


ユーザーの特定の推奨の順序を決定するために、次のことを考慮しました。


  1. このユーザーの特定の関心事 (または別のユーザー) との関係の強さ: ソーシャル グラフからさまざまなデータ ポイントを取得する算術式によって決定されます。これらはすべて、最後に作成された「いいね!」のタイムスタンプ、作成された「いいね!」の数、最後のコメントなどのエンゲージメント データです。ユーザーのエンゲージメント行動は、何かに対するユーザーの関心の指標です。


  2. プラットフォーム上の投稿の人気度:これを決定するために、エンゲージメント、エンゲージメントとインプレッションの比率、エンゲージメントを行ったユニーク ユーザーの数などのさまざまな要素を考慮してエンゲージメント スコアを生成するアルゴリズムを作成しました。プラットフォームレベルで投稿します。


一部のフィードでは人気を優先します。また、ソーシャル グラフを優先する場合もあります。しかし、ほとんどの場合、それらはすべて 2 つの健康的な組み合わせです。


システムの仕組み

image

上の図からわかるように、システムは意図的に非常にシンプルに保たれています。システムの仕組みは次のとおりです -


  1. ユーザー A が投稿を作成すると、投稿サービスはその投稿を保存した後、キューへのパブリッシュ/サブスクライブ イベントをトリガーします。このイベントは、候補生成用のバックグラウンド サービスによって受信されます。を使用しておりますGoogle Pub/Subパブリッシュ/サブスクライブ機能用。


  2. このバックグラウンド サービスはこれを非同期で受信し、プライバシー チェック、モデレーション チェック、キーワード生成など、前述した機能を実行してから、ベクトル埋め込みを生成してベクトル データベースに保存します。私たちが使用しているのはベクトルデータベースとしての AstraDB (後述)。


  3. メインの NoSQL データベースを更新した後、ユーザーがエンゲージメント (いいね!/コメント/共有など) を行うたびに、ポストサービスによってレコメンデーション エンジン サービスへのパブリッシュ/サブスクライブ イベントがトリガーされます。


  4. このレコメンデーション エンジン サービスは、グラフ データベースを更新し、ANN 検索を実行して Redis データベースを更新することで、ほぼリアルタイムでユーザーの推奨フィードを更新します。したがって、ユーザーが対話すればするほど、フィードの質は向上し続けます。推奨事項が特定のキーワードのリストに偏っていないことを確認するためのチェックがあります。これらのチェックは、Graph データベースにクエリを実行するときに実行されます。このサービスはエンゲージメント スコアも非同期的に更新します。エンゲージメント スコアは、投稿を閲覧しているユーザーについても再計算されます。


  5. 上記の手順はすべてバックグラウンドで非同期に実行されるため、これらの計算はエンドユーザー エクスペリエンスに影響を与えません。


  6. フィードは最終的にフィード サービスを通じてエンド ユーザーに提供されます。このサービスは Redis とメインの NoSQL データベースで検索を実行するだけなので (ディアンモDB )、P99 レイテンシは 110 ミリ秒未満です。これらのデータベースは両方とも、規模に関係なく、クエリ結果を 1 桁のミリ秒の遅延で返します。


使用されるツールとテクノロジー

  1. いくつかのサービスが書かれていますGo プログラミング言語、他の人はで書いていますNodeJS (タイプスクリプト付き)。


  2. 私たちが使用しているのはDatastax の AstraDBベクトルデータベースとして。私たちは、pinecone、milvusweaviateなど、他の複数のデータベースを評価した後、この決定に達しました。ベクトルやその他のデータ型に対する優れたクエリ機能とインデックス作成機能に加えて、お財布に優しいサーバーレス料金プランを提供します。これは、プラットフォーム上の他のいくつかの機能でデータベースとして使用する Cassandra エンジン上で実行され、開発者にとって非常に使いやすい CQL クエリ インターフェイスを提供します。ベクターのユースケースで試してみることを強くお勧めします。


  3. を使用しておりますGoogle パブ/サブスク現在の規模 (総ユーザー数が数十万人、毎日のアクティブ ユーザー数が数千人) では、費用対効果が非常に高いため、非同期通信に最適です。私はこれを数十万人のユーザー規模で実行し、毎秒数千のイベントを発生させました。うまく機能し、使用したり拡張したりするのも簡単です。


  4. レディス- スピード、シンプルさ、強力なデータ構造。なぜ 2024 年に redis なのかについては説明する必要はないと思います。


  5. DynamoDB - 繰り返しますが、これは拡張性が高く、使いやすく、サーバーレス モードで実行しています。このモードでは、1 分あたり数十万のクエリがあるにもかかわらず、合計請求額はかなり低くなります。また、非常に強力なインデックス作成機能と、読み取りおよび書き込みにおける 1 桁ミリ秒の遅延も提供します。


今後の課題

ご想像のとおり、これと同じ設定を微調整して、あらゆるユースケースに対応する基本的なレコメンデーション エンジンを構築できます。ただし、私たちのシステムはソーシャル ネットワークであるため、このシステムをより効率的にするために、将来的にはいくつかの調整が必要になります。


  1. ユーザーに最も関連性の高いキーワードとユーザーを予測するには、ソーシャル グラフ レベルで機械学習/深層学習アルゴリズムが必要になります。非常に新しい製品であるため、現時点ではデータセットが小さすぎて何も正確に予測できません。ただし、データが増加するにつれて、現在の単純なクエリと数式を機械学習アルゴリズムの出力に置き換える必要があります。


  2. さまざまなキーワードとユーザーの関係を微調整し、より細かくする必要があります。彼らは今、非常に高いレベルにいます。しかし、さらに深くする必要があるでしょう。まず推奨事項を絞り込むために、グラフ内の 2 次および 3 次の関係を調査する必要があります。


  3. 現在、埋め込みモデルの微調整は行っていません。近い将来それを行う必要があるでしょう。


エンドノート

このブログがお役に立てば幸いです。ご質問、疑問、ご提案がございましたら、お気軽にお問い合わせください。ツイッターリンクトインまたはインスタグラム。この記事を友達や同僚と共有してください。


ここでも公開されています。


L O A D I N G
. . . comments & more!

About Author

Aditya Kumar HackerNoon profile picture
This blog is meant for all those developers who want to learn how to build complex products from scratch. The ones that

ラベル

この記事は...

Read on Terminal Reader
Read this story in a terminal
 Terminal
Read this story w/o Javascript
Read this story w/o Javascript
 Lite
Also published here