Re Reference AI

技術

Embeddingとは

埋め込み / 埋め込みベクトル

テキストなどのデータを、意味的な近さを反映した高次元の実数ベクトルへ変換した表現

NLPベクトル検索RAG

ひとことで言うと

言葉や文章を、意味の近さを数値で表せるようにしたデータ形式。

概要

Embedding(埋め込み)とは、単語・文・画像などのデータを、その意味的な特徴を反映した固定長の実数ベクトルへ変換したもの。 意味が近いもの同士はベクトル空間上でも近い位置に配置されるよう学習されており、コサイン類似度やユークリッド距離といった数値計算によって、単語や文同士の意味的な類似度を測れるようになる。 LLM内部では入力トークンを埋め込みベクトルに変換してから計算するほか、RAGにおける文書検索、レコメンデーション、クラスタリングなど、テキストや画像を数値ベクトルとして扱う多くの応用の基盤になっている。 埋め込みの次元数はモデルによって異なり(数百〜数千次元程度)、次元数が大きいほど表現力は増すがストレージ・計算コストも増加するため、用途に応じたトレードオフがある。

背景

コンピュータは文字列そのものの意味を直接扱えないため、単語や文を数値化する必要がある。 one-hotベクトルのような単純な数値化では単語間の意味的な関連性を表現できなかったため、意味的に近い単語ほど近いベクトルになるよう学習する分散表現(埋め込み)が考案された。

歴史

2013年: Mikolovらがword2vecを発表し、単語の意味的関係をベクトル演算(例: 王-男+女=女王)で表現できることを示す。 2014年: GloVeなど別の学習手法による単語埋め込みが登場。 2018年: ELMo・BERTにより、同じ単語でも文脈に応じて異なるベクトルを持つ文脈依存埋め込みが普及。 2020年代: OpenAIのtext-embeddingシリーズなど、文・文書単位の埋め込みモデルがRAG用途で広く使われるようになる。

アーキテクチャ

ニューラルネットワークの入力層または中間層の出力として得られる、固定次元(数百〜数千次元)の実数ベクトル。 単語埋め込みは埋め込み行列(語彙数×次元数)の該当行を参照する形で得られ、文・文書の埋め込みはTransformer等のエンコーダの出力を平均化・プーリングして得られることが多い。

ワークフロー

テキストを埋め込みモデルへ入力 → 固定長のベクトルを出力 → ベクトルデータベース等に格納 → 検索時はクエリを同様にベクトル化し、類似度計算で関連する項目を取得。

コード例

OpenAI Embeddings APIでベクトルを取得

from openai import OpenAI

client = OpenAI()
response = client.embeddings.create(
    model="text-embedding-3-small",
    input="埋め込みベクトルの例",
)
vector = response.data[0].embedding
print(len(vector))

利点

  • 意味的な類似度を数値計算で扱えるようになる
  • 検索・分類・クラスタリングなど幅広いタスクの共通基盤として使える
  • 異なる言語や表記のテキストでも、意味が近ければ近いベクトルとして扱える場合がある

欠点

  • ベクトルの次元数が大きいほど、保存・検索に必要なストレージと計算コストが増える
  • 埋め込みモデルの学習データやドメインが対象データと乖離していると、類似度の精度が落ちる
  • ベクトル自体は解釈しにくく、類似と判定された理由の説明が難しい

比較

  • トークントークンはテキストを分割した離散的な単位であり、埋め込みはそのトークンを連続的な数値ベクトルへ変換したもの
  • RAGRAGは文書やクエリを埋め込みベクトル化し、類似度検索によって関連情報を取得する
  • LLMLLM内部では入力トークンを埋め込みベクトルに変換してからTransformerで処理する

関連用語

トークンRAGLLMTransformerWord2Vecコサイン類似度

よくある質問

埋め込みとファインチューニングの違いは?

埋め込みはデータを数値ベクトルへ変換する表現手法。 ファインチューニングはモデルの重みを追加学習で調整する手法。 目的が異なり、埋め込みモデル自体をファインチューニングすることもある。

埋め込みの次元数はどう選ぶ?

モデルによって固定(例: 1536次元等)されていることが多く、次元数が大きいほど表現力は高まるが、ストレージ・計算コストとのトレードオフになる。

参考文献

関連Zenn記事