OpenAIのEmbeddings APIを使って文の意味上の類似度を計算

はじめに

おはようございます。こんにちは。こんばんは。
GMOアドマーケティングのY-Kです。

前にBERTを使って文をベクトルに変換してからなんやかんやする記事を書いてから約半年が経過したのですが、その間にChatGPTが大きく流行り、言語生成系AIに大きな風が吹きました。

というわけで今回は、OpenAIのEmbeddings APIを利用し、記事タイトルの類似度を見てみようと思います。

準備

今回も例のごとくGoogle Colab上で行います。
https://colab.research.google.com/?hl=ja

OpenAIのEmbeddings APIを利用できる様にAPIキーは事前に取得しておいてください。

まずは必要なライブラリを使えるようにします。 次にライブラリのインポートとAPIキーを登録します。 これで準備は完了です。
tokenizerによる文の分割などもAPI側で行なってくれるので、前回と比べてとても楽になりました。

文のベクトル化

Embeddingsモデルはいくつかあるのですが、今回はtext-embedding-ada-002モデルを利用します。
入力1000トークンあたり、$0.0004 ドルかかります。
OpenAIのEmbeddingsモデルのページ APIからのレスポンスを受け取るとベクトルはlist型になっているので、tensorに変換しておきます。
これで文をベクトルに変換できる様になりました。

記事タイトルの類似度計算

前回は文の類似度を計算して終わりましたが、今回は応用として記事のタイトルの類似度を算出していきたいと思います。

まずは、使用するデータをChatGPTに生成してもらいます。
今回は記事タイトル「AIが医療診断の精度を大幅に向上させる」に対して類似度が高い記事タイトルを探していこうと思います。
対象の記事タイトルをベクトル化します。 次に、生成した10個の記事をDataFrame化します。 前回同様、コサイン類似度を算出する関数を作成し、各記事タイトルに対する類似度を算出します。 類似度降順で並べると結果は以下になりました。 似た記事タイトルは上位にきていることがわかります。

さいごに

今回はOpenAIのEmbeddings APIを利用して文の意味の類似度を算出するタスクを行いました。

利用にお金はかかりますが、手軽に高精度で文をベクトル化することができるので、さまざまなサービスに応用が効くと思います。