「意味が近い文章を探して」とAIに頼むと、なぜか的確に拾ってくれます。
この「意味の近さ」を裏で支えているのが、エンベディング(embedding)という仕組みです。
言葉を数値のベクトルに変換し、近い意味ほど近い場所へ並べる——それがエンベディングの正体。
この記事では、エンベディングが何をしていて、どこで役立つのかを、コードのイメージまで含めて整理します。
エンベディングとは(ざっくり言うと)
エンベディングは、文章や単語を「意味を映した数値の並び」に変換する処理です。
その数値の並びをベクトルと呼びます。
たとえば「犬」と「猫」は近い場所に、「犬」と「株価」は遠い場所に置かれる、というイメージ。
人間が見ても意味は読み取れませんが、コンピュータにとっては「距離を測れる」形になっている点が肝心なのです。
なぜわざわざベクトルにするのか
理由はシンプルで、コンピュータは「意味」を直接は比べられないからです。
文字列のままでは、「医者」と「医師」がほぼ同じ意味だと機械には伝わりません。
ところがベクトルに直すと、2つの点がどれだけ近いかを計算で出せるようになるのです。
この近さの指標としてよく使われるのがコサイン類似度で、値が1に近いほど意味が近いと判断します。
つまりエンベディングは、「意味の比較」を「距離の計算」に翻訳する変換だと言えるわけです。
何に使われているか
エンベディングは、いまのAIサービスの裏側で幅広く動いています。
- 意味で探す検索(キーワードが一致しなくても、意味が近い文書を拾う)
- RAG(AIに関連文書を渡す前段で、質問に近いチャンクを選ぶ)
- 推薦(似た商品・似た記事を並べる)
- 分類・クラスタリング(近いベクトルどうしをグループにまとめる)
特に最近は、社内文書をAIに答えさせるRAGの入口として、エンベディングを目にする機会が増えました。
触ってみるイメージ
具体的なコードにすると、やっていることは驚くほど短いです。
import numpy as np
# embed() は文章をベクトル(数百〜数千次元)に変換する関数のイメージ
a = embed("猫がソファで寝ている")
b = embed("ネコがソファーで眠っている")
# コサイン類似度=2つのベクトルの近さ(1に近いほど意味が近い)
cos = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(cos) # 例: 0.94 のように高い値が返る
大事なのは、embed の中身がどんなモデルでも、出てくるのは「固定長のベクトル」だという点です。
あとは距離を測るだけなので、検索も推薦も同じ道具で組めてしまいます。
使うときの注意点
便利な一方で、前提を外すと精度は簡単に落ちるのです。
まず、モデルが違うベクトルは互いに比較できないので、検索対象と質問は同じモデルで揃えるのが前提。
長い文章をまるごと1ベクトルにすると情報が薄まるため、RAGでは適度な長さに分割してから変換するのが定番です。
そして「意味が近い」は「事実として正しい」を保証しません。
エンベディングはあくまで近い候補を選ぶところまでで、最終的な正しさは別の仕組みで担保する必要があります。
関連して、AIが一度に読める量の話も整理しています。あわせてどうぞ。
最後に
エンベディングは、AIが「意味を分かっているように見える」動きを支える土台です。
仕組みは言葉→ベクトル→距離の計算の3ステップだけ、と押さえておけば十分。
ここが腑に落ちると、検索やRAGのニュースもぐっと読みやすくなります。
参考: OpenAI Vector embeddings ガイド
以上です。








コメントを残す