利用混合搜索重排提高多语言嵌入模型的相关性
了解如何在 Elasticsearch 中使用 Cohere 的 reranker 和混合搜索提高 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 "相关的词:猫"、"小猫"、"猫科动物"、"gatto"(意大利语)、"mèo"(越南语)、고양이(韩语)、猫(汉语)等。因此,即使我的查询是以英语进行的,我们也可以搜索到所有其他语言的内容。例如,搜索 kitty lying 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"
}
. . .同样,用韩语("고양이")搜索关键词 "猫 "也会得到有意义的结果。令人惊叹的是,在这份索引中,我们甚至没有任何韩文文件!
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"
}
},这是因为嵌入模型在共享语义空间中表示意义,即使查询语言与索引标题不同,也能检索到相关图像。
利用混合搜索和重新排序增加相关搜索结果
我们很高兴相关结果如期出现。但是,在现实世界中,比如在电子商务或 RAG 应用程序中,需要缩小到前 5-10 个最适用的结果,我们可以使用 rerank 模型来优先处理最相关的结果。
在这里,用越南语查询 "猫是什么颜色的?"会得到很多结果,但前 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的多语言 rerank 模型来改进与我们的问题相对应的推理。
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 模型 在您选择的语言和数据集上尝试 多语言语义搜索 。




