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

埋め込みベクトル

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

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 つのベクトル間の距離で関連度を測ります。距離が短いほど関連度が高く、長いほど関連度が低いと考えられます。

埋め込みの料金については、料金ページをご覧ください。リクエストの料金はトークン数に応じて決まり、入力に含まれるトークンが課金対象です。

埋め込みの取得方法

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

例:埋め込みの取得
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
  }
}

埋め込みベクトルのデフォルトの次元数は、1536(text-embedding-3-small)または 3072(text-embedding-3-large)です。概念を表現する能力を保ちながら次元数を減らすには、dimensions パラメータを指定します。埋め込みの次元数について詳しくは、埋め込みの活用例をご覧ください。

埋め込みモデル

OpenAI は、高性能な第 3 世代の埋め込みモデルを 2 種類提供しています。モデル ID に -3 が含まれているのが目印です。詳しくは、埋め込みモデル v3 の発表記事をご覧ください。

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

モデル 1 米ドルあたりのページ数(概算) MTEB での評価スコア 最大入力トークン数
text-embedding-3-small 62,500 62.3% 8192
text-embedding-3-large 9,615 64.6% 8192
text-embedding-ada-002 12,500 61.0% 8192

活用例

Amazon の食品レビューデータセットを使って、代表的な活用例を紹介します。

レビューの埋め込みの取得

このデータセットには、2012 年 10 月までに Amazon ユーザーが投稿した食品レビューが計 568,454 件含まれています。ここでは、例として直近の 1,000 件を使います。レビューは英語で書かれており、肯定的または否定的な評価に偏る傾向があります。各レビューには、ProductId、UserId、Score、タイトル(Summary)、本文(Text)が含まれます。次に例を示します。

商品 ID ユーザー ID 評価 タイトル 本文
B001E4KFG0 A3SGXH7AUHU8GW 5 Good Quality Dog Food I have bought several of the Vitality canned…
B00813GRG4 A1D87F6ZCVE5NK 1 Not as Advertised Product arrived labeled as 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"
);

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

from ast import literal_eval
import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(literal_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 上の OpenAI Cookbook に掲載しています。

距離関数の選び方

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

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

  • コサイン類似度は内積だけで求められるため、計算がやや高速
  • コサイン類似度とユークリッド距離のどちらを使っても順位は同じ

埋め込みのオンライン共有

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

v3 埋め込みモデルが把握している出来事の範囲

text-embedding-3-large と text-embedding-3-small は、2021 年 9 月より後に起きた出来事についての知識を持っていません。通常、テキスト生成モデルほど大きな制約にはなりませんが、例外的なケースでは性能が低下することがあります。