AI・機械学習
中級
text-embedding-3-small(OpenAI)(テキストエンベディングスリースモール)
OpenAIの第3世代テキスト埋め込みモデル。最大8,192トークン・1536次元・1M tokens $0.02で、RAGやセマンティック検索の標準的な選択肢。
0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
embedding
openai
llm
rag
vector-search
mrl
text-embedding-3-small(OpenAI)
概要
text-embedding-3-smallは、OpenAIが2024年1月にリリースした第3世代テキスト埋め込みモデルです。前世代のtext-embedding-ada-002と比較して、MTEB(Massive Text Embedding Benchmark)スコアが向上しながら料金が60%削減($0.10/1M tokens → $0.02/1M tokens)されました。RAGシステム・セマンティック検索・テキスト分類など多様なNLPタスクで活用されています。
スペック
| 項目 | text-embedding-3-small | text-embedding-3-large | text-embedding-ada-002 |
|---|---|---|---|
| 最大入力トークン | 8,192 | 8,192 | 8,191 |
| デフォルト次元数 | 1,536 | 3,072 | 1,536 |
| 最小次元数(MRL) | 512 | 256 | なし |
| 料金 | $0.02/1M | $0.13/1M | $0.10/1M |
| MTEB Avg スコア | 62.3 | 64.6 | 61.0 |
使用方法
from openai import OpenAI
client = OpenAI()
# 基本的な埋め込み生成
response = client.embeddings.create(
input=["PCパーツの選び方について教えてください"],
model="text-embedding-3-small"
)
vector = response.data[0].embedding # 1536次元のリスト
print(f"次元数: {len(vector)}") # 1536
# MRL: 次元削減して利用(コスト・ストレージ節約)
response_small = client.embeddings.create(
input=["PCパーツの選び方について教えてください"],
model="text-embedding-3-small",
dimensions=512 # 512次元に削減
)
vector_small = response_small.data[0].embedding
print(f"削減後次元数: {len(vector_small)}") # 512
MRL(Matryoshka Representation Learning)
dimensionsパラメータで出力ベクトルの次元数を動的に削減できる技術です。通常の次元削減(PCA等)と異なり、情報損失を最小化しながら短いベクトルで効率的に検索できます。
| 次元数 | ストレージ削減 | 検索精度(MTEB比) | 用途 |
|---|---|---|---|
| 1536 | 0% | 100% | 高精度検索 |
| 1024 | 33% | 約98% | バランス |
| 512 | 67% | 約95% | コスト重視 |
RAGパイプラインでの活用
import numpy as np
from openai import OpenAI
client = OpenAI()
def cosine_similarity(a: list, b: list) -> float:
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
documents = [
"DDR5メモリはDDR4の2倍の帯域幅を持つ",
"NVMe SSDはSATA SSDより約5倍高速",
"GeForce RTX 4090は24GB GDDR6Xを搭載"
]
doc_embeddings = [
client.embeddings.create(input=[doc], model="text-embedding-3-small").data[0].embedding
for doc in documents
]
query = "最新メモリの帯域幅は?"
query_embedding = client.embeddings.create(
input=[query], model="text-embedding-3-small"
).data[0].embedding
similarities = [
(doc, cosine_similarity(query_embedding, emb))
for doc, emb in zip(documents, doc_embeddings)
]
similarities.sort(key=lambda x: x[1], reverse=True)
print(f"最類似: {similarities[0][0]} (score: {similarities[0][1]:.3f})")
他モデルとの使い分け
- text-embedding-3-small: コスト重視・高頻度呼び出し・プロトタイプ開発
- text-embedding-3-large: 精度重視・最終製品・多言語対応が重要な場合
- text-embedding-ada-002: レガシーシステム(移行推奨)
- ローカルモデル(BGE-M3等): プライバシー重視・オフライン環境