類似商品レコメンド機能、その後

こんにちは!ソウゾウ機械学習チームのSoftware engineerの@wakanapoです。
メルカリShops [フライング] アドベントカレンダー2022」の17日目を担当します。

以前のTechBlogでメルカリShopsでの類似商品検索機能の開発について紹介しました。類似商品検索APIはこのあと、類似商品レコメンド機能として、実際のプロダクトでリリースされました
今回のTechBlogでは、リリースからの約8ヶ月の間に行ったこの機能に対する改善について紹介します。前回のブログの続編になりますので、ぜひ先にこちらを御覧ください。

類似商品検索APIと類似商品レコメンド機能

まず、類似商品検索APIと類似商品レコメンド機能について改めて紹介します。
類似商品検索APIは、その名の通り似ている商品を検索できるAPIです。商品の名前・説明文・カテゴリー名のテキストをベクトルに変換し、そのベクトルをクエリとして検索することで、ベクトル的に近似している商品のIDを取得することができます。
システムとしてはGCPのマネージドな近似最近傍探索エンジン VertexAI Matching Engine を使用しています。

類似商品レコメンド機能は、この類似商品検索APIを利用して、商品ページでその商品と類似する商品をおすすめする機能です。「この商品を見ている人におすすめ」という名前で提供されています。2022年3月末にリリースされ、お客さまは似ている商品を比較しながら買い物を楽しむことができるようになりました。

改善1: レコメンドのRe-ranking

1つ目の改善となったのがレコメンドのRe-rankingです。具体的にはAPIから取得した類似商品を直近のCVRが高い順に並べ替えて表示するというもので、7月頃にABテストを実施しました。

正直なところ、個人的にはこの提案に懐疑的でした。というのも、類似商品検索APIを開発する際に、レコメンドを想定してモデルを作成していたからです。例えば、みかんを見ているお客さまに、他のみかんだけでなく、伊予柑や金柑、ときにはりんごをおすすめするようなモデルを目標としました。見た目ではなく概念的な類似度を使うために、テキスト特徴量を用い、モデルとしてはWord2vecを採用しました。最終的にかなり目標に近いモデルを作成できたと思っています。そのため、直近のCVRで並べ替えるよりも、もとの類似度順のほうがいいのではないかと思っていました。

とはいえ誰にも正解はわからないので、物は試しということでABテストを行いました。
このときの実際のレコメンドはこの様になっていました。

これは、クレープをクエリとしたときのレコメンド結果です。類似度順・CVR順ともに、シフォンケーキやスコーンなどの洋菓子がおすすめされています。しかし、類似度順では味違いやサイズ違いのほぼ同一の商品が並んでしまっており、Re-rankingによってそれが改善されたためにRe-rankingのほうがよく見えます。

一方こちらは、レトルトのカレーをクエリとしたときのレコメンドです。類似度順・CVR順ともに、カレーやレトルトの食品などが並んでいます。この例の場合は、Re-rankingすることで概念的にすこし遠いものが上位に来てしまい、カレーを見ている人に一番にポタージュをおすすめするようになっていました。

ABテストの結果は下図のようになりました。ソウゾウではベイジアンABテストを用いて検証しています。
ベイジアンABテストに関しては、同僚の@nkatoさんがブログで紹介しているので詳細はそちらを御覧ください。

平均決済回数

Win Rateは CVRによるRe-rankingの勝率を表しています。平均決済回数では61%の確率でRe-rankingしたほうが良い結果が得られることがわかりました。GMVなど他の指標に関しても、Re-rankingのほうが上回ったため、Re-rankingを採用することが決まりました。

改善2: モデルの再学習

2つ目の改善として、Word2vecモデルの再学習を行いました。最初にモデルを作成した際には、メルカリShopsのリリースからまだ日が浅かったため数ヶ月分のデータでモデルを学習していました。その後時間が立ち、出品数も日に日に増えてきたので、再学習を行いました。約1年分のデータをサンプリングして用いています。

また、モデルの作り直しに伴い、新しいモデルは元のモデルとベクトル空間が異なる可能性があるためリリースする際にはindexごと作り直しを行いました。


類似商品検索APIのIndexingのシステムは、このように (1)商品の出品・編集イベントを受け取り商品情報から特徴ベクトルを抽出し保存する部分(図のオレンジ部分)と、(2)保存されている特徴ベクトルを元にIndexingを行う部分(図の青部分)があります。(1)はStreamingでニアリアルタイムで、(2)はバッチで実行されています。

検索の際には、保存されている特徴ベクトルをクエリとして使うため、保存されている特徴ベクトルと、Indexの特徴ベクトルが同じモデルによって作られたものである必要があります。そのため、ベクトルの不整合が起こらないようにStreaming部分とBatch部分のリリースの順序など、念入りにプランを練ってindexの作り直しを行いました。結果として問題なく完了させることができましたが、手順を間違えることなく2つのpipelineをリリースするのは心理的にも作業的にも手間のかかる作業でした。

改善3:Streaming Indexing

3つ目の改善は、IndexingのStream対応です。もともとMatching EngineではBatch Indexingしかサポートされていませんでしたが、2022年9月にStreaming Indexing がサポートされました。
Streaming Indexingを使うと、商品が出品・編集・削除されたタイミングでニアリアルタイムで検索に反映させることができます。これによって、出品したらすぐに検索に追加されるのはもちろん、商品がすでに削除されているのに検索結果に含まれてしまうといったこともなくなります。

Streaming Indexingを使うもう一つの大きなメリットはシステムを簡単にできることです。これまで、Vectorを生成するStream処理と、IndexingのBatch処理の2つの部分に分かれてしまっていましたが、IndexingもStreamで行えば、1つのPipelineで完結することができます。

Vector生成もIndexingも1つのPipelineで行われるため、モデルを変更し、Indexの作り直しが必要になった際にも、VectorとIndexの不整合を気にすることなく、Pipelineを1つリリースし直すだけですみます。
これらの利点を考慮して、現在Streaming Indexingのリリース準備を進めています。                

まとめ

類似商品レコメンド機能から8ヶ月、様々な改善を実施してきました。今後もさらに改善を重ね、より多くのお客さまに素敵な商品をおすすめできる機能にしていきたいと思っています。


株式会社ソウゾウではメンバーを大募集中です。メルカリShopsの開発やソウゾウに興味を持った方がいればぜひご応募お待ちしています。詳しくは以下のページをご覧ください。
Software Engineer
Software Engineer, Site Reliability
Software Engineer (Internship) – Mercari Group (※新卒採用に応募するにはまずインターンへの参加をお願いしています。)
またカジュアルに話だけ聞いてみたい、といった方も大歓迎です。こちら の申し込みフォームよりぜひご連絡ください!

  • X
  • Facebook
  • linkedin
  • このエントリーをはてなブックマークに追加