エモーションテックで事業開発・データ分析(時々エンジニア)をしているイケガメです。
生成AIの登場によって、テキスト分析の常識は急速に変化しています。
その一方で、自然言語処理における基本的な考え方は、現在も変わっていません。 例えば、テキストの分類や検索において核となる「単語や文章のベクトル化(埋め込み)」は、今後も重要な基盤技術として位置づけられるでしょう。
この技術を利用することで、「2つのテキストの類似度」を判定することが可能になります。
今回は、Azure OpenAIとVertex AIのEmbedding(埋め込み)モデルを利用して、2つの文章の類似度を判定する実験を行いました。 これらのモデルは、2つの文章の類似度をどの程度正確に判定できるでしょうか。
実験概要
対象のモデル
- text-embedding-3-large (Azure OpenAIの最新モデル。3072次元)
- text-embedding-3-small (Azure OpenAIの最新モデル。1536次元)
- text-embedding-ada—002 (Azure OpenAIの旧モデル。1536次元)
- text-multilingual-embedding-preview–0409 (Vertex AIの最新モデル。768次元)
*注1
Vertex AIでは、text-embedding-preview-0409も提供されていますが、今回は日本語を対象とするため、多言語対応モデルを利用しています。 (Azure OpenAIの埋め込みモデルには、分析言語の区別はありません)
*注2
一般的に、次元数が大きいほど、モデルの表現力が高くなりますが、計算コストも高くなります。 モデルによっては出力時の次元数を調整することも可能ですが、今回の実験では、各モデルのデフォルト(最大)の次元数を利用しています。
*参考:
Azure OpenAI Service models - Azure OpenAI | Microsoft Learn
類似度の指標
ごく一般的な類似度指標であるcosine類似度を用います。0〜1の値を取り、1に近いほど、類似度が高いことを意味します。
分析に使用した文章
以下の7つを用意しました。 1の文章をベースとして、2〜7の文章を生成しています。 各文章の生成意図はタグで補足しています。
- テーブルの上にコップがある
- テーブルの上に時計とコップがある # 追加
- コップがテーブルの上にある # 倒置
- テーブルの上に時計がある # 置換_物体
- テーブルの下にコップがある # 置換_上下
- 部屋の中にコップがある # 置換_環境
- テーブルの上にコップはない # 否定
さて、2〜7の文章は、1に対して、どの程度の類似度として判定されるでしょうか。 人間の感覚では、3(# 倒置)が最も類似度が高く、7(# 否定)が最も低い結果となることが期待されます。
実験結果
まず、text-embedding-3-largeの結果から見ていきます。 1(ベース文章)との類似度が重要であるため、一番上の行に着目してください。
*注 色が濃いほど、類似度が高いことを示しています。 また、矢印マークは、類似度が高いほど、上向きになるようにしています。 なお、数値の絶対値は、モデルによってその目安が異なるため、比較する際には注意が必要です。
1との類似度に注目すると、5(# 置換_上下)が最も高く、次いで3(# 倒置)が高い結果となりました。 できれば、意味の変わっていない3(# 倒置)が最も高い結果となることが望ましいところですが、実際には、「上下」が置換された5が最も高い結果となりました。
また、7(# 否定)との類似度もやや高い結果になっています。
一方、4(# 置換_物体)と6(# 置換_環境)は、1との類似度が低い結果となりました。 「コップ」や「テーブル」といった文章内の主体が変わると、類似度が低くなる傾向が見られます。(こちらには納得がいきますね。)
次に、text-embedding-3-smallの結果です。
text-embedding-3-largeとほぼ同様の結果となりました。
ただし、5(# 置換_上下)との類似度は相対的に高くなっています。 埋め込みモデルにおいて、位置関係の違いは、あまり重視されないのでしょうか。
さて、次はtext-embedding-ada-002とtext-multilingual-embedding-preview–0409の結果を見ていきます。
これらのモデルは、数値の絶対値が大きいため、このままだと比較が難しいです。 よって、各モデルの結果を正規化して、比較しやすいようにします。
まず、text-embedding-ada-002の正規化後の結果を見ていきます。
やはり、5(# 置換_上下)が最も高く、次いで3(# 倒置)が高い結果となりました。
興味深いのは、7(# 否定)との類似度が、他のモデルより相対的に低い結果となっていることです。 旧モデルであるtext-embedding-ada-002ですが、否定の判別については、他のモデルよりも若干上手くできているかもしれません。
最後に、text-multilingual-embedding-preview–0409の正規化後の結果です。
3(# 倒置)が最も高く、ほぼ同水準で5(# 置換_上下)と7(# 否定)が高い結果となりました。 これらは全て、1(ベース)との判別がほぼできていないようです。
また、6(# 置換_環境)との類似度が、他のモデルより相対的に高い結果になっています。
「テーブルの上」と「部屋の中」は、若干似ていると判定されたようです。 これは間違いとも言えませんが、やや推論が入っているようにも見えます。
まとめ
今回の実験では、Azure OpenAIとVertex AIの埋め込みモデルを利用して、2つの文章の類似度を判定しました。
結果としては、モデルごとに大きく変わる結果は見られませんでした。
主観的には、text-embedding-3-largeが、他のモデルより安定した結果を出力しているように見えましたが、差はそれほど大きくありません。 どのモデルも総じて、「位置関係の違い」や「否定」については、類似度を高く判定してしまう傾向があるようです。
人間が類似度を判別する際に重視する要素と、各モデルが重視する要素は、想像以上に異なるのかもしれません。
また、実は、今回利用した埋め込みモデルは、文章の言語によって精度が大きく変わります(学習データ量の差と思われます)。 今回の実験では、日本語を対象としていますが、英語や他の言語を対象とする場合、結果が大きく変わることには注意が必要です。
英語での実験結果も、機会があれば報告したいと思います。
エモーションテックでは、顧客体験・従業員体験の改善をサポートし世の中の体験を変えるプロダクトを開発しております。 もし興味を持っていただけましたら、ぜひ採用ページからご応募をお願いいたします。