今日は小ネタ。
OpenAI の text-embedding-ada-002(以下 ada-002) と text-embedding-3-small/large(以下 3-small) はテキストを埋め込みベクトルに変換するモデルの代表格で、3-small は ada-002 より精度が高いと言われますが、埋込モデルの精度が高いってどういうことだろう、という話。
埋め込みベクトル同士のコサイン類似度を計算することでテキストの意味の類似度がわかる、というのが埋め込みモデルの売り文句ですが、実際には意味だけではなく表現の近さもかなり反映されます。最も顕著な例は言語でしょう。別の言語だが同じ意味のテキストより、別の意味だが同じ言語のテキストのほうが、埋め込みベクトルの類似度が大きいことも珍しくありません。

こうした事情から、例えば RAG を使ったシステムを構築する場合、複数の言語が混じったテキストをデータベースとするのは気をつける必要があります。もし精度の低下が大きいなら、データベースを言語ごとに分けてベクトル検索をしたほうがいいかもしれません。
さて話を戻って、この意味より言語の一致が勝つ現象について、ada-002 と 3-small を比較してみましょう。具体的には、ベースとなるテキスト「彼は会議に出席した」に対して、いくつかの類似候補文とのコサイン類似度を計算してランク付けします。候補文の中には英訳 "He attended the meeting" と、「彼は仕事に出かけた」「私は総会に欠席した」などのちょっと違う文、「私はネコが好きだ」などの全く違う文を含めておきます。
まずは ada-002 の結果です。
| 1.00 | 彼は会議に出席した |
| 0.97 | 彼女は会議に出席した |
| 0.93 | 私は総会に出席した |
| 0.92 | 私は会議に欠席した |
| 0.91 | 彼は仕事に出かけた |
| 0.90 | 私は総会に欠席した |
| 0.87 | He attended the meeting |
| 0.81 | 彼はネコが好きだ |
| 0.77 | 私はネコが好きだ |
英訳 "He attended the meeting" より類似度が低いのは「ネコが好き」しか無く、明らかに意味より表現が勝っています。
一方 3-small ではこうなりました(3-large だと数値は少し変わりますが、同じランキングになります)。
| 1.00 | 彼は会議に出席した |
| 0.90 | 彼女は会議に出席した |
| 0.73 | 私は総会に出席した |
| 0.70 | 私は会議に欠席した |
| 0.66 | He attended the meeting |
| 0.61 | 私は総会に欠席した |
| 0.45 | 彼は仕事に出かけた |
| 0.25 | 彼はネコが好きだ |
| 0.11 | 私はネコが好きだ |
"He attended the meeting" のランキングが上って、「彼は仕事に出かけた」などには類似度で勝てるようになりました。特に「ネコが好きだ」の類似度は大きく落ちており、明らかに意味が異なるという直感が反映された数値になっています。
一方で、冒頭の例にも挙げた「私は会議に欠席した」はまだ同じ意味の英訳に勝っており、埋め込みベクトルの近さに意味だけではなく表現も強く反映されることは変わってはいませんし、この1つの例がすべての傾向を説明できるわけでもありません。ともあれ、この例は埋め込みモデルの精度向上をわかりやすく実感しやすいんじゃあないかと思います。
ちなみに冒頭の図は拙著『ChatGPTのしくみ~』に掲載したものです(書籍の図はデザイン会社さんがきれいにしてくれたものになってます)。執筆当初は ada-002 を使い、同じ意味の英訳に勝つテキストとして「彼は仕事に出かけた」を例示していました。ところが執筆途中で 3-small/large が出て、念の為類似度を計算してみたら逆転してて、慌てて他の例文を探す羽目になりました(苦笑)。