ペパボ研究所 研究員/プリンシパルエンジニアの三宅(@monochromegane)です。 本記事では、ベクトル検索システムに機械学習モデルで算出した指標を組み合わせることで、検索結果を柔軟に制御し、サービス指標に沿った最適化を実現するアプローチについて紹介します。
はじめに
情報システムとAIの統合において、互いの知識を効率的に引き出すための、ベクトル検索システムの重要性が増しています。ベクトル検索は、画像やテキストなどの多様なデータを高次元の埋め込みベクトル空間に写像し、その距離に基づいて類似性を評価することで、高速かつ柔軟な検索を実現します。近年では、汎用的で商用利用可能な学習済みモデルが提供されていることも後押しとなり、こうした技術はさまざまなオンラインサービスやアプリケーションで広く導入されています。
一方で、これらの検索機能をサービス価値に直結させるためには、単に「見た目や意味が似ている」だけでなく、サービスのビジネス指標や利用目的に沿った検索結果を得られることが望まれます。例えば、サービス規約との照合や、サービス固有の重み付けを行いたい画風の検出などが考えられます。しかし、学習済みモデルでは、このような最適化に十分対応できない場合があります。
このような最適化を実現するためには、サービス固有の判断基準を取り込んだ埋め込みモデルや再ランキングモデルの学習が考えられます。ただし、そのためには適切な学習データの収集や開発コストの確保が必要であり、特に開発初期段階では現実的でない場合も多いかと思います。また、設計段階で定めた基準が本当にビジネス指標に有用かどうかは、適用後にしか確かめられないという課題もあります。
そこで本記事では、既存の埋め込みベクトルを維持したまま、別軸の機械学習モデルによって算出される指標を導入し、検索結果をフィルタリングするというアプローチを紹介します。この方法では、埋め込みベクトルに対して外部のモデルで得られたスコアやカテゴリラベルを付与し、必要な条件に基づいてサブセットを抽出します。単一の指標を対象とするため、軽量かつ迅速な機械学習モデルの開発が可能であり、既存の検索基盤と容易に統合できる点が特徴です。さらに、このような方式によって有用性が確認された指標を埋め込みモデルの開発へとフィードバックすることで、試行錯誤の無駄を減らし、効率的な運用サイクルを実現できます。
本記事では、このような構想のもと、Google Cloud上で実際に構築したシステムの概要と、その設計上の考慮点について解説します。
システム構成
本システムでは、ベクトル検索システムとしてGoogle Cloud上に構築したVertex AI Vector Searchを用いています。ベクトルインデックスの各データポイントに対してベクトル属性を付与することで、検索結果のフィルタリングを実現しています。このベクトル属性を付与するために、同じくGoogle CloudのVertex AIプラットフォーム上に登録した推論用モデルを活用し、バッチ推論の仕組みを用いて属性値を生成します。
推論用モデル
Vertex AIでは、独自に構築した推論用モデルを構成することができます。推論用モデルには、機械学習フレームワークが指定されたビルド済みコンテナと、独自に構築するカスタムコンテナの2種類が利用可能です。本システムでは、迅速な評価検証を目的として、自由度の高いカスタムコンテナを採用しています。
推論用モデルを構築するには、次の 2 種類のコンテナイメージが必要です。
- 学習用コンテナ:機械学習モデルのトレーニングおよびモデル重み(モデルアーティファクト)のエクスポートを行う。
- 推論用コンテナ:学習で得られたモデルアーティファクトをロードし、推論用の HTTP サーバーを起動する。
Pythonのgoogle.cloud.aiplatformパッケージを使用する場合、工程1はaiplatform.CustomJob(opts).run()、工程2はaiplatform.Model.upload(opts)のように実行します。
工程2の実行後Vertex AIのModel Registryに推論用モデルとして登録されます。登録されたモデルは、後述するように、エンドポイントと紐付けてオンライン推論に利用することも、バッチ推論に利用することもでき、用途に応じた柔軟な運用が可能です。
実装時の注意点
推論モデルの実装にあたっては、以下の点に注意が必要です。バッチ推論時には、明示的に予測およびヘルスチェック用のパスを Model Registry 登録時のコンテナ仕様として設定する必要があります。オンライン推論では、これらのパスが環境変数 AIP_PREDICT_ROUTE および AIP_HEALTH_ROUTE により自動的に設定されますが、バッチ推論の場合はこれらを明示的に指定しなければなりません。
これは以下のように指定できます。
aiplatform.Model.upload(
# ...
serving_container_predict_route="/predict",
serving_container_health_route="/health",
# ...
)
Vertex AIのバッチ推論
Vertex AIでは、構築した機械学習モデルの推論方式として、オンライン推論とバッチ推論のいずれかを選択できます。本システムでは、インデックス対象となるデータポイントがあらかじめ定まっており、かつデータ数が多いため、推論にはバッチ推論を採用しています。
バッチ推論では、前節で説明したVertex AIのModel Registryに登録済みの機械学習モデルの推論用コンテナイメージを利用します。すなわち、バッチ推論もHTTP経由のAPI ベースで処理されます。ただし、バッチ推論では複数の推論API サーバーが並列に起動し、各サーバーに対してバッチサイズで指定した件数単位でリクエストが割り当てられるため、単純にオンライン推論を繰り返す場合に比べて処理時間を短縮できます。
特に有用だと感じているのは、推論の入出力先として BigQuery のテーブルを直接指定できる点です。データ基盤としてBigQueryを採用している場合、機械学習モデルに必要な特徴量をシームレスに入力として集計でき、また推論結果を後続の分析処理で容易に活用できるという利点があります。
実装時の注意点
バッチ推論の実装にあたっては、推論APIのリクエスト形式との整合性を保つために、instanceConfigの仕様を正しく把握しておく必要があります。オンライン推論のようにクライアント側でリクエスト形式を制御できる場合と異なり、バッチ推論ではBigQueryテーブルに格納されたフィールドから自動的にリクエストが組み立てられます。そのため、推論用コンテナの入力形式をこの自動生成に合わせてしまうと、オンライン推論時に使いづらい設計となることがあります。
バッチ推論では、この挙動を制御するために、instanceConfig で入力テーブルとリクエスト形式の対応を定義します。例えば、以下のようなリクエスト形式を想定している場合を考えます。
class Instance(BaseModel):
id: int
features: list[float]
入力テーブルのスキーマが id (INTEGER)、features (FLOAT, REPEATED) のような場合、instanceConfigは次のように設定します。
"instanceConfig": {
"includedFields": ["id", "features"],
"instanceType": "object"
}
ここでinstanceTypeを"object"に設定することで、リクエストがキーと値のペア(オブジェクト形式)として組み立てられます。デフォルトでは"array"が使用されるため、idとfeaturesが[id, [f1, f2, ...]]のような配列形式で送信されてしまいます。
詳細は、公式ドキュメントをご参照ください。
Vertex AI Vector Searchのベクトル属性によるフィルタ機能
Vertex AI Vector Searchには、ベクトル属性によるフィルタ機能が提供されています。これは、インデックス構築時にデータポイントごとに付与した属性を対象に、検索結果を絞り込むための機能です。属性にはトークン(文字列)と数値の 2 種類があり、名前空間単位で管理することができます。
例えば、あるデータポイントに対して、トークン型のベクトル属性としてcolorという名前空間にredとblueを付与し、数値型のベクトル属性としてsizeという名前空間に整数値3を付与することが可能です。検索時には、color=red AND size<2 のような条件でフィルタリングを行うことができます(詳細なクエリ指定については公式ドキュメントを参照してください)。
本システムでは、システム構成で示したとおり、各機械学習モデルの予測指標値をベクトル属性として付与することで、独立した機械学習モデルの迅速な開発と、ベクトル検索との柔軟な統合を実現しています。
実装時の注意点
注意が必要なのは、数値型のベクトル属性をCSVで指定する際の記述方法です。公式ドキュメントの例では、ベクトルデータに続けてratio=0.1fのように記されていますが、正しくは#ratio=0.1fのように、名前空間の先頭に#を付ける必要があります。#を付けない場合はトークン型として扱われ、0.1fが文字列として解釈されてしまいます。
本記事執筆時点(2025年10月23日)では、公式ドキュメント内の説明文には#の記載があるものの、具体例には反映されていない箇所が混在しています(筆者からフィードバックを送付済みです)。
おわりに
本記事では、Vertex AI Vector Searchにおいて、ベクトル属性を活用し、機械学習モデルによって算出した指標を検索結果のフィルタリングに利用する仕組みを紹介しました。このアプローチにより、既存のベクトル検索基盤に対して軽量かつ迅速にモデルを統合でき、検索結果のサービス指標に沿った柔軟な最適化が可能となります。
さらに、このようなモデルを実運用環境に導入し、効果を測定できることは、個別のモデル改善にとどまらず、より汎用的な「意味的レイヤ(semantic layer)」の開発促進にもつながります。意味的レイヤとは、Bernardi ら(2019)によってオンライン旅行代理店の機械学習運用における概念として示されたものであり、機械学習モデルとアプリケーションの開発評価において、プロダクト開発に関わるさまざまな人々が共通に理解できる概念をモデルとして表現し、それを複数の機能やチームで再利用可能にする構造を指します。本システムの運用を通じてこの層を整備することで、機械学習の成果を単一のユースケースに閉じず、サービス全体に知識として還流させる基盤を築くことにつなげていきたいと考えています。
ペパボ研究所では、AI体験の実現に向けて「なめらかなシステム」というビジョンのもと研究開発を進めています。本記事や関連する取り組みに興味を持たれた方は、ぜひお声がけください。
【PR】パートナー積極採用中!
ペパボ研究所では、新しいパートナーを求めています。詳細については、当研究所のトップページをご覧ください。