Embedding
embedding
一言で言うと
テキストや画像を「意味を保ったまま数値ベクトル」に変換したもの。意味が近いものほどベクトル空間で距離が近くなり、RAG や類似検索の基盤になる。
もう少し詳しく
一言で言うと
テキストや画像を「意味を保ったまま数値ベクトル」に変換したもの。意味が近いものほどベクトル空間で距離が近くなり、RAG や類似検索の基盤になる。
詳細
人間の言語は文字列ですが、コンピュータが「意味の近さ」を比較するには数値にする必要があります。Embedding はテキスト 1 つを 1536 次元 (text-embedding-3-small) や 3072 次元 (text-embedding-3-large) のベクトルに変換します。
このベクトルは意味が近いほど空間内で近くに配置されるように学習されています。「猫」と「ねこ」と「cat」はほぼ同じ位置、「猫」と「犬」もそれなりに近い、「猫」と「為替レート」は遠い、という具合です。
主な用途は次のとおりです。RAG (Retrieval-Augmented Generation) で社内ドキュメント検索、レコメンド、重複検出、クラスタリング、異常検知。
具体例
# OpenAI Embeddings + コサイン類似度
from openai import OpenAI
import numpy as npclient = OpenAI()
def embed(text: str) -> np.ndarray:
res = client.embeddings.create(
model="text-embedding-3-small",
input=text,
)
return np.array(res.data[0].embedding)
def cosine(a: np.ndarray, b: np.ndarray) -> float:
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
a = embed("猫はかわいい動物です")
b = embed("ネコは可愛らしいペットだ")
c = embed("日経平均株価が上昇")
print(cosine(a, b)) # 0.85 前後 (高い)
print(cosine(a, c)) # 0.10 前後 (低い)
RAG パイプラインでは、ドキュメントをチャンクに分割 → 各チャンクを embed → Pinecone / pgvector / Qdrant に保存、検索時はクエリも embed してコサイン類似度の上位 K 件を取り出し、LLM のコンテキストに差し込みます。
使い分け / トレードオフ
埋め込みモデルの選択基準は次のとおりです。多言語の精度なら OpenAI text-embedding-3-large か Cohere embed-multilingual-v3、コストとオンプレ運用なら BGE / E5 系のオープンソース、速度優先なら text-embedding-3-small (1536 次元)。
注意点は次のとおりです。ベクトル次元数が大きいほど精度は上がるがストレージ・検索コストも比例して増えるので、ユースケースの「許容される top-k 精度」を測ってから次元数を決めます。