作者:来自 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写代码
用英语执行搜索
让我们尝试用英语进行搜索,看看效果如何:
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写代码
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写代码
在这里,虽然查询看起来非常简单,但在底层,我们实际上是在所有语言的所有文档中搜索单词 "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写代码
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写代码
同样地,用韩语("고양이")对 "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写代码
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写代码
这是因为嵌入模型在共享语义空间中表示意义,即使查询语言与索引说明文字不同,也能检索到相关的图像。
使用混合搜索和重排序提升相关搜索结果
我们很高兴看到相关结果如预期般出现。但在现实场景中,比如电商或需要筛选出前 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写代码
这些结果都提到了猫,或某种颜色的形式:

所以让我们来改进它!让我们整合 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写代码收起代码块
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写代码
现在,通过这些顶级结果,我们的应用可以自信地回答小猫的颜色是黑色或带条纹的棕色。更有趣的是,我们的向量搜索实际上发现了原始数据集中英文说明的遗漏。即使参考的英文翻译漏掉了这个细节,它仍能找到带棕色条纹的猫。这就是向量搜索的强大之处。
结论
在这篇博客中,我们讲解了多语言嵌入模型的实用性,以及如何利用 Elasticsearch 集成模型生成嵌入,并通过混合搜索和重排序器有效提升相关性和准确性。你可以创建自己的 Cloud 集群,使用我们的开箱即用 E5 模型,在你选择的语言和数据集上尝试多语言语义搜索。