【Text Embedding 3】OpenAIの最新Embeddingモデルの使い方~実際の性能を検証してみた

text-embedding-3 OpenAI エンべディングモデル 使い方

WEELメディア事業部LLMリサーチャーの中田です。

1月26日、OpenAIから2つの新しい「埋め込みモデル」が公開されました。

このモデルを用いることで、言語情報をベクトル化し、効果的に機械学習に利用できるんです、、、!

公式のXでの投稿のいいね数は、発表から3時間ほどですでに900を超えており、期待の高さがうかがえます。

この記事ではtext-embedding-3の使い方や、有効性の検証まで行います。本記事を熟読することで、text-embedding-3の凄さを実感し、以前のOpenAIモデルには戻れなくなるでしょう。

ぜひ、最後までご覧ください。

目次

text-embedding-3の概要

OpenAIは、新しい埋め込みモデルtext-embedding-3を公開しました。このモデルには、以下の2つの新しい埋め込みモデルが含まれています。

  • text-embedding-3-small:小型で効率的
  • text-embedding-3-large:大型でより強力

「text-embedding-3-small」は、前モデル「text-embedding-ada-002」と比較して、多言語検索ベンチマーク(MIRACL)での平均スコアが31.4%から44.0%に、英語タスク用ベンチマーク(MTEB)での平均スコアが61.0%から62.3%に向上しています。

また、「text-embedding-3-large」は、最大3072次元の埋め込みを作成する新しい大型モデルで、MIRACLでの平均スコアが31.4%から54.9%に、MTEBでの平均スコアが61.0%から64.6%に向上しています。

また、価格も前モデルと比べて5倍安くなっています。

これらの新しい埋め込みモデルを用いることで、クラスタリングや類似文章の検索などの機械学習タスクを、効果的に実行できるようになります。

text-embedding-3の料金体系

text-embedding-3-smallの場合、1Kトークンあたり$0.00002ほどかかります。

text-embedding-3-largeの場合、1Kトークンあたり$0.00013ほどかかります。

text-embedding-3の使い方

今回は、Google ColabのT4を用いて実行します。

まずは、以下のコードを実行して、必要なライブラリのインストールをしましょう。

!pip install openai

次に、以下のコードを実行して、テキスト埋め込みを取得する準備をしましょう。ここでは「text-embedding-3-small」の方を使用します。

import os
os.environ["OPENAI_API_KEY"] = "Your OpenAPI Key"

from openai import OpenAI
client = OpenAI()

def get_embedding(text, model="text-embedding-3-small"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input = [text], model=model).data[0].embedding

そして「porcine pals」というテキストを、ベクトルに変換してみましょう。

text = "porcine pals"
len(get_embedding(text))
get_embedding(text)

上記のコードを実行すると、次元数「1536」と、1536次元のベクトルが表示されると思います。

text-embedding-3を動かすのに必要なPCのスペック

■Pythonのバージョン
Python 3.8以上

■必要なパッケージ
openai

text-embedding-3を実際に使ってみた

ここでは、text-embeddingの埋め込み技術を用いて、2つの文章の類似度を計算してみます。その際、類似度の計算に「コサイン類似度」を用います。

import numpy as np

def cosine_similarity(vec1, vec2):
    dot_product = np.dot(vec1, vec2)
    norm_vec1 = np.linalg.norm(vec1)
    norm_vec2 = np.linalg.norm(vec2)
    similarity = dot_product / (norm_vec1 * norm_vec2)
    return similarity

# 例として2つのベクトルを定義
vector1 = np.array(get_embedding("文章1"))
vector2 = np.array(get_embedding("文章2"))

# コサイン類似度の計算
similarity = cosine_similarity(vector1, vector2)
print(f"コサイン類似度: {similarity}")

まずは、以下の2つの文章。

  • Steak is good(ステーキはおいしい)
  • Coffee is bitter(コーヒーは苦い)

どちらも食べ物・飲み物の味に関する文章なので、ある程度は類似度が高くなってほしい所です。結果は以下の通り。

コサイン類似度: 0.21275942216209356

ある程度は高い数値ですが、やはり「おいしい」と「苦い」は少し別の意味合いになったのでしょう。

お次は、以下の2つの文章。

  • Soccer
  • futsal

結果は以下の通り。

コサイン類似度: 0.6035270269242425

やはり両者よく似たスポーツということもあり、高い数値が出ました!

最後に、以下の2つの文章。

  • monkey
  • banana

結果は以下の通り。

コサイン類似度: 0.41164899669893257

「サル」と「バナナ」は全く別物だから、コサイン類似度も低い数字になるのかと思いきや、高くなりましたね。やはり、「サルはバナナが好きだから」といった理由で、両者に関連性があると判定されたのか?

性能がどれくらい上がったか検証してみた

ここでは従来の埋め込みモデル「text-embedding-ada-002」に比べて、text-embedding-3の性能がどれくらい上がったのかを検証します。検証内容は先ほどのように「2つの文章の類似度計算」です。

まずは、以下のコードを実行して、3つの埋め込みモデルを利用できるようにします。

from openai import OpenAI
client = OpenAI()

def get_embedding_small(text, model="text-embedding-3-small"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input = [text], model=model).data[0].embedding

def get_embedding_large(text, model="text-embedding-3-large"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input = [text], model=model).data[0].embedding

def get_embedding_ada(text, model="text-embedding-ada-002"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input = [text], model=model).data[0].embedding

そして、以下のコードを実行して、各モデルで出力されたベクトルの類似度を計算し、表示します。

import numpy as np

def cosine_similarity(vec1, vec2):
    dot_product = np.dot(vec1, vec2)
    norm_vec1 = np.linalg.norm(vec1)
    norm_vec2 = np.linalg.norm(vec2)
    similarity = dot_product / (norm_vec1 * norm_vec2)
    return similarity

text1="banana"
text2="monkey"

# 例として2つのベクトルを定義
vector1 = np.array(get_embedding_small(text1))
vector2 = np.array(get_embedding_small(text2))

print("text-embedding-3-small")

# コサイン類似度の計算
similarity = cosine_similarity(vector1, vector2)
print(f"コサイン類似度: {similarity}")

print("\n")

# 例として2つのベクトルを定義
vector1 = np.array(get_embedding_large(text1))
vector2 = np.array(get_embedding_large(text2))

print("text-embedding-3-large")

# コサイン類似度の計算
similarity = cosine_similarity(vector1, vector2)
print(f"コサイン類似度: {similarity}")

print("\n")

# 例として2つのベクトルを定義
vector1 = np.array(get_embedding_ada(text1))
vector2 = np.array(get_embedding_ada(text2))

print("text-embedding-3-ada-002")

# コサイン類似度の計算
similarity = cosine_similarity(vector1, vector2)
print(f"コサイン類似度: {similarity}")

2つの文章には、ChatGPTに「意味的に似ている2つの文章を生成してください。」「意味的に似ていない2つの文章を生成してください。」というプロンプトを入力し、出力されたものを使用しました。

まずは、以下の2つの意味的に似た文章。

  • The sun was setting, casting a warm golden glow over the city as the day slowly came to an end.(一日がゆっくりと終わろうとしているとき、太陽は沈んでいき、街に暖かい黄金の輝きを投げかけていた。)
  • As the day drew to a close, the city was bathed in the soft light of the setting sun, turning everything into gold.(一日が終わりに近づくにつれ、街は夕陽の柔らかな光に包まれ、すべてを黄金色に染めていった。)

この2つの文章の意味は似ているので、ある程度コサイン類似度の値が高いのが望ましいです。

結果は以下の通り。

text-embedding-3-small
コサイン類似度: 0.8428169121751229


text-embedding-3-large
コサイン類似度: 0.860045753726878


text-embedding-ada-002
コサイン類似度: 0.9588945157630332

一番高かったのが、text-embedding-ada-002で計算したコサイン類似度でした。ただ、0.95という値は高すぎるため、text-embedding-3の出力内容のほうが、類似度を上手く捉えているという見方も不可能ではないですね。

お次は、以下の2つの意味的にまったく似ていない文章。

  • A group of scientists is launching a new study on the effects of climate change on Arctic wildlife.(気候変動が北極圏の野生生物に及ぼす影響について、科学者グループが新たな研究を開始した。)
  • In the bustling city market, vendors sell a variety of fresh fruits and vegetables to local shoppers.(賑やかな市では、業者が地元の買い物客にさまざまな新鮮な野菜や果物を売っている。)

結果は以下の通り。

text-embedding-3-small
コサイン類似度: 0.014516211086674564


text-embedding-3-large
コサイン類似度: 0.035299185035971375


text-embedding-ada-002
コサイン類似度: 0.7360667138087893

text-embedding-3のコサイン類似度の値が、小さくなっていることが分かります。そのため、入力された2つの文章が、意味的に似ていないということを上手く捉えています。

その反面、text-embedding-ada-002の方は、かなり高い値になってしまっているので、この観点から言えば「text-embedding-3の方が、類似度を上手く捉えらえる」と言えるでしょう。

最後に、以下の2つの「言い換えただけ」の文章。

  • “Heavy rainfall caused the river to overflow, leading to widespread flooding in the area.”(激しい雨により川が氾濫し、一帯が広範囲に及ぶ洪水に見舞われた)
  • “The area experienced extensive flooding due to the river overflowing as a result of intense rain.”(激しい雨の結果、川が氾濫し、この地域は広範囲にわたって洪水に見舞われた”)

2つの文章の意味はほとんど一緒なので、コサイン類似度の値も高いほうが望ましいです。

結果は以下の通り。

text-embedding-3-small
コサイン類似度: 0.8024681084299433


text-embedding-3-large
コサイン類似度: 0.7538194986246513


text-embedding-ada-002
コサイン類似度: 0.9582265172687607

こちらは、なんとtext-embedding-ada-002が一番高いです。そのため、「2つの文章が似ている」という関係性については、前モデルの方が得意なのかもしれません。

とはいえ、先ほどのすべての検証において、text-embedding-ada-002のコサイン類似度は高く出力されたので、text-embedding-3の方が全体的に性能が高いのだと思われます。

なお、GPT-3.5とGPT-4の違いについて詳しく知りたい方は、下記の記事を合わせてご確認ください。
ChatGPT-3.5とGPT-4の違いとは?料金や機能、使い方について徹底比較

まとめ

OpenAIは、新しい埋め込みモデルtext-embedding-3を公開しました。このモデルには、以下の2つの新しい埋め込みモデルが含まれています。

  • text-embedding-3-small:小型で効率的
  • text-embedding-3-large:大型でより強力

すべての検証において、text-embedding-ada-002のコサイン類似度は高く出力されたので、text-embedding-3の方が全体的に性能が高いのだと思われます。

本記事でご紹介した埋め込みモデルを利用して、より高度な自然言語処理タスクが可能になるでしょう。加えて、言語系のタスクの精度や、その他のモーダルの生成系タスクも、格段にアップする予感。

サービス紹介資料

生成系AIの業務活用なら!

・生成系AIを活用したPoC開発

・生成系AIのコンサルティング

・システム間API連携

最後に

いかがだったでしょうか?

弊社では

・マーケティングやエンジニアリングなどの専門知識を学習させたAI社員の開発
・要件定義・業務フロー作成を80%自動化できる自律型AIエージェントの開発
・生成AIとRPAを組み合わせた業務自動化ツールの開発
・社内人事業務を99%自動化できるAIツールの開発
ハルシネーション対策AIツールの開発
自社専用のAIチャットボットの開発

などの開発実績がございます。

まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。

➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

生成AIを社内で活用していきたい方へ
無料相談

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、サービス紹介資料もご用意しておりますので、併せてご確認ください。

投稿者

  • 中田

    データサイエンス専攻の大学院生。大学では、生成系AIの拡散モデルを用いた音楽生成について研究。 趣味は作曲、サッカー、コーヒー。

  • URLをコピーしました!
  • URLをコピーしました!
目次