3秒でわかる
文章や画像を、意味の近さが距離として表れる数値ベクトルに変換したもの。キーワードが一致しなくても意味で引けるので、RAG や類似検索の土台になります。
30秒図解
もう少し詳しく
どういうものか
文章や画像を、意味の近さがそのまま距離として表れる数値の並び (ベクトル) に変換したものが Embedding です。「猫」という単語を埋め込みモデルに渡すと、1536 個の小数が並んだ配列が返ります。同じ空間の中で「ねこ」「cat」は近い位置に、「日経平均株価」は遠い位置に置かれます。次元数はモデルごとに決まっていて、OpenAI の text-embedding-3-small なら 1536、text-embedding-3-large なら 3072 です。
なぜ必要か
文字列の一致で探す検索では、問い合わせに「解約したい」と書かれていても「退会手順」という見出しの文書には辿り着けません。表記が違えば別物として扱われるからです。ベクトルにしてしまえば距離を測るだけで意味の近さを比べられるので、言い回しが違っても正しい文書を引けます。社内文書を AI に答えさせる RAG は、この性質をそのまま使っています。
具体例
from openai import OpenAI
import numpy as np
client = 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, b):
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
a = embed("契約を解約したい")
b = embed("退会の手続きについて")
c = embed("今日の東京の天気")
print(cosine(a, b)) # 0.8 前後
print(cosine(a, c)) # 0.1 前後つまずきやすいところ
似た用語との違い
| 用語 | 何をするか |
|---|---|
| トークン化 | 文章をモデルが扱う単位に切り分ける。意味の比較はできない |
| Embedding | 切り分けた文章全体を、意味を保った数値ベクトルにする |
| ベクトルDB | 出来上がったベクトルを保存し、近いものを高速に探す |
覚え方
意味を座標に置き換える変換だと考えると、後の処理がすべて「距離を測るだけ」になる理由が腑に落ちます。