🎯

Vertex AI Vector Search でレコメンド機能を作って本番サービスに投入した話 | TrustHub テックブログ

2024/06/21に公開

トラストハブ AI チームの中村です。

今年の1月頃に、弊社(トラストハブ)が提供する「Clove オリパ」というサービスで商品(オリパ)のレコメンド機能[1]を実装しました。いわゆる「この商品を買った人はこんな商品も買っています」機能で、商品購入後に類似の商品をユーザーに推薦することで、ユーザーの購買意欲を促進させるのが目的です。

https://oripa.clove.jp/oripa/All

レコメンド機能の裏側で動いているのがベクトル検索です。Clove オリパでは、ユーザーの過去の購買履歴をもとに商品(オリパ)をベクトル空間に埋め込み、そのベクトルの近さによって商品(オリパ)の類似度を測っています。


Clove オリパの類似商品レコメンド機能

この記事では、ベクトル検索の基本概念からはじめ、Google Cloud Platform が提供するベクトル検索サービス Vertex AI Vector Search について、その特徴などを詳しく解説していきます。

ベクトル検索とは

ベクトル検索とは、データをベクトル空間に埋め込んで(= ベクトル化)、その空間内でベクトル間の距離もしくは類似度を尺度に、近いベクトルを検索する技術です。例えば、テキストや画像などを意味のある実数値ベクトルに変換し、そのベクトル同士の近さを測ることで、テキスト検索や画像検索が実現できます。これにより、単純なテキストマッチングやタグ検索よりも柔軟で高精度の検索が可能になるわけです。

弊社ではこのベクトル検索をさまざまな領域で活用しており、冒頭でも述べた通り Clove オリパの類似商品レコメンド機能にもこのベクトル検索の技術を用いています。過去の購買履歴を学習データにした機械学習アルゴリズムを用いて商品(オリパ)をベクトル化し、対応するベクトルの近さによって検索することで、購入した商品に最も近い上位3つの商品を購入後に推薦しています。なお、このベクトル化の機械学習アルゴリズム詳細については、また後日別の記事で詳しく解説しようと思っています。

検索部分をサービングするシステムについて検討を重ねた結果、弊社では多くのサービスを Google Cloud Platform にて開発していることもあって、同プラットフォームから提供されている Vertex AI Vector Search というサービスに着目し、これを用いてベクトル検索エンジンを構築することになりました。

Vertex AI Vector Search とは

Vertex AI Vector Search とは、Google Cloud Platform が提供する近似最近傍探索 (ANN: Approximate Nearest Neighbor) を実行するためのサービスです。なお、以前は Vertex AI Matching Engine という別名サービスだったようで、最近になって Vector Search という名称に変わりました。

https://cloud.google.com/vertex-ai/docs/vector-search/overview?hl=ja

近似最近傍探索とは、その名の通り最近傍探索を近似的に計算するための手法です。最近傍探索はまさに今回のような類似商品レコメンド機能に必要で、検索クエリベクトルと最も近いベクトルを探索して引き当てるアルゴリズムです。しかし、最近傍探索にかかる計算量はベクトルの個数と次元に比例するので、大規模なデータセットで正確に実行するのは困難になります。そこで、一定の精度を犠牲にしても高速に近似的な解を得る近似最近傍探索の技術が重要になるわけです。

なお、公式ドキュメントの説明によると、Vertex AI Vector Search では Google Research が開発した ScaNN という近似最近傍探索のアルゴリズムが採用されており、ベンチマークテストでは優秀な数値を出しているようです。

https://research.google/blog/announcing-scann-efficient-vector-similarity-search/

Vertex AI Vector Search の特徴

このようなベクトル検索機能を持つサービスは他にも様々ありますが、Vertex AI Vector Search には正確で柔軟な検索機能を実現できる特徴がいくつかあります。

特徴1:高い再現率 (Recall)

近似最近傍探索はただ早ければ良いというわけではなく、その近似の正確さも重要になります。モデルの正確さを測る指標の一つに再現率 (Recall) というものがあり、検索クエリに対して近似探索の結果に含まれる真の最近傍の割合(のテストデータに対する平均値)で定義されるものです。Vertex AI Vector Search の再現率について、公式ブログ記事には次のように説明されています:

Google 社内のチームによる実証的な統計によると、多くの実世界のアプリケーションにおいて、Vertex Matching Engine は 95~98% の再現率を達成し、10ms 以下で 90 パーセンタイルのレイテンシで結果を提供できることがわかっています(Google Cloud 社内調査、2021 年 5 月)。

https://cloud.google.com/blog/ja/products/ai-machine-learning/vertex-matching-engine-blazing-fast-and-massively-scalable-nearest-neighbor-search

特徴2:フィルタリング機能

アイテムの検索において、特定の属性に限定して検索結果を出力したい、という場合があると思います。例えば、ユーザーがECサイトで欲しい「靴」の検索をする場合の「27.0cm のサイズが欲しい」「あるブランドの靴は欲しくない」などといった絞り込み検索がその例です。

この要望に応えてくれるのが Vertex AI Vector Search のフィルタリング機能です。例えば、次のようにして Vertex AI Vector Search の Index に属性付きのベクトルを登録することができます。

{
  "id": "item_id_012",
  "embedding": [0.5, 1.0],
  "restricts": [  # フィルタリング機能
    {
      "namespace": "size",
      "allow": ["27.0"]
    },
    {
      "namespace": "brand",
      "allow": ["NIKE"]
    }
  ]
}

これは、Vertex AI Vector Search の Index にベクトルを登録する際に用いる入力データの一部です。学習済み機械学習アルゴリズムでベクトル化したベクトルの値を embedding に入力します。アイテムの属性は restricts で定義することができ、今回は靴のサイズ (size) は 27.0cm で、靴のブランド (brand) は NIKE (NIKE) という場合の入力データ例となっています。

補足:今回はデータ構造を見やすくするために JSON のフォーマットを調整していますが、Vertex AI Vector Search の Index に登録する際には所定の構造に従った書き方をする必要があります。詳しくは公式ドキュメントを参照してください。

https://cloud.google.com/vertex-ai/docs/vector-search/setup/format-structure?hl=ja

特徴3:クラウディングタグ機能

レコメンドの指標の一つに「多様性」というものがあります。例えば、ユーザーに似たようなアイテムばかりをレコメンドすると、ユーザーが飽きてしまうことは容易に想像できるでしょう。検索結果のカテゴリや属性に偏りを持たせないための指標が多様性で、レコメンド機能でユーザー体験を下げないためにも多様性は重要な指標の一つです。

この「多様性」の改善に役立つのが、Vertex AI Vector Search のクラウディングタグ機能です。例えば、ECサイトにおける「靴」の検索機能の要件定義が「検索結果はさまざまな色の靴を含んでいて、しかしサイズやブランドによる絞り込み機能もあることが望ましい」というものだったとしましょう。この場合、例えば先ほどの「靴」の例で用いた入力データに次のようにして赤色 (red) の属性を付与させることができます。

{
  "id": "item_id_012",
  "embedding": [0.5, 1.0],
  "restricts": [  # フィルタリング機能
    {
      "namespace": "size",
      "allow": ["27.0"]
    },
    {
      "namespace": "brand",
      "allow": ["NIKE"]
    }
  ],
  "crowding_tag": {  # クラウディングタグ機能
    "crowding_attribute": "red"
  }
}

このようにデータポイントを Index に登録させることで、例えば検索クエリにおいて
per_crowding_attribute_num_neighbors = 3 を設定すると、検索結果で返ってくる同じ色の靴を3足以下に抑えることができます。これが検索の多様性を向上させるためのクラウディングタグ機能の使い方です。

プロダクション利用した感想

先述した通り、Clove オリパの類似商品レコメンド機能はこの Vertex AI Vector Search を用いて構築されています。既にリリースから半年が経とうとしている現在、実際に使ってみて感じた良かった点と反省点をまとめてみます。

良かった点

ベクトル値のストレージと検索エンジンを兼ねている点が便利

Vertex AI Vector Search は、ベクトル値を保存するストレージ機能と、それを用いて高速に検索する検索エンジンを一体化しています。データ管理と検索を統合的に扱えるので、システムの複雑さを減らすことができたのは、導入してみて良かった点かなと思います。

フィルタリング機能が便利で使いやすい

例えば、今回 Clove オリパの類似商品レコメンド機能では、将来販売予定・現在販売中という状態がある中で、現在販売中の商品(オリパ)に絞ってベクトル検索する必要がありました。先述の通り、Vertex AI Vector Search にはフィルタリング機能が備わっていたので、これを活用して簡単に商品(オリパ)を状態別に絞り込んだレコメンドが実現できました。

反省点

近似最近傍探索のメリットを最大限に享受できていない

将来販売予定・現在販売中の商品(オリパ)に限定しても、商品数は高々1000個しか存在しません。Vertex AI Vector Search は大規模なデータセット内でも高速かつ正確な近似最近傍探索が可能なことが強みなのですが、それを活かすシチュエーションではなかったというのが反省点の1つです。今回はベクトルの次元もそこまで高次元だったわけでもないので、これくらいの商品数であれば brute-force search で実装しても良かったのかなと思ってます。

しかし、今後あらゆるジャンルのトレーディングカードの汎用検索エンジンを実装することになったら、今度こそ大規模なデータセットになることが想定されるので、Vertex AI Vector Search に再びお世話になる可能性が高いでしょう。

まとめ

  • Vertex AI Vector Search は近似最近傍探索ができるサービス
    • 大規模なデータセット内でも高速かつ正確な検索が実現できる
    • 豊富な機能が備わっており、柔軟な検索機能の実装が可能

次回の記事では、今回紹介した Vertex AI Vector Search のインフラを Terraform を用いて構築する方法について解説したいと思います。

お知らせ:トラストハブ AI チームでは現在、サマーインターン生を募集しています!興味のある方は以下のリンクから応募してみてください!

https://www.notion.so/2024-3-40-24949c1a1df44215ad49fdd5891d70f6

脚注
  1. 2024年6月現在ではカテゴリー「ポケモン」の一部の商品のみに実装されています。今後、対応商品は徐々に拡大予定です! ↩︎

TrustHub テックブログ

Discussion