こんにちは、ソウゾウで Software Engineering Intern をしている @r-okuda です。本記事では、インターンシップにて主に取り組んだショップ推薦システムの開発について、具体的にどのようなことに取り組んだか、またインターンシップとして過ごした約 3 ヶ月間の感想をお伝えしたいと思います。ソウゾウのインターンシップや新卒入社に興味がある方の参考になれば幸いです。
ショップ推薦機能とは
ソウゾウでは、メルカリShops という個人ではなくショップとして商品を販売できるサービスを提供しています。メルカリアプリ内の「ショップ」タブから簡単に閲覧・購入ができます。地方の美味しい野菜を農家さんから直接買うことができたり、メルカリとは少し違ったラインナップとなっています。また、ショップをフォローすると通知を受け取れるため、気になるショップの情報を随時確認しやすくなります。
今回のインターンシップでは、ショップをフォローした際に「おすすめの関連ショップ」としてそのショップに類似したショップ郡を表示する機能を担当しました。この機能は 2022 年 5 月下旬にリリース済みです。
ショップ推薦機能のシステム構成
メルカリShops は、Microservice アーキテクチャを採用しており、それぞれのサービスは Cloud Run 上で動いています。フロントエンドは Web ベース、BFF として GraphQL サーバー、そして Backend は Go や Python で稼働する Microservices 群となっています。
ショップ推薦機能の大まかなシステム構成は以下の通りです。内部的にショップは、Shop ID という一意の ID によって識別されます。
Client からの request を BFF 経由で受けた Microservice が Shop ID に対応する Feature Vector を Big Table から取得し、その後 Feature Vector を用いて Vertex AI Matching Engine で近傍検索を行います。そして検索結果として得られる類似 Shop の ID 一覧を一部フィルタリングした上で再度 BFF を通じて Client に response として返します。なお Big Table 上の Feature Vector は定期更新しており、Client からの request 時に計算が行われないようにしています。
ショップ推薦の方法
今回は similarsearch service という Microservice にショップの推薦機能を追加しました。
推薦では類似度が高い順にショップを表示しています。ショップの類似度を決める上で、2 つの方法が考えられます。1 つ目は各ショップで出品された商品のデータを利用し「類似した商品を販売するショップ同士は類似していると見なす」方法です。2 つ目は、ユーザーのフォローに関するデータを用いて「類似したユーザー同士が共通でフォローするショップ同士は類似していると見なす」方法です。similarsearch service では既に、類似商品を返す仕組みが実装されており、1つ目の方法に必要な類似商品に関するデータが存在しています。一方、2 つ目に必要なユーザーのフォローに関するデータ数が開発時点では十分でなく、今回は 1 つ目の方法を選択しました。
実際に用いた「類似した商品を販売するショップ同士は類似していると見なす」方法は前項で触れたように Feature Vector の近傍検索によって実装されています。今回は、類似したショップの Feature Vector 同士が近傍に来るようにそれらを計算しています。具体的には、ショップの Feature Vector を、出品している商品の Feature Vector の平均値としています。
上述の方法では、ショップとその Feature Vector を一対一対応させています。そのため、全く異なる傾向の商品を同一のショップで出品している場合、Feature Vector の値が不適切となる可能性があります。以下に Feature Vector のイメージ図を掲載します。例えばあるショップが牛肉 (右上) と 服 (左下) 両方を出品している場合、ショップの Feature Vector は青星 (中央) に位置します。しかし、この位置には本来果物を出品しているショップの Feature Vector が存在するはずです。その結果、肉と服を出品しているショップの類似ショップとして果物を出品しているショップが推薦される可能性があります。
この点については、商品のカテゴリ毎にショップの Feature Vector を計算し、1 つのショップに複数の Feature Vector を割り当てることで改良される見込みです。上図では、青星ではなく、赤星 2 つ (左下 / 右上) をショップの Feature Vecor として、それぞれで近傍検索することに相当します。また、 将来的にはデータが増え、今回用いなかった「類似したユーザー同士が共通でフォローするショップ同士は類似していると見なす」方法を併用することも可能だと思われます。
インターンシップの感想
ソウゾウではインターンでも目的に向けて裁量をもって働けると感じました。インターンを通じて、開発だけでなく推薦手法の検討や PM とのコミュニケーションまで幅広く担当させて頂きました。これは、「タスクの流れを理解しながら開発したい」という当初の目的に沿ってメンターの方等にサポートして頂いたおかげです。
カルチャー面では、単なる進捗報告だけでなく本質的なコミュニケーションを行う土壌があります。例えば、毎朝のメンターとのミーティングや毎週のマネージャーとのミーティングにおいて、様々なフィードバックを頂きタスクを進めるスピードや情報共有の仕方について自身の考えを見つめ直す契機を得ました。また、コミュニケーションの粒度や方法も互いのスタイルを踏まえて随時調整されるため、快適に働けました。
開発においても、エンジニアの人数に比してドキュメントやインフラへの投資が積極的に行われていました。数人のチームでも Design Doc の作成や Code Review を行っています。Slack で質問した際にメンションされていない方でも進んで返信して下さるため、ジュニアなエンジニアでも開発を心配し過ぎる必要はないと思います。
—–
ソウゾウではインターンシップの学生を募集中です。興味のある方の応募をお待ちしております。
Software Engineer (Internship) – Mercari Group (※新卒採用に応募するには、まずインターンへの参加が必要です。)