Embeddingとは?文章を「意味の近さ」で探せる形にする仕組み

AIに文章を探させたり、社内の資料から関連する内容を見つけさせたりする話で、よく「Embedding(埋め込み)」という言葉が出てきます。この記事では、Embeddingが何をするものなのか、なぜ「意味の近さ」で探せるのかを、図で順に説明します。

この記事でわかること
  1. Embeddingは、文章を数値の並び(ベクトル)に変換する仕組み
  2. 意味の近い文章は近い位置に置かれ、その近さは高校で習う内積(コサイン類似度)で測れる
  3. 近いことは正解を保証せず、使うモデルによって近さも変わる

キーワードが違っても、同じ話題を探したい

「返品したい」と質問したとき、手元の資料に「購入品を返す方法」という文書があるとします。2つの文には、同じ単語がほとんどありません。単語の一致で探す方法では、この文書は見つかりにくくなります。

人間は、この2つが同じ話題だとすぐ分かります。そこで、単語の一致ではなく、内容の近さで探したい、という需要が出てきます。そのために使われるのが Embedding です。

質問:「返品したい」キーワード検索(単語の一致)購入品を返す方法一致なし営業時間のご案内一致なし単語が一致しないと、見つからないことがある意味で探す(Embedding)購入品を返す方法近い営業時間のご案内遠い言い換えでも、近い文書が候補に入る
図1 言い換えでも探せるのが、意味で探す方法(例は説明用です)

本屋にたとえると、題名が違っていても、近いテーマの本が同じ棚の隣に並んでいるようなものです。Embeddingは、文章をそのような「棚の位置」に置くための変換です。たとえは説明用で、実際の仕組みは次の節のとおり数値で表します。

Embeddingは文章をベクトルに変換する

OpenAIのドキュメントは、embedding(埋め込み)を、浮動小数点数の並び(ベクトル)と説明しています。2つのベクトルの距離は、2つの文章の関連の強さを表します。Hugging Faceの解説でも、文章などを数値で表したもので、モデルが作るベクトルの長さは常に同じだとされています。

購入品を返す方法Embeddingモデルベクトル(数値の並び)0.12-0.530.880.04…同じモデルなら、どんな文章でも同じ長さのベクトルになる(例:OpenAIのtext-embedding-3-smallは既定で1536個、-largeは3072個)1つ1つの数字の意味は読み取れない。数字全体の組み合わせで「近さ」を測る
図2 Embeddingは、文章を固定長の数値の並び(ベクトル)に変換する(数値は説明用です)

ベクトルの長さ(次元数)はモデルによって決まります。OpenAIの text-embedding-3-small は既定で1536個、text-embedding-3-large は3072個です。多くの場合、数字の1つ1つが何を表しているのかを、人が読み取ることはできません。たとえば 0.12 という数字だけを見ても、それが何を意味するのかは分かりません。大事なのは数字全体の組み合わせで、ほかの文章のベクトルと比べたときに、どれだけ近いかを測ります。

補足

Claudeのような文章を作るモデルとは別に、Embedding専用のモデルがあります。Anthropicのドキュメントによると、Anthropicは自社のEmbeddingモデルを提供しておらず、Voyage AIなどの提供元を案内しています。

「意味の近さ」はどうイメージする?

ベクトルは、座標を並べたものと考えると分かりやすくなります。2次元なら点が1つ決まり、似た内容の文章を近い位置に置くと、次のような地図になります。

購入品を返す方法返金の手続き営業時間のご案内休業日のお知らせパスワードの再設定ログインできない質問:返品したい2次元の図は模式図です。実際のベクトルは数百〜数千の次元を持ちます
図3 似た内容を近くに置く「意味の地図」のイメージ(実際は多次元で、これは2次元の模式図)

質問も文書も、同じ方法でベクトルにすれば、この地図の上に並べられます。質問に近い点にある文書を選ぶと、「返品」「返金」に関する文書が候補に入ります。営業時間やログインに関する文書は、遠くにあるので入りません。

ただし、この図は模式図です。実際のベクトルは数百〜数千の次元を持つため、人が図に描いて確かめることはできません。2次元の図は、考え方を伝えるための絵として見てください。

「近い」「遠い」を具体的な数値で測る方法は、次の節で説明します。

近さはどう測る?コサイン類似度

ここまで「近い」「遠い」と書いてきましたが、コンピュータは、ベクトルどうしの近さを数値で計算します。代表的な方法が、高校の数学で習ったベクトルの内積を使う「コサイン類似度」です。2つのベクトルの「向き」がどれだけそろっているかを、-1から1の値で表します。OpenAIのドキュメントも、検索の例で、質問と各文書のベクトルのコサイン類似度を使っています。

2つのベクトルの「向き」の近さabθ向きがそろう(θが小さい)cosθ = 1 に近い直角(θ = 90°)cosθ = 0反対向き(θ = 180°)cosθ = -1cosθ(コサイン)の値で、向きの近さを −1〜1 で表す
図4 コサイン類似度は、2つのベクトルの向きの近さを表す

向きがそろっているほど1に近く、直角なら0、反対向きなら-1になります。以下で、高校で習った内容を思い出しながら、順に確かめます。

高校で習った内積のおさらい

高校では、2つのベクトル a、b の内積を、次の2通りで習ったと思います。

見方式
成分で計算するa = (a₁, a₂)、b = (b₁, b₂) のとき、a・b = a₁b₁ + a₂b₂
向きで計算するa・b = |a||b|cosθ(θは2つのベクトルのなす角、|a|は長さ)

2つ目の式を変形すると、cosθ = a・b ÷ (|a||b|) になります。これがコサイン類似度です。内積を、2つのベクトルの長さの積で割ることで、長さの影響を取り除き、向きだけを比べています。

例として、a = (3, 1)、b = (2, 1) で計算します。

例:a = (3, 1)、b = (2, 1)1内積を求めるa・b = 3×2 + 1×1 = 72長さを求める|a| = √(3²+1²) = √10 ≈ 3.16  |b| = √(2²+1²) = √5 ≈ 2.243長さの積で割るcosθ = 7 ÷ (3.16 × 2.24) ≈ 0.99約0.99:ほぼ同じ向き(かなり近い)
図5 コサイン類似度の計算:内積を、2つの長さの積で割る

結果は約0.99で、ほぼ同じ向きです。文章のベクトルは1536個のような長い数字の並びですが、各成分の積をすべて足して内積を求め、長さで割る計算は同じです。2次元と違って図には描けませんが、同じ式で計算できます。

似ているとき・似ていないとき

同じ a = (3, 1) に対して、b を変えてみます。

似ているab内積 = 7 cosθ ≈ 0.99ほぼ同じ向き(a = (3, 1))関係が薄いab内積 = 0 cosθ = 0直角(a = (3, 1))反対向きab内積 = -10 cosθ = -1正反対(a = (3, 1))
図6 向きが近いほど1、直角で0、反対向きで-1
b内積cosθ向き
(2, 1)7約0.99ほぼ同じ向き。内容が似ているイメージ
(-1, 3)00直角。関係が薄いイメージ
(-3, -1)-10-1反対向き
注意

文章のEmbeddingでは、-1に近い値が、そのまま「反対の意味」を表すとは限りません。また、どの値から「似ている」と判断するかは、使うモデルや文書によって変わり、一律の基準はありません。実際には、値そのものよりも、複数の候補の値を比べて、大小で順位を付けて使います。

内積・類似度をどう使うか

検索では、質問をベクトルにして、各文書のベクトルとのコサイン類似度を計算します。値が大きい順に並べ、上位のいくつかを候補にします。

質問のベクトル q = (3, 1) (例:返品したい)質問とのコサイン類似度購入品を返す方法ベクトル (2, 1)0.99(1位)営業時間のご案内ベクトル (1, 3)0.60(2位)ログインできないベクトル (-1, 3)0.00(3位)すべての文書で類似度を計算し、大きい順に上位を候補にする(2次元の説明用の例)
図7 質問と各文書のコサイン類似度を計算し、大きい順に並べる

ベクトルの長さを1にそろえる(正規化する)と、長さで割る必要がなくなり、内積がそのままコサイン類似度になります。Anthropicのドキュメントでは、Voyage AIのEmbeddingは長さ1に正規化されていて、内積とコサイン類似度が同じになると説明されています。計算が単純になります。

近さを測る方法には、距離で測るものもありますが、この記事では、OpenAIの例で使われているコサイン類似度を中心に説明しました。

近いことと、同じ答えであることは別

コサイン類似度が高いと分かるのは「近い内容かどうか」までです。質問に対する正しい答えが、その文書に書かれているかどうかは、別の問題です。

質問:「この商品は返品できますか」返品できない商品の一覧否定の内容でも近くなりうる返品の手続きの流れ答えが載っているかは別営業時間のご案内ほぼ無関係近さ(模式)近い順に候補を並べるのは得意でも、その中に正しい答えがあるかは別に確認する
図8 近いことと、同じ答えであることは別(棒の長さは説明用です)

たとえば「この商品は返品できますか」という質問には、「返品できない商品の一覧」も近い文書として上がってきます。話題が同じだからです。答えが「できる」なのか「できない」なのかは、文書の中身を読んで確かめる必要があります。

否定表現には、特に注意が必要です。NevIRという研究では、否定だけが違う2つの文書を並べ替えさせる課題で、最新のものを含む多くの検索モデルが、否定を考慮せず、ランダムな並べ替えと同じか、それ以下の結果だったと報告されています。この研究は2023年のもので、現在のモデルで同じとは限りません。自分が使うモデルで確かめる必要があります。

質問:返品できる商品を探したいこの商品は返品できます人が読むと:質問に合うこの商品は返品できません人が読むと:質問に合わない質問との近さ(模式)否定だけが違う2文は、近さがほとんど同じになることがある(NevIRの報告をもとにした説明用の例で、実際の値ではありません)
図9 否定だけが違う文は、近さでは区別しにくいことがある

専門用語や社内用語も同様です。モデルがその言葉をあまり学んでいなければ、近さの判断がずれることがあります。

Embeddingはどこで使う?

OpenAIのドキュメントは、Embeddingの使い道として、検索、クラスタリング、おすすめ、異常検知、多様性の測定、分類を挙げています。Hugging Faceの解説には、言い換えの検出も挙がっています。

類似文書検索言い換え・重複の検出分類の補助クラスタリング・おすすめEmbedding(ベクトル)大量の文書を保存して探す仕組みは別の記事で扱います
図10 ベクトルにしておくと、「近さ」を使ういろいろな処理ができる
使い道何をするか
類似文書検索質問に近い文書を探す。言い換えでも見つけやすい
言い換え・重複の検出ほぼ同じ内容の文章を見つけ、まとめたり除いたりする
分類の補助既に分かっている例に近いかどうかで、種類を振り分ける
クラスタリング近い文章どうしをグループにまとめる
おすすめ読んだものに近い内容を提示する

大量の文書をベクトルにして保存し、素早く探す仕組みは、別の記事で扱います。そこで、探した文書をAIに渡して答えさせる使い方(RAG)にもつながります。

モデルによって「近さ」は変わる

どのEmbeddingモデルを使うかで、ベクトルも、近さの判断も変わります。Googleのドキュメントは、gemini-embedding-001 と gemini-embedding-2 のベクトルの空間は互換性がないと説明しています。別のモデルで作ったベクトルどうしは、混ぜて比べられません。

モデルA返品したい返金について営業時間モデルB返品したい返金について営業時間モデルが違うと並びも変わり、別のモデルのベクトルどうしは比べられない同じ文章でも結果が変わるため、自分の文書で試して確かめる(配置は説明用の例)
図11 使うEmbeddingモデルによって、「近さ」は変わる
確認すること理由
どのモデルかモデルが変わると、ベクトルも近さも変わる。保存済みのベクトルを作り直す必要が出ることもある
対象の言語・文書モデルによって得意な言語や用途が違う。日本語や社内文書で試して確かめる
入力の種類質問用と文書用を区別するモデルがある(Voyage AIの input_type、Geminiの task_type など)
次元数多いほど良いとは限らない。Googleは、性能は次元数の大きさだけでは決まらないと説明している

公開されている比較(MTEBなど)は、モデルを選ぶときの手がかりになります。ただ、自分の文書や言い回しで、期待どおりに近い文書が上がってくるかは、実際に試さないと分かりません。

注意

次元数を減らして使う場合は、ベクトルの長さをそろえる処理(正規化)が必要なことがあります。OpenAIのドキュメントは、次元数を手動で変えるときは正規化するよう説明しています。GoogleのEmbeddingモデルでも、モデルによって、自動で正規化されるものと手動で行うものがあります。

全体像と用語

ここまでの内容を1枚にまとめると、次の図のようになります。

文章質問と文書Embeddingモデルベクトル0.12, -0.53, …近さを測るコサイン類似度近い順の候補正解の保証はない近い=正解ではない。モデルごとに近さは変わる保存して、大量の文書から探す仕組みは、別の記事で扱います
図12 Embeddingで「意味の近さ」を使うまでの流れ
用語意味
Embedding(埋め込み)文章などを、数値の並び(ベクトル)で表したもの。また、その変換
ベクトル数値の並び。Embeddingでは、同じモデルなら長さが一定
次元数ベクトルの長さ。モデルごとに異なる(例:1536、3072)
類似度2つのベクトルがどれだけ近いかを表す値
内積2つのベクトルの対応する成分を掛けて足した値。a・b = |a||b|cosθ
コサイン類似度内積を2つの長さの積で割った値(cosθ)。向きの近さを-1〜1で表す
Embeddingモデル文章をベクトルに変換する専用のモデル。文章を作るモデルとは別
意味検索単語の一致ではなく、内容の近さで文書を探す方法

コメント