作者:来自 Elastic Quynh Nguyen

学习如何使用 Cohere 的重排序器和 Elasticsearch 中的混合搜索来提升 E5 多语言嵌入模型搜索结果的相关性。
从向量搜索到强大的 REST API,Elasticsearch 为开发者提供了最全面的搜索工具包。前往 GitHub 上的示例笔记本尝试新功能。你也可以立即开始免费试用或在本地运行 Elasticsearch。
介绍
在本系列的上一部分中,我们介绍了如何部署 Elastic 的预训练 E5 模型(以及来自 Hugging Face 的其他多语言文本嵌入模型),并深入讲解了如何使用 Elasticsearch 和 Kibana 从文本数据生成密集向量嵌入。在这篇博客中,我们将分析这些嵌入的结果,并重点展示使用多语言模型的显著优势。
现在我们已经有了索引 coco_multilingual(可参考文章 "在 Elasticsearch 中部署多语言嵌入模型" 按照 coco 数据集),执行搜索后将会得到多种语言的文档,其中 "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"(越南语)、고양이(韩语)、猫(中文)等。这样一来,即使我的查询是英文,我们也可以搜索其他语言的内容。例如,搜索一只躺着的 kitty 时,返回的文档中也可能包含意大利语、荷兰语或越南语内容。高效至极!
搜索其他语言的内容
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 个最相关结果的 RAG 应用中,我们可以使用重排序模型来优先显示最相关的结果。
在这里,用越南语查询 "what color is the cat? - 猫是什么颜色?" 时会返回许多结果,但前一两个可能并不是最相关的。
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 集成模型生成嵌入,并通过混合搜索和重排序器有效提升相关性和准确性。你可以创建自己的 Cloud 集群,使用我们的开箱即用 E5 模型,在你选择的语言和数据集上尝试多语言语义搜索。
原文:https://www.elastic.co/search-labs/blog/multilingual-embedding-model-hybrid-search-reranking