コンテンツに移動
デベロッパー

「メルカリShops」を支える Google のベクトル検索技術

2022年6月17日
https://storage.googleapis.com/gweb-cloudblog-publish/images/Google_Cloud_7fdTm09.max-2100x2100.png
野上 和加奈

株式会社ソウゾウ(メルカリグループ) ソフトウェアエンジニア

佐藤 一憲

グーグル合同会社 デベロッパーアドボケイト

※この投稿は米国時間 2022 年 6 月 17 日に、Google Cloud blog に投稿されたものの抄訳です。

メルカリは、日本で 2,000 万人超、米国で 約566 万人の月間アクティブ ユーザーを持つ、近年最も成功しているマーケットプレイス サービスのひとつです。2021 年 10 月、メルカリは小規模のビジネスオーナーや個人がスマートフォンひとつでネットショップをEC ポータルを開設できる新サービス「メルカリShops」 を日本で開始しました。この新サービスの開発に際しては、「類似性」を利用した新しいマーケットプレイスの実現に Google のベクトル検索技術が導入されています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image5_xbXAiUs.max-1700x1700.png
2000万人以上の月間アクティブ ユーザーがいるメルカリ

ショップを集めただけではマーケットプレイスにはならない

立ち上げ当初の「メルカリShops」は、小さな EC サイトの集まりにすぎず、ユーザーは各ショップを 1 か所ずつ開いては販売されている商品を見ていく必要がありました。いちいちトップページに戻ってはショップを選びなおすのは面倒な作業で、このサービスの最も重要な価値である「ユーザーが楽しく買い物ができる体験」が失われてしまいます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image8_VYaPTAB.max-600x600.png

以前の「メルカリShops」 の課題:

ユーザーは個々のショップの商品しか見られなかった

ユーザーは、指先ひとつの操作でさまざまなショップの何百もの商品を横断して閲覧できる「スマートフォン上のリアルなマーケットプレイス」のようなものを望んでいます。しかし、その体験を実現するために、商品間の関係をどのように管理すればよいでしょうか? 従来のマーケットプレイスではこれを実現するために、数千の販売者で共有される膨大な数の商品カテゴリや品番を慎重に定義し、それをサポート スタッフの手作業で保守し続ける必要があります。また、販売者は出品する商品ごとに正確なカテゴリを検索し、選択する必要があります。こうした従来の方法では多大な運用コストがかかる上に、「誰でもスマートフォンひとつで手早く EC サイトを作れる」という「メルカリShops」 のもう一つの大きな価値が失われてしまいます。

では、リコメンデーション技術をこの関係の構築に利用できないのでしょうか? 協調フィルタリングなどの一般的なリコメンデーション アルゴリズムでは、多くの場合、商品の推薦のために大量の購入履歴やクリック履歴が必要とされます。そのため、新しい商品や、既存の商品と関係のないロングテールの商品をおすすめする場合にはうまく機能しません。また、協調フィルタリングは、「多くの顧客がこの商品も購入または閲覧している」というような項目間の関係性を「記憶」するだけの仕組みです。つまり、商品の説明や名前、画像など多くの特徴量から何らかの「知見」を得て推薦を行っているわけではありません。

そこでメルカリは、これら既存の手法ではなく、「類似性」を利用してショッピング モールを作るという新しい方法を導入することにしました。

類似性が生み出す新しいマーケットプレイス

類似性とは、具体的にはどのような意味でしょうか。例えば、「新鮮」という概念に対して 10%、「野菜」という概念に対して 2%、「トマト」という概念に対して 30% の「近さ」を持つ商品を表すために、(0.1、0.02、0.3)の 3 つの要素を持つベクトル(数値のリスト)を定義できます。このベクトルは、「新鮮なトマト」という商品の意味を表しています。ベクトルの近くに存在するベクトルを検索すると、こうした商品と同様の意味を持つ他の「新鮮なトマト」を見つけることができます(なお、これはベクトル検索の概念を単純化した説明であり、実際のベクトルはもっと複雑なベクトル空間を持ちます)。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image13_aLP1Vah.max-1100x1100.png
ベクトル検索で似ている意味を持つ商品を探す

このベクトル間の類似性を利用すれば、「メルカリShops」 のマーケットプレイスで「意味が似ている商品」を閲覧できます。何千もの出品者の何百万もの商品間の関係を管理するために、商品 カテゴリや SKU を手動で定義し更新する必要はありません。その代わり、販売者が新しい商品を追加したり更新したりするたびに、機械学習(ML)アルゴリズムが各商品から自動的にベクトルを抽出します。これは Google 検索や YouTube、Google Play などのサービスにおいて関連するコンテンツを見つけるために使われているのとまったく同じで方法であり、ベクトル検索と呼ばれています。

このテクノロジーにより、「メルカリShops」 のユーザーは、異なるショップが販売する関連商品を同じページで簡単に閲覧できるようになりました。

https://storage.googleapis.com/gweb-cloudblog-publish/original_images/image4_5zw2se7.gif

類似性で構築されたマーケットプレイス: 

ユーザーは関連商品をすばやく閲覧できる

Matching Engine でベクトル検索が簡単に

では、メルカリがベクトル検索の技術を使ってどのようにマーケットプレイスを構築したのかを見てみましょう。同社内でのデータ分析の結果、商品画像などの他の特徴に比べ、販売者が書いた商品の説明文が商品の価値を最もよく表していることがわかりました。そこで、商品の説明文を用いて、各商品の特徴ベクトルを抽出することにしました。つまり「メルカリShops」 で販売される各商品を「商品説明文の意味の類似性」によって関連付ける仕組みです。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image11_hQM7sg9.max-1400x1400.png
商品説明文からの特徴ベクトルの抽出

テキストの特徴ベクトルは、word2vec モデルと TF-IDF の組み合わせで抽出します。BERT など他のモデルも試しましたが、シンプルで軽量、予測にかかる GPU コストが少なく本番環境での利用に適していることから word2vec を採用しました。

しかし、もうひとつ別の課題がありました。本番環境用のベクトル検索基盤の構築作業です。かつてメルカリは、画像検索サービスのベクトル検索をゼロから独自に構築していましたが、専任の DevOps エンジニアを配置し、Kubernetes サーバーの構築、サービスの設計、保守を行うなど、相当の時間とコストを要しました。また、継続的にインデックスを更新するためのデータ パイプラインの構築と運用も必要でした。検索結果の鮮度を保つためには、データ パイプラインを使って 1 時間ごとに新しく追加された商品でベクトル検索のインデックスを更新する必要があります。このパイプラインでは過去に問題が発生し、DevOps エンジニアのリソースを消費することもしばしばありました。これらを考えると、限られたリソースの中で、「メルカリShops」 向けに新たなベクトル検索基盤を実装することは不可能に近い状況でした。

そこで代替策として、Vertex AI Matching Engine を導入しました。これは Google 検索、YouTube、Play など、Google の主要なサービスと同じベクトル検索バックエンドを利用できるフルマネージド サービスです。そのため、基盤をゼロから実装し、メンテナンスし、インデックス更新のパイプラインを自分で設計して運用する必要はありません。Google の最新のベクトル検索技術の応答性、正確性、スケーラビリティ、可用性のメリットをすぐに得られます。

特徴抽出パイプライン

「メルカリShops」 の商品検索サービスは、1)特徴抽出パイプラインと 2)ベクトル検索サービスという 2 つのコンポーネントで構成されています。各コンポーネントの動作を見てみましょう。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_copy_3.max-1700x1700.png
特徴抽出パイプライン

特徴抽出パイプラインは Vertex AI Pipelines で定義されています。これは Cloud SchedulerCloud Functions によって定期的に呼び出され、以下の処理が開始されます。

  1. 商品データの取得: 更新された商品データを取得するためにクエリ BigQuery を作成

  2. 特徴ベクトルの抽出: word2vec モデルでデータに対して予測を行い、特徴ベクトルを抽出

  3. インデックスの更新: Matching Engine API を呼び出し、特徴ベクトルをベクトル インデックスに追加。ベクトルも Cloud Bigtable に保存

Vertex AI Pipelines における特徴抽出パイプラインの実際の定義は以下の通りです。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image2_copy_2.max-1200x1200.png
Vertex AI Pipelines における特徴抽出パイプラインの定義

ベクトル検索サービス

2 つ目のコンポーネントは、次のように動作するベクトル検索サービスです。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image12_Lg2DsVZ.max-1300x1300.png

ベクトル検索サービス

  1. クライアントがクエリを行う: クライアントが Cloud Run フロントエンドに商品 ID を指定したクエリを作成

  2. 特徴ベクトルを取得する: Bigtable から商品の特徴ベクトルを取得

  3. 類似の商品を検索する: Matching Engine API を使って、類似性の高い特徴ベクトルを持つ商品を検索

  4. 類似の商品を返す: 類似した商品の ID を返す

Matching Engine を導入したことで、「メルカリShops」 は本番環境のベクトル検索サービスを 2 か月で構築できました。サービス開始後 1 か月が経過した現在までインシデントは発生していません。開発から本番環境まで、一人の ML エンジニア(本記事の著者)のみがサービス全体を実装し、運用しています。

今後の展望

今回の導入成功を足がかりとして、「メルカリShops」 は、さらなる機能追加や今後の E コマース プラットフォーム事業への展開に取り組んでいます。たとえば、Matching Engine は、検索結果に簡単なフィルタをかけるフィルタ ベクトル マッチ機能を備えています。  この機能により、例えば販売中の商品のみを表示することや、特定のショップの商品を除外して表示することが可能です。また、Matching Engine は近日中にストリーミング インデックスの更新に対応し、販売者が商品を追加すると同時にユーザーが商品を検索可能になる予定です。さらに Vertex AI Feature Store は、Cloud Bigtable に代わる特徴ベクトルのリポジトリとして、またサービス品質におけるより良いオブザーバビリティのための特徴モニタリングなどの追加機能として魅力的です。

メルカリは、こうした Google Cloud のテクノロジやプロダクトを利用することで、新しいアイデアをより少ない時間とリソースで実現し、ビジネスに大きな付加価値を与えることができます。

- 株式会社ソウゾウ(メルカリグループ) ソフトウェアエンジニア 野上和加奈

- グーグル合同会社 デベロッパーアドボケイト 佐藤一憲
投稿先