埋め込み戦略:セマンティック検索のための all-mpnet-base-v2
この記事では、SEOパイプライン全体でセマンティック検索を実現するために、all-mpnet-base-v2 センテンストランスフォーマーモデルをどのように使用しているかについて説明します。
課題:クエリと製品のマッチング
ユーザーが「ミニPC」や「小さなコンピューター」と検索した場合、キーワードは共有していなくても同じものを意味しています。従来のキーワードマッチングではこれに対応できません。ここで必要となるのがセマンティック埋め込みです。これは単語だけでなく意味を捉えた密なベクトル表現です。
私たちのSEOパイプラインは65,000以上の検索クエリを処理し、以下を行う必要があります:
-
クエリページ用に類似クエリをクラスタリングする
-
意味に基づいてクエリと製品をマッチングする
-
関連検索を見つける
-
フレーズからフィルターへのマッピングを拡張する
モデル:all-mpnet-base-v2
私たちはsentence transformerモデルであるall-mpnet-base-v2を使用しています。このモデルは:
-
768次元のベクトルを出力する
-
10億以上の文ペアで学習されている
-
最大384トークンのシーケンスを処理できる
このモデルは、テキストを密なベクトル空間にマッピングし、意味的に類似したテキストは高いコサイン類似度を持つようにします。
使用方法
1. クエリの埋め込み
すべての検索クエリを768次元ベクトルに埋め込みます:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-mpnet-base-v2")
embeddings = model.encode(queries)
各クエリは768個のfloatからなるベクトル(3,072バイト)になります。65,000クエリの場合、埋め込みデータは約190MBになります。
2. クエリのクラスタリング
類似性に基づいてクエリをクラスタリングします:
-
トラフィック上位1,000件のクエリをクラスター中心として選択
-
全65Kクエリとこれら1Kの中心との間のコサイン類似度を計算
-
類似度≥0.85のクエリはそのクラスターに参加
-
クラスタリングされなかったクエリは単一クエリのクラスターとなる
これにより、それぞれのページが類似検索のクラスターを表すクエリページが作成されます。
詳細はクエリクラスタリングアルゴリズムを参照してください。
3. 製品マッチング
製品名と特徴を埋め込み、コサイン類似度を使用してクエリと製品をマッチングします。クエリとの類似度が最も高い製品がそのクエリページに表示されます。
詳細は製品マッチングアルゴリズムを参照してください。
4. フレーズマッピングの拡張
埋め込みを使用して、フィルター抽出用の類似フレーズを見つけます。例えば、「ミニPC」がサイズフィルターにマッピングされる場合、「小さなコンピューター」も同様にマッピングされるべきだと判断できます。
詳細はフレーズマッピング拡張を参照してください。
ストレージ:NumPy配列
埋め込みデータはNumPyの.npyファイルとして保存します:
import numpy as np
# 保存
np.save("embeddings.npy", embeddings)
# 読み込み(メモリマップ)
embeddings = np.load("embeddings.npy", mmap_mode='r')
なぜNumPyか?
-
メモリマッピングによる高速な読み込み
-
類似度計算のためのネイティブな配列操作
-
コンパクトなバイナリ形式(65Kクエリで約190MB)
増分埋め込み
すべてのクエリを毎回再埋め込みすることはしません。私たちの増分埋め込みは以下の通りです:
- 既存の埋め込みデータを読み込む
- クエリキー(テキスト+メタデータ)を比較する
- 新規または変更されたクエリのみを埋め込む
- 既存の配列に追加する
これにより、わずかなクエリしか変更されない場合の処理時間を大幅に削減できます。
マルチサーバーアーキテクチャ
埋め込みデータは複数のサーバーで使用されます:
- バッチパイプライン:クエリと製品から埋め込みデータを生成
- 検索サービス:関連検索API用に埋め込みデータを読み込み
- メインWebサーバー:製品マッチングに埋め込みデータを使用
サーバーごとのストレージ:
-
NumPyファイル:バッチパイプライン(高速なローカルアクセス)
-
Valkey RediSearch:検索サービス(ベクトル類似性検索)
Valkey連携の詳細は検索サービスアーキテクチャを参照してください。
SEOパイプラインとの統合
埋め込みデータはパイプラインの複数のステップを支えています:
- ステップ0: ソースデータの埋め込み - 製品、部品、記事
- ステップ3b: クエリの埋め込み - すべての検索クエリ
- ステップ4: フレーズマッピングの拡張 - 類似フレーズの発見
- ステップ5: クエリのクラスタリング - クエリページへのグループ化
- ステップ6: 製品マッチング - クエリと製品のマッチング
- ステップ8: 関連検索の生成 - 関連クエリの発見
全体の流れについてはSEOパイプライン概要を参照してください。
参考文献
モデルドキュメント
-
all-mpnet-base-v2 モデルカード - Hugging Face
-
Sentence Transformers ドキュメント - 公式ドキュメント
-
Sentence Transformers 論文 - Reimers & Gurevych, 2019
技術的概念
-
単語埋め込み - Wikipedia
-
コサイン類似度 - Wikipedia
-
NumPy メモリマップファイル - NumPy ドキュメント
関連記事
-
SEOパイプライン概要 - パイプライン全体のアーキテクチャ
-
クエリクラスタリングアルゴリズム - 65Kクエリのクラスタリング方法
-
検索サービスアーキテクチャ - Valkey RediSearch連携
-
製品マッチングアルゴリズム - セマンティックマッチング
-
フレーズマッピング拡張 - フィルター用の埋め込み利用
まとめ
私たちはall-mpnet-base-v2を使用して、テキストをセマンティックな意味を捉えた768次元ベクトルに変換しています。これらの埋め込みデータはSEOパイプライン全体を支えています:
-
クエリクラスタリング:類似度閾値0.85を使用して65Kクエリをページにグループ化
-
製品マッチング:クエリと製品を意味的にマッチング
-
関連検索:ナビゲーション用の類似クエリの発見
-
フレーズ拡張:新しいフィルターフレーズの発見
埋め込みデータは高速な読み込みのためにNumPy配列として保存され、変更のないデータの再埋め込みを避けるために増分的に処理されます。同じ埋め込みデータがNumPyファイルとValkey RediSearchを介して複数のサーバーで使用されます。