ChatGPTが「猫」と「ネコ」を同じ意味と理解し、「犬」と「猫」を似た概念として扱えるのは、「エンベディング(Embedding)」という技術のおかげです。エンベディングは、単語や文章を数値ベクトルに変換し、意味を計算可能にします。
この技術は、検索エンジン、推薦システム、RAG(Retrieval-Augmented Generation)など、現代AIの基盤を支えています。本記事では、エンベディングの仕組みを歴史的進化と共に、平易に解説します。
エンベディングとは何か?
エンベディングは、単語・文章・画像などを高次元の数値ベクトルに変換する技術です。例えば「猫」という単語を、以下のような数値の列(ベクトル)で表現します。
「猫」→ [0.2, -0.5, 0.8, 0.1, ..., 0.3] (通常1536次元など)
この数値ベクトルには、以下のような性質があります。
- 意味が近い単語は、ベクトルも近い: 「猫」と「ネコ」は類似したベクトル
- 意味の関係性を計算できる: 「王 – 男 + 女 = 女王」といったベクトル演算が成立
- 機械学習で処理可能: 数値なのでニューラルネットワークで扱える
エンベディングにより、コンピュータは言葉の「意味」を数学的に扱えるようになります。
エンベディングの歴史的進化
エンベディング技術は、過去20年で大きく進化しました。
One-Hot Encoding(2000年代以前)
最も単純な方法は、各単語を1つだけ1で他はすべて0のベクトルで表現する方式です。
「猫」→ [0, 0, 1, 0, 0, ...] (語彙数の次元)
「犬」→ [0, 0, 0, 1, 0, ...]
問題点:
– 語彙数が増えると次元が爆発(100万語なら100万次元)
– すべての単語が等距離で、意味の類似性を捉えられない
Word2Vec(2013年)
GoogleのTomas Mikolovらが開発した、意味を捉える革新的な手法です。「似た文脈で使われる単語は似た意味を持つ」という仮説に基づきます。
学習方法(Skip-gram):
– 「猫がマットの上で寝ている」という文があるとき
– 「猫」から「が」「マット」「寝」を予測するよう学習
– この過程で、「猫」のベクトルが形成される
特徴:
– 100〜300次元の密なベクトル
– 「王 – 男 + 女 = 女王」といった類推が可能
– 高速で軽量
限界:
– 同音異義語を区別できない(「バンク(銀行/川岸)」が同じベクトル)
– 単語単位で、文脈を考慮しない
GloVe(2014年)
Stanford大学が開発した、単語の共起統計を活用する手法です。Word2Vecと同様の特性を持ちながら、より安定した学習が可能です。
BERT Embeddings(2018年)
GoogleのBERTは、Transformerを使った文脈依存エンベディングを実現しました。
革新点:
– 文脈によって同じ単語でも異なるベクトルを生成
– 「バンクで魚を見た」→「川岸」の意味のベクトル
– 「バンクで預金した」→「銀行」の意味のベクトル
仕組み:
1. 文章全体をBERTに入力
2. 各単語の位置で、隠れ層のベクトルを取得
3. このベクトルが文脈依存エンベディング
BERTは文章分類や質問応答で高精度ですが、文章全体のエンベディングには適さない場合があります。
Sentence Transformers(2019年)
BERTを改良し、文章全体を1つのベクトルで表現する技術です。文章間の類似度計算に最適化されています。
OpenAI Embeddings(2022年〜)
OpenAIのAda-002、text-embedding-3-smallなどは、商用で最も普及したエンベディングモデルです。
特徴:
– 1536次元(または3072次元)の高品質ベクトル
– 多言語対応(100言語以上)
– APIで簡単に利用可能
– RAGシステムの標準的選択肢
エンベディングの生成方法
現代的なエンベディング生成の流れを、OpenAI APIを例に説明します。
1. テキストの前処理
text = "人工知能は人間の知能を模倣する技術です。"
2. トークナイゼーション
テキストをトークンに分割します。日本語では、通常1文字〜数文字が1トークンになります。
["人工", "知能", "は", "人間", "の", "知能", "を", "模倣", ...]
3. エンベディングモデルへの入力
import openai
response = openai.embeddings.create(
model="text-embedding-3-small",
input=text
)
embedding = response.data[0].embedding # 1536次元のベクトル
# [0.02, -0.15, 0.08, ..., 0.33]
4. ベクトルの保存
生成されたベクトルを、ベクトルデータベース(Pinecone、Weaviate、Chromaなど)に保存します。
類似度計算:意味検索の核心
エンベディングの最大の用途は、意味的類似度検索です。
コサイン類似度
2つのベクトルの角度を測定し、-1〜1の値で類似度を表します。1に近いほど類似しています。
from numpy import dot
from numpy.linalg import norm
def cosine_similarity(vec1, vec2):
return dot(vec1, vec2) / (norm(vec1) * norm(vec2))
# 例
vec_cat = embedding("猫")
vec_dog = embedding("犬")
vec_car = embedding("車")
cosine_similarity(vec_cat, vec_dog) # 0.85 (類似)
cosine_similarity(vec_cat, vec_car) # 0.12 (非類似)
意味検索の実装
ユーザーの質問に最も関連する文書を検索する流れ:
- 質問「猫の飼い方を教えて」をエンベディング化
- データベース内のすべての文書エンベディングと類似度計算
- 類似度が高い上位K件を取得
- LLMに文脈として渡して回答生成
これがRAGシステムの基本的な仕組みです。
エンベディングの活用事例
セマンティック検索
従来のキーワード検索は、単語の一致しか見ません。エンベディング検索は、意味の類似性で検索します。
クエリ: 「リモートワークのコツ」
ヒット: 「在宅勤務で生産性を上げる方法」(キーワード不一致でも意味が近い)
推薦システム
- コンテンツベース推薦: 記事のエンベディングから、類似記事を推薦
- ユーザー嗜好モデリング: ユーザーの行動履歴からエンベディングを生成し、好みを予測
異常検知
正常データのエンベディングを学習し、大きく離れたベクトルを持つデータを異常として検出します。
クラスタリング
エンベディングをk-meansなどでクラスタリングし、テキストを自動分類します。例えば、カスタマーサポートのチケットを「請求問題」「技術トラブル」などに分類します。
RAG(検索拡張生成)
エンベディング検索で関連文書を取得し、LLMに渡すことで、最新情報や社内文書を基にした回答を生成します。詳細はRAGとは何かで解説しています。
多言語・マルチモーダルエンベディング
多言語エンベディング
最新のモデルは、複数言語を同じエンベディング空間にマッピングします。
vec_cat_en = embedding("cat")
vec_cat_ja = embedding("猫")
cosine_similarity(vec_cat_en, vec_cat_ja) # 0.92 (高い類似度)
これにより、英語の質問で日本語文書を検索する、といったクロスリンガル検索が可能です。
画像エンベディング(CLIP)
OpenAIのCLIPは、画像とテキストを同じエンベディング空間にマッピングします。
- 「猫の写真」のテキストエンベディング
- 実際の猫の画像のエンベディング
これらが近いベクトルになるため、テキストで画像を検索できます。Stable Diffusionも、プロンプトのテキストエンベディングと画像エンベディングを対応付けています。
エンベディングの評価指標
MTEBベンチマーク
Massive Text Embedding Benchmarkは、エンベディングモデルの性能を評価する標準的なベンチマークです。以下のタスクで評価します。
- 文章分類
- セマンティック類似度
- 情報検索
- クラスタリング
モデル比較(2026年3月時点)
- OpenAI text-embedding-3-large: MTEB 64.6点、3072次元、高コスト
- OpenAI text-embedding-3-small: MTEB 62.3点、1536次元、バランス良好
- Cohere embed-v3: MTEB 64.5点、1024次元、多言語強い
- Voyage AI voyage-large-2: MTEB 68.5点、1536次元、最高精度
エンベディングの課題と今後の展望
次元の呪い
高次元ベクトルは計算コストが高く、メモリを大量消費します。最新のモデルは、精度を保ちながら次元を削減する「Matryoshka Embeddings」などの手法を導入しています。
バイアスの継承
学習データの偏りがエンベディングに反映されます。例えば「医者」が男性的なベクトルに偏る、といった社会的バイアスが問題になっています。
ドメイン適応
汎用エンベディングは、専門分野(医療、法律など)で精度が落ちる場合があります。ドメイン特化のファインチューニングが解決策です。
リアルタイム更新
エンベディングは事前計算が一般的ですが、リアルタイムで変化する情報(ニュース、SNS)への適応が課題です。ストリーミング学習の研究が進んでいます。
FAQ
Q1. エンベディングとトークンの違いは何ですか?
トークンはテキストを小さな単位に分割したもので、エンベディングは各トークン(または文章全体)を数値ベクトルに変換したものです。トークン化は前処理、エンベディングは意味の数値化です。
Q2. エンベディングの次元数はどう選べばいいですか?
一般的に、次元数が多いほど表現力が高まりますが、計算コストも増えます。OpenAI APIでは、text-embedding-3-small(1536次元)が精度とコストのバランスが良く、最初の選択肢として推奨されます。
Q3. 自前でエンベディングモデルを訓練すべきですか?
ほとんどの場合、OpenAI、Cohere、HuggingFaceなどの既存モデルで十分です。ドメイン特化や多言語対応が不十分な場合のみ、ファインチューニングを検討します。ゼロから訓練するには膨大なデータと計算資源が必要です。
Q4. エンベディングはどこに保存すればいいですか?
小規模(数千件)なら、NumPy配列やCSVで保存できます。大規模(数百万件以上)なら、ベクトルデータベース(Pinecone、Weaviate、Qdrantなど)の利用を推奨します。これらは高速な類似度検索に最適化されています。
関連記事
出典
- Mikolov, T., et al. (2013). “Efficient Estimation of Word Representations in Vector Space”. arXiv:1301.3781.
- Pennington, J., et al. (2014). “GloVe: Global Vectors for Word Representation”. EMNLP.
- Devlin, J., et al. (2018). “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”. arXiv:1810.04805.
- Reimers, N., & Gurevych, I. (2019). “Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks”. EMNLP.
- OpenAI (2022). “Embeddings”. https://platform.openai.com/docs/guides/embeddings


コメント