通过混合搜索重排序提升多语言嵌入模型的相关性

作者:来自 Elastic Quynh Nguyen

学习如何使用 Cohere 的重排序器和 Elasticsearch 中的混合搜索来提升 E5 多语言嵌入模型搜索结果的相关性。

从向量搜索到强大的 REST API,Elasticsearch 为开发者提供了最全面的搜索工具包。前往 GitHub 上的示例笔记本尝试新功能。你也可以立即开始免费试用或在本地运行 Elasticsearch。


介绍

在本系列的上一部分中,我们介绍了如何部署 Elastic 的预训练 E5 模型(以及来自 Hugging Face 的其他多语言文本嵌入模型),并深入讲解了如何使用 Elasticsearch 和 Kibana 从文本数据生成密集向量嵌入。在这篇博客中,我们将分析这些嵌入的结果,并重点展示使用多语言模型的显著优势。

现在我们已经有了索引 coco_multilingual,执行搜索后将会得到多种语言的文档,其中 "en" 字段供我们参考:

bash 复制代码
`

1.  # GET coco_multilingual/_search
2.      {
3.         "_index": "coco_multilingual",
4.         "_id": "WAiXQJYBgf6odR9bLohZ",
5.         "_score": 1,
6.         "_source": {
7.           "description": "Ein Parkmeßgerät auf einer Straße mit Autos",
8.           "en": "A row of parked cars sitting next to parking meters.",
9.           "language": "de",
10.           "vector_description": {...}
11.         }
12.       },
13.       . . .

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

用英语执行搜索

让我们尝试用英语进行搜索,看看效果如何:

bash 复制代码
`

1.  GET coco_multi/_search
2.  {
3.  "size": 10,
4.  "_source": [
5.    "description", "language", "en"
6.  ],
7.  "knn": {
8.    "field": "vector_description.predicted_value",
9.    "k": 10,
10.    "num_candidates": 100,
11.    "query_vector_builder": {
12.      "text_embedding": {
13.        "model_id": ".multilingual-e5-small_linux-x86_64_search",
14.        "model_text": "query: kitty"
15.      }
16.    }
17.  }
18.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)
bash 复制代码
`

1.  {
2.         "_index": "coco_multi",
3.         "_id": "JQiXQJYBgf6odR9b6Yz0",
4.         "_score": 0.9334303,
5.         "_source": {
6.           "description": "Eine Katze, die in einem kleinen, gepackten Koffer sitzt.",
7.           "en": "A brown and white cat is in a suitcase.",
8.           "language": "de"
9.         }
10.       },
11.        {
12.         "_index": "coco_multi",
13.         "_id": "3AiXQJYBgf6odR9bFod6",
14.         "_score": 0.9281012,
15.         "_source": {
16.           "description": "Una bambina che tiene un gattino vicino a una recinzione blu.",
17.           "en": "A little girl holding a kitten next to a blue fence.",
18.           "language": "it"
19.         }
20.       },
21.       . . .

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

在这里,虽然查询看起来非常简单,但在底层,我们实际上是在所有语言的所有文档中搜索单词 "kitty" 的数值嵌入。由于我们执行的是向量搜索,因此可以语义化地搜索与 "kitty" 相关的所有词语,如 "cat"、"kitten"、"feline"、"gatto"(意大利语)、"mèo"(越南语)、고양이(韩语)、猫(中文)等。这样一来,即使我的查询是英文,我们也可以搜索其他语言的内容。例如,搜索一只躺着的 kitty 时,返回的文档中也可能包含意大利语、荷兰语或越南语内容。高效至极!

搜索其他语言的内容

bash 复制代码
`

1.  GET coco_multi/_search
2.  {  
3.   "size": 100,
4.   "_source": [
5.     "description", "language", "en"
6.   ],
7.   "knn": {
8.     "field": "vector_description.predicted_value",
9.     "k": 50,
10.     "num_candidates": 1000,
11.     "query_vector_builder": {
12.       "text_embedding": {
13.         "model_id": ".multilingual-e5-small_linux-x86_64_search",
14.         "model_text": "query: kitty lying on something"
15.       }
16.     }
17.   }
18.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)
bash 复制代码
`

1.  {
2.   "description": "A black kitten lays on her side beside remote controls.",
3.   "en": "A black kitten lays on her side beside remote controls.",
4.   "language": "en"
5.  },
6.  {
7.   "description": "un gattino sdraiato su un letto accanto ad alcuni telefoni ",
8.   "en": "A black kitten lays on her side beside remote controls.",
9.   "language": "it"
10.  },
11.  {
12.   "description": "eine Katze legt sich auf ein ausgestopftes Tier",
13.   "en": "a cat lays down on a stuffed animal",
14.   "language": "de"
15.  },
16.  {
17.   "description": "Một chú mèo con màu đen nằm nghiêng bên cạnh điều khiển từ xa.",
18.   "en": "A black kitten lays on her side beside remote controls.",
19.   "language": "vi"
20.  }
21.  . . .

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

同样地,用韩语("고양이")对 "cat" 进行关键词搜索也会得到有意义的结果。令人惊奇的是,这个索引里甚至没有任何韩语文档!

bash 复制代码
`

1.  GET coco_multi/_search
2.  {
3.   "size": 100,
4.   "_source": [
5.     "description", "language", "en"
6.   ],
7.   "knn": {
8.     "field": "vector_description.predicted_value",
9.     "k": 50,
10.     "num_candidates": 1000,
11.     "query_vector_builder": {
12.       "text_embedding": {
13.         "model_id": ".multilingual-e5-small_linux-x86_64_search",
14.         "model_text": "query: 고양이"
15.       }
16.     }
17.   }
18.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)
bash 复制代码
 `1.   {
2.         {
3.           "description": "eine Katze legt sich auf ein ausgestopftes Tier",
4.           "en": "a cat lays down on a stuffed animal",
5.           "language": "de"
6.         }
7.       },
8.       {
9.         {
10.           "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.",
11.           "en": "A dog and cat lying  together on an orange couch. ",
12.           "language": "vi"
13.         }
14.       },`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这是因为嵌入模型在共享语义空间中表示意义,即使查询语言与索引说明文字不同,也能检索到相关的图像。

使用混合搜索和重排序提升相关搜索结果

我们很高兴看到相关结果如预期般出现。但在现实场景中,比如电商或需要筛选出前 5 到 10 个最相关结果的 RAG 应用中,我们可以使用重排序模型来优先显示最相关的结果。

在这里,用越南语查询 "what color is the cat? - 猫是什么颜色?" 时会返回许多结果,但前一两个可能并不是最相关的。

bash 复制代码
`

1.  GET coco_multi/_search
2.  {
3.   "size": 20,
4.   "_source": [
5.     "description",
6.     "language",
7.     "en"
8.   ],
9.   "knn": {
10.     "field": "vector_description.predicted_value",
11.     "k": 20,
12.     "num_candidates": 1000,
13.     "query_vector_builder": {
14.       "text_embedding": {
15.         "model_id": ".multilingual-e5-small_linux-x86_64_search",
16.         "model_text": "query: con mèo màu gì?"
17.       }
18.     }
19.   }
20.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这些结果都提到了猫,或某种颜色的形式:

所以让我们来改进它!让我们整合 Cohere 的多语言重排序模型,以提升与我们问题对应的推理能力。

bash 复制代码
`

1.  PUT _inference/rerank/cohere_rerank
2.  {
3.   "service": "cohere",
4.   "service_settings": {
5.     "api_key": "your_api_key",
6.     "model_id": "rerank-v3.5"
7.   },
8.   "task_settings": {
9.     "top_n": 10,
10.     "return_documents": true
11.   }
12.  }

15.  GET coco_multi/_search
16.  {
17.  "size": 10,
18.  "_source": [
19.    "description",
20.    "language",
21.    "en"
22.  ],
23.  "retriever": {
24.    "text_similarity_reranker": {
25.      "retriever": {
26.        "rrf": {
27.          "retrievers": [
28.            {
29.              "knn": {
30.                "field": "vector_description.predicted_value",
31.                "k": 50,
32.                "num_candidates": 100,
33.                "query_vector_builder": {
34.                  "text_embedding": {
35.                    "model_id": ".multilingual-e5-small_linux-x86_64_search",
36.                    "model_text": "query: con mèo màu gì?" // English: What color is the cat?
37.                  }
38.                }
39.              }
40.            }
41.          ],
42.          "rank_window_size": 100,
43.          "rank_constant": 0
44.        }
45.      },
46.      "field": "description",
47.      "inference_id": "cohere_rerank",
48.      "inference_text": "con mèo màu gì?"
49.    }
50.  }
51.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)收起代码块![](https://csdnimg.cn/release/blogv2/dist/pc/img/arrowup-line-top-White.png)
json 复制代码
 `1.   {
2.         "_index": "coco_multi",
3.         "_id": "rQiYQJYBgf6odR9bBYyH",
4.         "_score": 1.5501487,
5.         "_source": {
6.           "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.",
7.           "en": "A black kitten lays on her side beside remote controls.",
8.           "language": "vi"
9.         }
10.       },
11.       {
12.         "_index": "coco_multi",
13.         "_id": "swiXQJYBgf6odR9b04uf",
14.         "_score": 1.5427427,
15.         "_source": {
16.           "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 
17.           "en": "This cat is sitting on a porch near a tire.",
18.           "language": "vi"
19.         }
20.       },`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

现在,通过这些顶级结果,我们的应用可以自信地回答小猫的颜色是黑色或带条纹的棕色。更有趣的是,我们的向量搜索实际上发现了原始数据集中英文说明的遗漏。即使参考的英文翻译漏掉了这个细节,它仍能找到带棕色条纹的猫。这就是向量搜索的强大之处。

结论

在这篇博客中,我们讲解了多语言嵌入模型的实用性,以及如何利用 Elasticsearch 集成模型生成嵌入,并通过混合搜索和重排序器有效提升相关性和准确性。你可以创建自己的 Cloud 集群,使用我们的开箱即用 E5 模型,在你选择的语言和数据集上尝试多语言语义搜索。

原文:www.elastic.co/search-labs...

相关推荐
老纪的技术唠嗑局11 小时前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
Elasticsearch11 小时前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖13 小时前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦13 小时前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅14 小时前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水14 小时前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑14 小时前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎
A__tao1 天前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
A__tao1 天前
Elasticsearch Mapping 一键生成 Proto 文件(支持嵌套 + 注释过滤)
大数据·elasticsearch·jenkins
Devin~Y1 天前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag