たねやつの木

Photographs, Keyboards and Programming

【性能比較】EmbeddingGemma vs multilingual-e5-large!最新埋め込みモデルを徹底検証

こんにちは、たねやつです。

Googleから新しいテキスト埋め込みモデル「EmbeddingGemma」がリリースされ、その軽量さと性能の高さで話題になっています。

基本的な使い方や単体での性能については、以下の記事で紹介しています。

今回は、この注目の「EmbeddingGemma」の実力をさらに深掘りするため、人気の多言語埋め込みモデルintfloat/multilingual-e5-largeと比較しながら、その性能や傾向の違いを探っていきます。

今回比較するモデル

  • google/embeddinggemma-300m: Googleが開発した新しいオープンなテキスト埋め込みモデル。300Mという軽量サイズと、100以上の言語に対応する多言語性が特徴です。
  • intfloat/multilingual-e5-large: 以前から多言語埋め込みモデルとして評価が高く、広く使われているデファクトスタンダード的なモデルです。

使い方と性能比較 (Sentence Transformers)

sentence-transformersライブラリを使い、両方のモデルで同じ文章セットに対する類似度を計算し、結果を比較します。

1. ライブラリのインストール

必要なライブラリをインストールします。

pip install -U sentence-transformers transformers torch

2. 比較用のコード

以下が、2つのモデルをロードし、それぞれの類似度計算結果を出力するコードです。

from sentence_transformers import SentenceTransformer
import torch

# デバイスの指定 (GPUが利用可能ならGPUを使う)
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")

# 比較したいモデルをロード
models = {
    "EmbeddingGemma": SentenceTransformer("google/embeddinggemma-300m", device=device),
    "multilingual-e5-large": SentenceTransformer("intfloat/multilingual-e5-large", device=device)
}

# 類似度を計算したい文章 (10個)
sentences = [
    "今日の東京は晴天です。",              # 0: 基準 (天気)
    "明日の天気も良いでしょう。",          # 1: 天気
    "傘を持って出かけたほうがよさそうだ。",  # 2: 天気
    "私はラーメンが大好きです。",          # 3: 食べ物
    "美味しい寿司を食べに行きたい。",      # 4: 食べ物
    "昨日のカレーは辛かった。",              # 5: 食べ物
    "我が家の猫はとてもかわいい。",          # 6: 動物
    "犬の散歩に行く時間だ。",              # 7: 動物
    "最新のスマートフォンが発売された。",  # 8: テクノロジー
    "このコンピュータは性能が高い。",      # 9: テクノロジー
]

# 各モデルで処理を実行
for model_name, model in models.items():
    print(f"\n--- 結果: {model_name} ---")
    
    # 文章をまとめてベクトル化
    embeddings = model.encode(sentences)
    
    # 基準となる文章 (0番目) と他の全ての文章との類似度を計算
    similarities = model.similarity(embeddings[0], embeddings)
    
    # 結果を整形して表示
    results = []
    for i, score in enumerate(similarities[0]):
        results.append((sentences[i], score.item()))

    # 類似度スコアで降順にソート
    results.sort(key=lambda x: x[1], reverse=True)

    print(f"基準: 「{sentences[0]}」")
    print("-" * 50)
    for sentence, score in results:
        print(f"類似度: {score:.4f}\t文章: {sentence}")

結果と考察

「天気」「食べ物」「動物」「テクノロジー」というカテゴリの文章を用意し、最初の「今日の東京は晴天です。」との類似度を各モデルで計算しました。

EmbeddingGemmaの結果

--- 結果: EmbeddingGemma ---
基準: 「今日の東京は晴天です。」
--------------------------------------------------
類似度: 1.0000  文章: 今日の東京は晴天です。
類似度: 0.8561  文章: 明日の天気も良いでしょう。
類似度: 0.8008  文章: 犬の散歩に行く時間だ。
類似度: 0.7883  文章: 傘を持って出かけたほうがよさそうだ。
類似度: 0.7856  文章: 美味しい寿司を食べに行きたい。
類似度: 0.7719  文章: このコンピュータは性能が高い。
類似度: 0.7527  文章: 我が家の猫はとてもかわいい。
類似度: 0.7496  文章: 昨日のカレーは辛かった。
類似度: 0.7351  文章: 私はラーメンが大好きです。
類似度: 0.6736  文章: 最新のスマートフォンが発売された。

multilingual-e5-largeの結果

--- 結果: multilingual-e5-large ---
基準: 「今日の東京は晴天です。」
--------------------------------------------------
類似度: 1.0000  文章: 今日の東京は晴天です。
類似度: 0.8480  文章: 明日の天気も良いでしょう。
類似度: 0.8289  文章: 傘を持って出かけたほうがよさそうだ。
類似度: 0.8248  文章: 美味しい寿司を食べに行きたい。
類似度: 0.8208  文章: 私はラーメンが大好きです。
類似度: 0.8166  文章: 犬の散歩に行く時間だ。
類似度: 0.8163  文章: 昨日のカレーは辛かった。
類似度: 0.8127  文章: 我が家の猫はとてもかわいい。
類似度: 0.7945  文章: このコンピュータは性能が高い。
類似度: 0.7907  文章: 最新のスマートフォンが発売された。

考察

実際の結果を見ると、両モデルの「個性」がより明確に現れており、非常に興味深いものとなりました。

  • スコアの分布と採点の傾向: multilingual-e5-largeは、関連性が低いと思われる文章にも軒並み0.8以上の高いスコアを付けており、全体的に「甘め」の採点をする傾向が見られます。一方、EmbeddingGemmaはスコアの幅が広く、関連性が低い文章には0.6台のスコアを付けるなど、より差がつきやすい「辛口」な採点をするようです。

  • 意味の捉え方の違い: 最も面白い違いは、EmbeddingGemmaが「犬の散歩に行く時間だ。」を3位(スコア0.8008)と高く評価した点です。これは、「晴天」という単語から「屋外での気持ちの良い活動」といった、より具体的な行動や文脈を連想している可能性を示唆しています。対してmultilingual-e5-largeは、「犬の散歩」を他の日常トピックと同程度に評価しており、より意味カテゴリの近さを重視しているように見えます。

  • 結論: multilingual-e5-largeは、意味カテゴリに基づいて安定した分類を行う「優等生」タイプと言えるでしょう。一方でEmbeddingGemmaは、時に意外な文脈的連想を見せてくれる「個性派」タイプかもしれません。RAGなどで厳密な関連度スコアに基づいて文書をフィルタリングしたい場合はEmbeddingGemmaの辛口評価が、一方で幅広い関連文書を緩やかに集めたい場合はmultilingual-e5-largeの甘口評価が、それぞれ有効に機能する可能性があります。

まとめ

今回は、新しい埋め込みモデルEmbeddingGemmaを、定番のmultilingual-e5-largeと比較検証しました。

結果として、EmbeddingGemmaは軽量ながら定番モデルに匹敵する性能を持ちつつ、類似度スコアの付け方に異なる個性があることがわかりました。どちらが優れているというわけではなく、アプリケーションの目的や特性に応じて使い分けるのが良さそうです。

特に、スコアの差がはっきり出やすいEmbeddingGemmaは、RAGにおける文書検索の精度向上などに貢献してくれる可能性を感じます。

参考・引用