For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション

ベクトル埋め込み

テキストを数値に変換し、検索などに活用する方法を学びます。

New embedding models
text-embedding-3-small and text-embedding-3-large, our newest and most performant embedding models, are now available. They feature lower costs, higher multilingual performance, and new parameters to control the overall size.

埋め込みとは

OpenAI のテキスト埋め込みは、文字列同士の関連性を測定します。埋め込みは主に次の用途で使われます。

  • 検索 (クエリ文字列との関連性に基づいて結果を順位付け)
  • クラスタリング (類似性に基づいて文字列をグループ化)
  • レコメンデーション (関連する文字列を持つ項目を推薦)
  • 異常検知 (関連性の低い外れ値を特定)
  • 多様性の測定 (類似度の分布を分析)
  • 分類 (最も類似するラベルに基づいて文字列を分類)

埋め込みは、浮動小数点数のベクトル(リスト)です。2 つのベクトル間の距離で、両者の関連性を測定します。距離が短いほど関連性が高く、長いほど関連性が低いことを示します。

埋め込みの料金については、料金ページをご覧ください。リクエストは、入力に含まれるトークン数に基づいて課金されます。

埋め込みの取得方法

埋め込みを取得するには、文字列と埋め込みモデル名(例:text-embedding-3-small)を埋め込み API エンドポイントに送信します。

例:埋め込みの取得
import OpenAI from "openai";
const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "Your text string goes here",
  encoding_format: "float",
});

console.log(embedding);

レスポンスには、埋め込みベクトル(浮動小数点数のリスト)と追加のメタデータが含まれます。埋め込みベクトルを抽出してベクトルデータベースに保存し、さまざまなユースケースに活用できます。

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.006929283495992422, -0.005336422007530928, -4.547132266452536e-5,
        -0.024047505110502243
      ]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

デフォルトの埋め込みベクトルの長さは、text-embedding-3-small では 1536text-embedding-3-large では 3072 です。概念を表現する性質を失わずに埋め込みの次元数を減らすには、dimensions パラメーターを渡します。埋め込みの次元数について詳しくは、埋め込みのユースケースのセクションをご覧ください。

埋め込みモデル

OpenAI は、高性能な第 3 世代の埋め込みモデルを 2 つ提供しています(モデル ID 内の -3 が目印です)。詳しくは、埋め込み v3 の発表ブログ記事をご覧ください。

利用料金は入力トークン単位で計算されます。以下は、1 ページあたり約 800 トークンと仮定した場合に、1 米ドルで処理できるテキストのページ数の例です。

モデル1 ドルあたりのページ数(概算)MTEB 評価での性能最大入力
text-embedding-3-small62,50062.3%8192
text-embedding-3-large9,61564.6%8192
text-embedding-ada-00212,50061.0%8192

ユースケース

ここでは、Amazon の食品レビューデータセットを使って、代表的なユースケースをいくつか紹介します。

埋め込みの取得

このデータセットには、2012 年 10 月までに Amazon ユーザーが投稿した計 568,454 件の食品レビューが含まれています。説明用に、最新の 1000 件のレビューを抽出して使用します。レビューは英語で書かれており、肯定的または否定的な内容に偏る傾向があります。各レビューには、ProductIdUserIdScore、レビューのタイトル(Summary)、レビューの本文(Text)があります。以下に例を示します。

プロダクト IDユーザー IDスコア要約本文
B001E4KFG0A3SGXH7AUHU8GW5品質の良いドッグフードVitality の缶詰をいくつか購入しました…
B00813GRG4A1D87F6ZCVE5NK1広告の説明と違う届いた商品には「Jumbo Salted Peanut」と表示されていました…

以下では、レビューの要約と本文を 1 つのテキストに結合します。モデルはこの結合したテキストをエンコードし、1 つのベクトル埋め込みを出力します。

Get_embeddings_from_dataset.ipynb
import { mkdir, writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI();
const reviews = ["A rich cup of coffee.", "A bright herbal tea."];

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: reviews.map((review) => review.replaceAll("\n", " ")),
});

const csvField = (value) => `"${value.replaceAll('"', '""')}"`;
const rows = response.data.map(({ embedding }, index) =>
  [csvField(reviews[index]), csvField(JSON.stringify(embedding))].join(",")
);

await mkdir("output", { recursive: true });
await writeFile(
  "output/embedded_1k_reviews.csv",
  ["combined,ada_embedding", ...rows].join("\n") + "\n"
);

保存したファイルからデータを読み込むには、次のコードを実行します。

import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(eval).apply(np.array)

よくある質問

埋め込み生成前の文字列のトークン数の確認方法

Python では、OpenAI のトークナイザー tiktoken を使って文字列をトークンに分割できます。

コード例:

import tiktoken


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens


num_tokens_from_string("tiktoken is great!", "cl100k_base")

text-embedding-3-small などの第 3 世代の埋め込みモデルには、cl100k_base エンコーディングを使用します。

詳しい説明とコード例は、OpenAI Cookbook のガイド「tiktoken でトークン数を数える方法」を参照してください。

最近傍の埋め込みベクトル K 個を高速に取得する方法

大量のベクトルを高速に検索するには、ベクトルデータベースの使用をお勧めします。ベクトルデータベースと OpenAI API を組み合わせた使用例は、GitHub 上の Cookbook で確認できます。

距離関数の選び方

コサイン類似度をお勧めします。通常、どの距離関数を選んでも大きな違いはありません。

OpenAI の埋め込みは長さが 1 になるように正規化されているため、次の性質があります。

  • 内積だけでコサイン類似度を求められるため、計算が少し速くなります
  • コサイン類似度とユークリッド距離のどちらを使っても、ランキングは同じになります

埋め込みのオンライン共有は可能ですか?

はい。埋め込みを含め、当社のモデルへの入力とモデルからの出力はお客様に帰属します。当社の API に入力するコンテンツが適用法や当社の利用規約に違反しないようにする責任は、お客様にあります。

V3 埋め込みモデルには最近の出来事に関する知識がありますか?

いいえ。text-embedding-3-largetext-embedding-3-small のモデルには、2021 年 9 月より後に起きた出来事に関する知識はありません。通常、テキスト生成モデルほど大きな制約にはなりませんが、一部の特殊なケースでは性能が低下することがあります。