Vector Embeddingとは何か
ニューラルネットワークがテキストを高次元空間の密なベクトルに変換する仕組み、意味的に近いテキストが近接したベクトルになる理由、cosine similarityが測定するものを理解します。
「Vector Embeddingとは何か」はCoddyKit上の無料AI Engineering Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Engineering Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Engineering Academyコースには全4レッスンが含まれています。
数値が持つ意味
ベクトル埋め込みとは、テキストの一部が持つ意味を表す数値のリスト(ベクトル)です。単語を生の文字列として保存する代わりに、ニューラルネットワークは意味的な情報を高密度な数値配列にエンコードする方法を学習します。意味が近い2つのテキストは、この高次元空間内で互いに近いベクトルになります。
高次元ベクトル空間
現代の埋め込みは、通常768~3072次元です。各次元は、トピック、感情、文体、関係性など、意味に関する潜在的な特徴を、明示的にプログラムされることなく捉えます。その結果、意味の関係性を測定可能な距離として表現できる豊かな幾何学的空間が得られます。
たとえば、text-embedding-3-smallは1536次元のベクトルを生成し、text-embedding-3-largeは3072次元のベクトルを生成します。
ニューラルネットワークによる埋め込みの学習方法
埋め込みモデルは、大規模なテキストコーパスを使って、欠落した単語を予測する(マスク言語モデル)か、意味的に類似したペアと異なるペアを見分けるように学習します。学習中、ネットワークは数百万の重みを調整し、類似したテキストが学習済みのベクトル空間内で自然にまとまるようにします。
これが、埋め込みが密な表現と呼ばれる理由です。ほとんどの値が0になるスパースなone-hotエンコーディングとは異なり、すべての次元が情報を持っています。
コサイン類似度:近さの測定
コサイン類似度は2つのベクトル間の角度を測定し、-1から1までの値を返します。スコアが1の場合はベクトルがまったく同じ方向を指している(意味が同一)ことを示し、0は直交している(無関係)こと、-1は正反対の方向を指していることを示します。
テキストでは、ベクトルの大きさを無視して方向だけに着目できるため、テキストの長さの違いに強く、ユークリッド距離よりもよく使われます。
import numpy as np
def cosine_similarity(vec_a, vec_b):
dot_product = np.dot(vec_a, vec_b)
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
return dot_product / (norm_a * norm_b)
# Example with tiny 3D vectors
v1 = np.array([0.8, 0.2, 0.5])
v2 = np.array([0.9, 0.1, 0.4])
print(cosine_similarity(v1, v2)) # Close to 1.0意味的類似性が重要な理由
従来のキーワード検索は、ユーザーが言い換えた場合に機能しません。automobileを検索しても、carsについて書かれたドキュメントは見つからないことがあります。ベクトル埋め込みを使うと、使われている単語が正確に一致しなくても、意味的に同等のテキストが近いベクトルにマッピングされるため、この問題を解決できます。
これにより、単語の重なりではなく意味に基づいて最も関連性の高い結果を見つけるセマンティック検索が可能になります。これはRAGシステムに必要な基本機能です。
埋め込みベクトルを視覚化する
文章を2Dマップに配置する(簡略化した例です)と考えてみてください。machine learningに関する文章はある領域に集まり、cookingに関する文章は別の領域に集まり、sportsに関する文章は3つ目の領域を形成します。ベクトル埋め込みは、このマップを数千次元の空間に作り出します。
king - man + woman ≈ queenのような有名な関係は、この空間で実際に成り立つ算術です。ベクトル演算によって、意味の類推がエンコードされます。
シンプルな埋め込みの生成
OpenAI embeddings APIはテキストを受け取り、浮動小数点数のリストを返します。1回のAPI呼び出しで、1文でも段落全体でも埋め込むことができます。返されるベクトルの次元数は、入力の長さに関係なく一定です。
重要なのは、入力が長くなってもベクトルが大きくなるわけではないという点です。常に同じサイズの固定ベクトルが生成されますが、非常に長いテキストでは、モデルがすべてを固定された空間に圧縮するため、細かな情報が失われる場合があります。
from openai import OpenAI
client = OpenAI() # uses OPENAI_API_KEY from environment
response = client.embeddings.create(
model='text-embedding-3-small',
input='Vector embeddings capture semantic meaning.'
)
embedding = response.data[0].embedding
print(f'Dimensions: {len(embedding)}') # 1536
print(f'First 5 values: {embedding[:5]}')複数のテキストを一度に埋め込む
inputパラメータにリストを渡すことで、1回のAPI呼び出しで複数の文字列を埋め込むことができます。テキストごとに1回ずつリクエストするよりも、ネットワーク往復を減らし、APIで計算をバッチ処理できるため、はるかに効率的です。
レスポンスには入力ごとに1つの埋め込みオブジェクトが含まれ、入力と同じ順序で並んでいるため、元のテキストと簡単にzip結合できます。
from openai import OpenAI
client = OpenAI()
texts = [
'Python is a programming language.',
'Snakes are reptiles.',
'Machine learning requires data.'
]
response = client.embeddings.create(
model='text-embedding-3-small',
input=texts
)
for text, result in zip(texts, response.data):
print(f'{text[:30]}... -> {len(result.embedding)}D vector')内積とコサイン類似度の比較
埋め込みがL2正規化されている場合(大きさが1の単位ベクトル)、内積はコサイン類似度と等しくなります。OpenAIの埋め込みモデルは正規化されたベクトルを返すため、どちらの指標も使用できます。内積のほうが計算はわずかに高速です。
ただし、異なるモデルや、正規化されていない可能性のあるソースの埋め込みを組み合わせる場合は、誤解を招く結果を避けるため、必ずコサイン類似度を明示的に計算してください。
import numpy as np
def normalize(vec):
return vec / np.linalg.norm(vec)
v1 = normalize(np.array([3.0, 4.0, 0.0]))
v2 = normalize(np.array([4.0, 3.0, 0.0]))
# For unit vectors: dot product == cosine similarity
dot = np.dot(v1, v2)
print(f'Dot product: {dot:.4f}') # same as cosine sim埋め込みとOne-Hotエンコーディング
One-hotエンコーディングでは、各単語を、1がちょうど1つだけ含まれ、それ以外がすべて0のベクトルで表します。5万語の語彙では5万次元のベクトルが生成され、そのほとんどが0になります。非常に非効率的です。
密な埋め込みは768~3072次元ですが、すべての次元が実際の情報を持ちます。空間のサイズは10~20分の1でありながら、同義語、類推、構成的な意味など、one-hotエンコーディングでは完全に捉えられない、はるかに豊かなニュアンスを表現できます。
埋め込みの一般的なユースケース
セマンティック検索以外にも、埋め込みはさまざまな実用的アプリケーションを支えています。
- セマンティック検索 — キーワードではなく意味でドキュメントを検索
- レコメンデーションシステム — ユーザーが気に入ったアイテムに似たアイテムを提案
- クラスタリング — トピックごとにドキュメントを自動的にグループ化
- 分類 — 埋め込みを線形分類器への入力として使用
- 重複排除 — ほぼ重複しているコンテンツを検出
すべてのRAGシステムは、ユーザーのクエリと関連するドキュメントチャンクを対応付けるために埋め込みに依存しています。
クイックチェック
このレッスンで学んだAI Engineeringの概念について、理解度を確認します。
レッスンのまとめ
このレッスンでは、ベクトル埋め込みが意味情報を高密度な数値配列としてエンコードすること、コサイン類似度がベクトルの方向を比較して意味的な近さを測定すること、そしてOpenAIのembedding APIが1回の呼び出しでテキストを固定サイズのベクトルに変換することを学びました。次は、実際にOpenAIのモデルを使って埋め込みを生成し、比較する方法について学びます。
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「Vector Embeddingとは何か」レッスンは無料ですか?
はい。「Vector Embeddingとは何か」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Engineering Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Engineering Academyコースには全4レッスンが含まれています。
「Vector Embeddingとは何か」で何を学びますか?
ニューラルネットワークがテキストを高次元空間の密なベクトルに変換する仕組み、意味的に近いテキストが近接したベクトルになる理由、cosine similarityが測定するものを理解します。 ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Engineering Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Engineering Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Vector Embeddingとは何か」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Engineering Academyレッスンでコードを書いて実行できますか?
はい。すべてのAI Engineering Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Vector Embeddingとは何か
- OpenAIでEmbeddingを生成する
- NumPyによるSemantic Search
- Embeddingのクラスタリングと可視化