ブログ

ハイブリッド検索再ランキングによる多言語埋め込みモデルの関連性の向上

Cohere の再ランカーと Elasticsearch のハイブリッド検索を使用して、E5 多言語埋め込みモデルの検索結果の関連性を向上させる方法を学びます。

はじめに

このシリーズの最後の部分では、Elastic の事前トレーニング済み E5 モデル (および Hugging Face の他の多言語テキスト埋め込みモデル) のデプロイについて説明し、Elasticsearch と Kibana を使用してテキスト データから高密度のベクトル埋め込みを生成する方法について詳しく説明しました。このブログでは、これらの埋め込みの結果を調べ、多言語モデルを活用することの大きな利点を強調します。

インデックスcoco_multilingualが作成されたので、検索を実行すると、参照用の「en」フィールドを含む複数の言語のドキュメントが表示されます。

# GET coco_multilingual/_search
    {
       "_index": "coco_multilingual",
       "_id": "WAiXQJYBgf6odR9bLohZ",
       "_score": 1,
       "_source": {
         "description": "Ein Parkmeßgerät auf einer Straße mit Autos",
         "en": "A row of parked cars sitting next to parking meters.",
         "language": "de",
         "vector_description": {...}
       }
     },
     . . .

英語で検索する

英語で検索を実行して、どれくらいうまくいくか確認してみましょう。

GET coco_multi/_search
{
"size": 10,
"_source": [
  "description", "language", "en"
],
"knn": {
  "field": "vector_description.predicted_value",
  "k": 10,
  "num_candidates": 100,
  "query_vector_builder": {
    "text_embedding": {
      "model_id": ".multilingual-e5-small_linux-x86_64_search",
      "model_text": "query: kitty"
    }
  }
}
}
{
       "_index": "coco_multi",
       "_id": "JQiXQJYBgf6odR9b6Yz0",
       "_score": 0.9334303,
       "_source": {
         "description": "Eine Katze, die in einem kleinen, gepackten Koffer sitzt.",
         "en": "A brown and white cat is in a suitcase.",
         "language": "de"
       }
     },
      {
       "_index": "coco_multi",
       "_id": "3AiXQJYBgf6odR9bFod6",
       "_score": 0.9281012,
       "_source": {
         "description": "Una bambina che tiene un gattino vicino a una recinzione blu.",
         "en": "A little girl holding a kitten next to a blue fence.",
         "language": "it"
       }
     },
     . . .

ここでは、クエリは一見単純に見えますが、内部的にはすべての言語のすべてのドキュメントにわたって「kitty」という単語の数値埋め込みを検索しています。また、ベクトル検索を実行しているため、「kitty」に関連する可能性のあるすべての単語を意味的に検索できます。「cat」、「kitten」、「feline」、「gatto」(イタリア語)、「mèo」(ベトナム語)、고양이(韓国語)、猫(中国語)などです。その結果、クエリが英語であっても、他のすべての言語でコンテンツを検索できるようになります。たとえば、「a kitty l ying on somethingを検索すると、イタリア語、オランダ語、ベトナム語のドキュメントも返されます。効率について話しましょう!

他の言語でコンテンツを検索する

GET coco_multi/_search
{  
 "size": 100,
 "_source": [
   "description", "language", "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 50,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: kitty lying on something"
     }
   }
 }
}
{
 "description": "A black kitten lays on her side beside remote controls.",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "en"
},
{
 "description": "un gattino sdraiato su un letto accanto ad alcuni telefoni ",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "it"
},
{
 "description": "eine Katze legt sich auf ein ausgestopftes Tier",
 "en": "a cat lays down on a stuffed animal",
 "language": "de"
},
{
 "description": "Một chú mèo con màu đen nằm nghiêng bên cạnh điều khiển từ xa.",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "vi"
}
. . .

同様に、韓国語で「cat」(「고양이」)のキーワード検索を実行しても、意味のある結果が返されます。驚くべきことに、このインデックスには韓国語の文書がまったくありません。

GET coco_multi/_search
{
 "size": 100,
 "_source": [
   "description", "language", "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 50,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: 고양이"
     }
   }
 }
}
 {
       {
         "description": "eine Katze legt sich auf ein ausgestopftes Tier",
         "en": "a cat lays down on a stuffed animal",
         "language": "de"
       }
     },
     {
       {
         "description": "Một con chó và con mèo đang ngủ với nhau trên một chiếc ghế dài màu cam.",
         "en": "A dog and cat lying  together on an orange couch. ",
         "language": "vi"
       }
     },

これが機能するのは、埋め込みモデルが意味を共有セマンティック空間で表現し、インデックス付けされたキャプションとは異なる言語でのクエリでも関連する画像を取得できるためです。

ハイブリッド検索と再ランキングによる関連性の高い検索結果の向上

関連する結果が期待どおりに表示されたことを嬉しく思います。しかし、現実の世界では、たとえば、最も関連性の高い上位 5 ~ 10 件の結果に絞り込む必要がある e コマースや RAG アプリケーションでは、再ランク付けモデルを使用して最も関連性の高い結果を優先することができます。

ここで、ベトナム語で「猫の色は何色ですか?」と尋ねるクエリを実行すると、多くの結果が表示されますが、上位 1 つまたは 2 つが最も関連性が高いとは限りません。

GET coco_multi/_search
{
 "size": 20,
 "_source": [
   "description",
   "language",
   "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 20,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: con mèo màu gì?"
     }
   }
 }
}

結果にはすべて「猫」または何らかの形の色が言及されています。

では、それを改善しましょう!Cohereの多言語再ランク付けモデルを統合して、質問に対応する推論を改善しましょう。

PUT _inference/rerank/cohere_rerank
{
 "service": "cohere",
 "service_settings": {
   "api_key": "your_api_key",
   "model_id": "rerank-v3.5"
 },
 "task_settings": {
   "top_n": 10,
   "return_documents": true
 }
}


GET coco_multi/_search
{
"size": 10,
"_source": [
  "description",
  "language",
  "en"
],
"retriever": {
  "text_similarity_reranker": {
    "retriever": {
      "rrf": {
        "retrievers": [
          {
            "knn": {
              "field": "vector_description.predicted_value",
              "k": 50,
              "num_candidates": 100,
              "query_vector_builder": {
                "text_embedding": {
                  "model_id": ".multilingual-e5-small_linux-x86_64_search",
                  "model_text": "query: con mèo màu gì?" // English: What color is the cat?
                }
              }
            }
          }
        ],
        "rank_window_size": 100,
        "rank_constant": 0
      }
    },
    "field": "description",
    "inference_id": "cohere_rerank",
    "inference_text": "con mèo màu gì?"
  }
}
}
 {
       "_index": "coco_multi",
       "_id": "rQiYQJYBgf6odR9bBYyH",
       "_score": 1.5501487,
       "_source": {
         "description": "Hai cái điện thoại được đặt trên một cái chăn cạnh một con mèo con màu đen.",
         "en": "A black kitten lays on her side beside remote controls.",
         "language": "vi"
       }
     },
     {
       "_index": "coco_multi",
       "_id": "swiXQJYBgf6odR9b04uf",
       "_score": 1.5427427,
       "_source": {
         "description": "Một con mèo sọc nâu nhìn vào máy quay.", // Real translation: A brown striped cat looks at the camera 
         "en": "This cat is sitting on a porch near a tire.",
         "language": "vi"
       }
     },

これで、上位の結果により、アプリケーションは子猫の色が黒か茶色で縞模様であると自信を持って答えることができます。ここでさらに興味深いのは、ベクトル検索によって、元のデータセットの英語のキャプションの欠落が実際に検出されたことです。参照の英語翻訳ではその詳細が抜けていたにもかかわらず、茶色の縞模様の猫を見つけることができます。これがベクトル検索の威力です。

まとめ

このブログでは、多言語埋め込みモデルの有用性と、Elasticsearch を活用してモデルを統合し埋め込みを生成する方法、ハイブリッド検索と再ランク付けによって関連性と精度を効果的に向上させる方法について説明しました。独自のクラウド クラスターを作成し、選択した言語とデータセットですぐに使用できる E5 モデルを使用して、多言語セマンティック検索を試すことができます。

関連記事

LINQ to Elasticsearch ES|QL:C#を記述してElasticsearchをクエリ

Florian Bernd

Elasticsearch の NLP とベクトル検索によるチャットボット機能の強化

Priscilla Parodi

OpenSearchとElasticsearchの違い:ベクトル検索のパフォーマンス比較

Ugo Sangiorgi

AI盗作:Elasticsearchによる盗作検出

Priscilla Parodi

高度なRAGテクニックパート2:クエリとテスト

Han Xiang Choong

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう