埋め込み生成(例:OpenAI Embedding, SBERT, sentence-transformers)

FAISS(Facebook AI Similarity Search)は、ベクトル間の類似性検索を高速に行うためのライブラリですが、検索対象となる「ベクトル(埋め込み)」はFAISS自身では生成しません。このため、別の埋め込み生成モデルと組み合わせる必要があります。以下に、代表的な埋め込み生成方法(OpenAI Embedding, SBERT, sentence-transformers)とその前処理に関して詳しく説明します。


1. 埋め込み(Embedding)とは

「埋め込み」とは、テキストや画像などの非構造データを、多次元ベクトル空間に写像したものです。これにより、FAISSはこれらのベクトル同士の**距離(または類似度)**に基づいて検索を行えるようになります。


2. 代表的な埋め込み生成方法

2.1 OpenAI Embedding(例:text-embedding-ada-002

  • 提供元:OpenAI API

  • 特徴

    • 高精度な文ベクトルを取得可能

    • 一貫したスケーリング・ベクトル長

    • 最大8192トークンまでの入力対応

  • 用途

    • 質問応答、文類似検索、セマンティック検索など

  • 使用例(Python)

python
from openai import OpenAI client = OpenAI(api_key="your-api-key") response = client.embeddings.create( input="これは検索対象の文です。", model="text-embedding-ada-002" ) embedding = response.data[0].embedding

2.2 SBERT(Sentence-BERT)

  • 提供元:HuggingFace Transformers

  • 特徴

    • BERTをベースとした双方向エンコーダ

    • コサイン類似度との親和性が高い

    • ローカル環境で高速に動作

  • 用途

    • 類似文検索、クラスタリング

  • 使用例

python
from sentence_transformers import SentenceTransformer model = SentenceTransformer('all-MiniLM-L6-v2') embedding = model.encode("これは検索対象の文です。", normalize_embeddings=True)

2.3 sentence-transformers ライブラリ(SBERTを含む拡張ライブラリ)

  • 提供元:UKPLab(HuggingFaceと統合)

  • 特徴

    • 多様な事前学習済みモデルに対応(多言語、ドメイン特化)

    • ベクトル正規化もサポート

  • 利点

    • カスタマイズが容易

    • トークナイザやエンコーダの切り替えが柔軟


3. ベクトル前処理(FAISSで使う前に必要な処理)

FAISSで効果的な検索を行うために、埋め込みベクトルに対して以下の前処理が推奨されます。

3.1 正規化(L2正規化 または 単位ベクトル化

  • 目的:コサイン類似度を内積として扱うため

  • (NumPy):

python
import numpy as np embedding = embedding / np.linalg.norm(embedding)

3.2 型変換と次元整形

  • FAISSに渡す前に、必ず np.float32 に変換

  • 1D配列の場合は (1, D) の2Dにreshape

python
embedding = np.array(embedding, dtype='float32').reshape(1, -1)

3.3 バッチ処理(大量のテキストがある場合)

  • 多数の埋め込みを一括で生成しておくとFAISSへの追加が効率的

python
texts = ["文1", "文2", "文3"] embeddings = model.encode(texts, normalize_embeddings=True)

4. FAISSとの接続例

python
import faiss # 次元数を指定してインデックス作成 dimension = embedding.shape[1] index = faiss.IndexFlatL2(dimension) # ベクトルの追加 index.add(embeddings) # 検索 D, I = index.search(query_vector, k=5)

まとめ

埋め込み手法 オンライン/オフライン 特徴 主な用途
OpenAI Embedding オンライン(API) 高精度・多用途 セマンティック検索、FAQ
SBERT オフライン 高速・高精度 類似文検索、分類
sentence-transformers オフライン 柔軟なモデル選択 カスタム用途全般

FAISSを使ったベクトル検索の精度と効率は、埋め込み生成の品質と適切な前処理に大きく依存します。そのため、使用目的に応じて最適な埋め込み手法を選択し、FAISS用に適切な形式へ整形することが重要です。

ChatGPT4o 生成日:2025/06/18