FAISS(Facebook AI Similarity Search)は、ベクトル間の類似性検索を高速に行うためのライブラリですが、検索対象となる「ベクトル(埋め込み)」はFAISS自身では生成しません。このため、別の埋め込み生成モデルと組み合わせる必要があります。以下に、代表的な埋め込み生成方法(OpenAI Embedding, SBERT, sentence-transformers)とその前処理に関して詳しく説明します。
1. 埋め込み(Embedding)とは
「埋め込み」とは、テキストや画像などの非構造データを、多次元ベクトル空間に写像したものです。これにより、FAISSはこれらのベクトル同士の**距離(または類似度)**に基づいて検索を行えるようになります。
2. 代表的な埋め込み生成方法
2.1 OpenAI Embedding(例:text-embedding-ada-002)
text-embedding-ada-002)-
提供元:OpenAI API
-
特徴:
-
高精度な文ベクトルを取得可能
-
一貫したスケーリング・ベクトル長
-
最大8192トークンまでの入力対応
-
-
用途:
-
質問応答、文類似検索、セマンティック検索など
-
-
使用例(Python):
2.2 SBERT(Sentence-BERT)
-
提供元:HuggingFace Transformers
-
特徴:
-
BERTをベースとした双方向エンコーダ
-
コサイン類似度との親和性が高い
-
ローカル環境で高速に動作
-
-
用途:
-
類似文検索、クラスタリング
-
-
使用例:
2.3 sentence-transformers ライブラリ(SBERTを含む拡張ライブラリ)
-
提供元:UKPLab(HuggingFaceと統合)
-
特徴:
-
多様な事前学習済みモデルに対応(多言語、ドメイン特化)
-
ベクトル正規化もサポート
-
-
利点:
-
カスタマイズが容易
-
トークナイザやエンコーダの切り替えが柔軟
-
3. ベクトル前処理(FAISSで使う前に必要な処理)
FAISSで効果的な検索を行うために、埋め込みベクトルに対して以下の前処理が推奨されます。
3.1 正規化(L2正規化 または 単位ベクトル化)
L2正規化 または 単位ベクトル化)-
目的:コサイン類似度を内積として扱うため
-
例(NumPy):
3.2 型変換と次元整形
-
FAISSに渡す前に、必ず
np.float32に変換 -
1D配列の場合は
(1, D)の2Dにreshape
3.3 バッチ処理(大量のテキストがある場合)
-
多数の埋め込みを一括で生成しておくとFAISSへの追加が効率的
4. FAISSとの接続例
まとめ
| 埋め込み手法 | オンライン/オフライン | 特徴 | 主な用途 |
|---|---|---|---|
| OpenAI Embedding | オンライン(API) | 高精度・多用途 | セマンティック検索、FAQ |
| SBERT | オフライン | 高速・高精度 | 類似文検索、分類 |
| sentence-transformers | オフライン | 柔軟なモデル選択 | カスタム用途全般 |
FAISSを使ったベクトル検索の精度と効率は、埋め込み生成の品質と適切な前処理に大きく依存します。そのため、使用目的に応じて最適な埋め込み手法を選択し、FAISS用に適切な形式へ整形することが重要です。
ChatGPT4o 生成日:2025/06/18