Embedding(埋め込み)の基礎と実務上の性質
Embedding(埋め込み)は、テキストを固定長の数値ベクトル(数百〜数千個の浮動小数点数)に変換したもの。「意味が近いテキストほどベクトル空間上で近い位置になる」よう設計され、テキストに「意味の座標」を与える操作。
作られ方
embedding モデル(Gemini gemini-embedding-001、OpenAI text-embedding-3 等)は Transformer ベース。対照学習で「意味的に関連するペアは近く、無関係なペアは遠く」なるよう訓練される(LLM は次単語予測、embedding は意味の距離が正しくなるよう訓練、という違い)。各次元に人間可読な意味はなく、意味は全次元の位置関係として分散的に表現される。
近さ=コサイン類似度
ベクトルの近さは一般にコサイン類似度(なす角度)で測る。同方向=1、直交=0。長さでなく向きを見るのは、長さはテキスト長に影響され意味は向きに現れるため。pgvector のコサイン距離演算子は距離(=1−類似度)を返すので「1−距離」をスコアにし、距離が小さい順に上位 N 件を取れば最近傍検索。目安は 0.85 以上でほぼ同内容、0.7 前後で関連あり、0.5 以下でほぼ無関係(モデル依存なので絶対視しない)。
キーワード検索との違い
キーワード検索(ILIKE/全文検索)は文字列の表層一致で、識別子の完全一致に強いが言い換えに弱い。セマンティック検索は意味の座標で、言い換え(「DBの移行」↔「マイグレーション」)に強いが識別子に弱い。上位互換でなく相互補完なので両方を併存させるのが定石。
実務上の性質
- タスクタイプ: 検索は非対称。保存は RETRIEVAL_DOCUMENT、検索クエリは RETRIEVAL_QUERY を指定すると対応ペアが近づく。
- 次元削減: gemini-embedding-001 は素で 3072 次元だが outputDimensionality で縮小可(重要情報を前方次元に詰める「マトリョーシカ表現学習」のため)。768 次元で精度の大部分を保ち、ストレージ 1/4、pgvector のインデックス上限 2000 次元内に収まる。
- モデルロックイン: 別モデル/別次元設定のベクトルは座標系が別物で比較不能。モデル変更時は全データ再生成が必須なので、embedding は本体と別テーブルに分離しておくと安全。
- 入力長: モデルにトークン上限あり(gemini-embedding-001 は 2048)。超過は切り捨てなので長文はチャンク分割。メモ程度なら 1テキスト=1ベクトルで十分。
検索以外の用途
同じ「意味の座標」で、RAG(質問に近い文書を LLM に渡す)/重複検知/クラスタリング/レコメンドが同じ仕組みで実現できる。embedding 生成パイプラインを一度作れば土台を流用できる。