技术干货

使用Milvus和BGE-M3嵌入和查询多语言

2024-07-25

By Denis Kuria

使用Milvus和BGE-M3嵌入和查询多语言

**引言**

世界变得越来越互联,有效处理和分析不同语言的数据的能力变得比以往任何时候都更加重要。然而,许多流行的自然语言处理(NLP)模型主要针对英语,这在各种应用中留下了显著的语言能力差距。这种差距突显了在向量搜索引擎中特别迫切需要多语言解决方案的需求。

本指南将探讨使用Milvus和BGE-M3多语言嵌入模型将多语言嵌入向量空间的挑战、策略和方法。

**什么是多语言向量嵌入**

多语言向量嵌入是不同语言中单词或短语的数值表示,捕获它们在共享向量空间内的含义。例如,英语中的“cat”、西班牙语中的“gato”和法语中的“chat”由在高维空间中彼此接近的向量表示,表明它们的语义相似性。这种语义凝聚力对于向量搜索引擎非常有价值,使它们能够检索到与查询语言无关的相关结果。多语言嵌入通常存储在像Milvus这样的向量数据库中,便于无缝检索语义相关的信息。

Milvus是一个能够管理大规模数据集的开源向量数据库。它的一个突出特点是其处理多语言数据的能力。Milvus可以通过与各种嵌入模型(如生成多语言向量表示的BGE-M3)无缝集成,处理和索引不同语言的数据。此外,Milvus利用IVF、HNSW和PQ等先进的索引技术,确保即使在复杂的多语言数据集中也能实现快速和精确的搜索性能。凭借这些全面的能力,Milvus是部署弹性、可扩展和语言不可知搜索解决方案的首选。

**嵌入多语言的挑战**

将多语言嵌入向量空间提出了一套独特的挑战,我们必须解决这些挑战以确保准确和有意义的表示。一些主要障碍包括:

- **语言多样性**:每种语言都有独特的语法、写作风格和词汇。创建一个适用于所有语言的通用嵌入模型是困难的。例如,阿拉伯语或芬兰语等具有复杂形态系统的语言可能会使将单词视为单一单位的模型陷入困境。这些模型难以捕捉单词形成和屈折的复杂性。

- **数据可用性**:许多语言,特别是资源较少的语言,缺乏训练强大嵌入模型所需的高质量数据集。没有足够的数据,生成的表示可能不够准确,导致在现实世界的应用中表现不佳。

- **标记化和分割**:像中文和日语这样具有表意文字系统的的语言需要专门的标记化和分割技术,以便将文本分解为有意义的单元以进行嵌入。未能考虑到这些语言细微差别可能导致不准确或不完整的表示。

- **跨语言对齐**:实现最佳跨语言对齐,即将不同语言中语义相似的概念映射到附近的向量,仍然具有挑战性,尤其是对于具有截然不同的语言结构的远距离语言对,如英语和中文。

**多语言嵌入模型概述**

像BGE-M3这样的多语言嵌入模型显著推进了自然语言处理。这些模型旨在理解和处理多种语言,使它们在各种多语言环境中具有高度的通用性和适用性。它们通过将不同语言的单词或短语映射到共享嵌入空间中的向量来工作。这允许模型捕获跨语言的语义和句法相似性,实现跨语言知识转移。

例如,BGE-M3模型是一种多语言嵌入模型,已在机器翻译、跨语言信息检索和多语言情感分析等任务中显示出卓越的性能。它利用深度学习的力量学习语言不可知的表示,这意味着它可以不受语言限制地理解单词和短语的含义。

使用高级嵌入模型处理多语言有多种好处。首先,它们帮助克服自然语言处理任务中的语言障碍。这对训练机器学习模型资源有限的语言有利。其次,这些模型可以利用从一种语言学到的知识来提高其他语言的性能,这被称为迁移学习。这一特性对资源较少的语言特别有用,因为模型可以利用资源丰富的语言的资源来提高其性能。最后,这些模型使得开发真正全球性的AI系统成为可能,这些系统能够以用户的母语理解和与用户互动,从而提高AI系统的用户体验和可访问性。

**使用Milvus和BGE-M3编码和检索多语言**

Milvus集成了许多流行的嵌入模型,包括BGE-M3。通过这种集成,您可以轻松利用这些模型将您的多语言文档转换为嵌入,而无需向您的开发流程中添加额外组件。在获得嵌入后,您可以将它们存储在Milvus中以进行相似性检索。

以下是如何设置Milvus与BGE-M3以管理和搜索多语言数据的逐步指南。

**设置环境**

在编写代码以设置Milvus与BGE-M3之前,您必须在计算机上安装Milvus并安装必要的包。首先按照此指南在计算机上安装Milvus。然后,使用以下命令安装所需的Python包:

`pymilvus[model]`是PyMilvus中的一个组件,提供与嵌入模型一起工作的功能。它允许您使用各种模型从数据中生成嵌入。

在这种情况下,您将使用`pymilvus[model]`将BGE-M3与Milvus集成。该命令还将安装PyMilvus,即与Milvus交互的Python SDK。

接下来,导入必要的模块和类:

`MilvusClient`将帮助您与Milvus向量数据库交互。`DataType`类将帮助定义集合字段的数据类型。最后,`BGEM3EmbeddingFunction`类将帮助您加载和使用BGE-M3多语言句子嵌入模型。

在数据导入后,您就完成了环境的设置。

**实例化BGE-M3模型并连接到Milvus**

接下来,您需要实例化嵌入模型,即BGE-M3多语言模型。这是您将用于嵌入非英语语言的模型。

`

这个编码器可以为100多种语言的文本数据生成高质量的嵌入。

接下来,建立与Milvus实例的连接。您必须指定您的Milvus实例正在运行的统一资源标识符(URI)。Milvus的默认URI是`http://localhost:19530`。

将`uri`值替换为您的Milvus实例的配置。

**定义集合模式**

在与您的Milvus实例连接后,您需要定义您的集合的模式,该模式将存储非英语语言文本文档及其嵌入。您将使用`MilvusClient`来实现这一点。

上述代码使用`create_schema`定义了集合的模式。`auto_id=True`指定自动生成唯一文档ID。`enable_dynamic_field=True`允许稍后添加新字段。

以下是模式中每个字段的作用:

- doc_id:存储每个文档的唯一标识符(自动生成)。

- doc_text:存储文档的文本内容。

- doc_embedding:存储代表文档语义的1024维嵌入向量。

**创建集合**

在为您的集合创建模式后,下一步是创建集合。首先检查您打算创建的集合是否已存在于Milvus中。如果存在,请从数据库中删除它,并使用定义的模式和描述创建一个新的集合:

创建集合后,您现在需要创建一个索引,以加速集合内特定数据的搜索。

**创建索引**

想象一下一个包含数千个文档的集合。如果没有索引进行搜索,将涉及将查询嵌入与集合中每个文档的嵌入进行比较。这可能会非常慢。索引加速了查询过程。

继续在`doc_embedding`字段上创建索引,以启用高效的相似性搜索:

python

\# 创建索引参数

index\_params = \[

  {

  "field\_name": "doc\_embedding",

  "index\_type": "IVF\_FLAT",

  "metric\_type":

"L2",

  "params": {"nlist": 128}

  }

]

创建索引

client.create_index(collection_name, index_params)

print("New index created successfully.")

```

上述代码定义了索引参数。然后使用`create_index`方法根据定义的参数在`doc_embedding`字段上创建索引。IVF_FLAT索引类型与L2(欧几里得)度量适用于向量相似性搜索。

**将多语言文档插入Milvus**

在创建索引后,您已准备好插入您的多语言文档。以下是一些印地语的示例文档。BGE-M3多语言嵌入模型将对这些文档进行编码。

继续遍历文档并将它们插入Milvus。

每个文档的嵌入使用BGE-M3编码器生成并插入到Milvus集合中。由于您的多语言文档已嵌入并插入到Milvus中,您可以检索不同目的的语义相关数据。让我们实现一个简单的查询和相似性搜索系统。这个系统以后可以发展成一个检索增强生成(RAG)系统。

**查询和相似性搜索**

要执行相似性搜索,首先将集合加载到内存中:

然后,定义搜索参数,包括度量类型(L2为欧几里得距离)和nprobe值(越高越好,但速度较慢):

然后,提供一条印地语文本作为查询文本,因为您之前嵌入的数据是印地语,并使用BGE-M3编码器生成其嵌入:

最后,在Milvus中执行相似性搜索,根据查询嵌入检索最相似的文档:

`client.search`方法返回前`limit`个结果,按相似性得分排序。如果有结果,则打印第一个命中结果。

上述代码的结果是:

结果显示了查询“Milvus क्या है?”的第一个命中结果。这是“What is Milvus?”的印地语版本。上面的截图中的第一个命中结果是关于Milvus的文档,而不是Zilliz。截图显示我们可以嵌入一种非英语语言,并检索与非英语搜索查询语义相关的信息。您可以使用Google翻译将搜索查询和输出翻译成英语。

**其他多语言嵌入模型**

除了BGE-M3,市场上还有许多其他多语言嵌入模型。以下是BGE-M3与其他突出嵌入模型的比较:

**BGE-M3与其他模型的比较**

- BERT:它是最早和最广泛使用的变换器模型之一,为100多种语言提供嵌入。然而,更近期的模型在多语言基准测试中往往优于BERT。XLM-RoBERTa是预训练在100种语言数据上的RoBERTa的扩展,显示出强大的跨语言性能,但词汇量小于BGE-M3。

- LaBSE:这是Google的一种双编码器模型,将100多种语言嵌入到同一语义空间中。虽然在检索任务中表现出色,但在文本生成任务中可能不如BGE-M3。mT5是预训练在101种语言数据上的T5的多语言版本,可以生成文本,但计算要求更高。

- mAlBERT:它是一种高效的多语言模型,利用自监督预训练和跨语言对齐。尽管轻量级,但在某些基准测试中可能落后于BGE-M3。

**选择合适的模型**

模型的选择取决于优先考虑的因素,如语言覆盖需求、应用要求(例如,生成与理解)、计算限制以及在目标任务上的基准测试性能。

如果处理资源较少的语言,BGE-M3在200多种语言中提供强大的多语言能力。对于像翻译和摘要这样的文本生成任务,BGE-M3通常优于其他模型。然而,像LaBSE这样的双编码器模型在检索和排名任务中表现更好。

如果计算资源有限,像mAlBERT这样的轻量级模型可能是一个选择,尽管要牺牲性能。

**在生产环境中使用Zilliz Cloud**

到目前为止,我们已经讨论了在自托管状态下使用Milvus与BGE-M3多语言嵌入模型。但是,如果你不想自己托管Milvus并想使用一个完全托管的基于云的向量数据库呢?这就是Zilliz Cloud的用武之地。

**Zilliz Cloud**是一个非常适合生产环境的向量数据库,特别是处理多语言数据集时。它是Milvus的云版本。以下是它的优势和实际应用:

**在生产环境中使用Zilliz Cloud处理多语言数据集的优势:**

- 高效的向量索引和搜索:Zilliz Cloud使用先进的向量索引算法,使其在搜索大型多语言数据集时非常高效。这在需要速度和效率的生产环境中特别有用。

- 可扩展性:Zilliz Cloud旨在处理大规模数据。它可以轻松扩展以适应不断增长的数据集,使其成为生产环境的稳健选择。

- 支持多种语言:Zilliz Cloud还支持多种语言,使其成为处理多语言数据集的优秀选择。它可以处理和索引各种语言的数据,允许在多语言环境中高效搜索和检索。

**Zilliz在多语言环境中表现出色的实际应用:**

- 电子商务推荐:在全球电子商务平台上,服务使用不同语言的客户,Zilliz可以提供准确的产品推荐。通过处理和索引多种语言的客户行为数据,Zilliz可以帮助为每个用户生成个性化推荐,无论语言如何。

- 多语言客户支持:拥有全球客户群的公司通常必须提供多种语言的客户支持。Zilliz可以驱动智能聊天机器人,能够理解和响应多种语言的客户查询,提高客户支持的效率和效果。

- 全球内容发现:Zilliz可以改善全球内容平台(如新闻聚合器或社交媒体网站)的内容发现。索引多种语言的内容可以帮助用户发现他们首选语言的相关内容。

这些只是Zilliz如何在生产环境中处理多语言数据集的一些例子。更多信息,请参阅此向量数据库用例页面。

**结论**

在本指南中,您已经获得了有关多语言向量嵌入及其在向量相似性搜索背景下的强大应用的宝贵见解。

您现在理解了在现代NLP应用中支持多语言的重要性以及将多样化的语言数据嵌入向量空间的挑战。有了这些知识,您可以探索和尝试Milvus和多语言嵌入模型,为超越语言界限的语言不可知应用解锁新的可能性。

**更多资源**

完整代码及详细注释:https://www.kaggle.com/code/deniskuria/notebook1e4c44ebed

Milvus文档:https://milvus.io/docs/

使用BGE-M3嵌入文档:BGE M3 Milvus文档

Zilliz Cloud:https://zilliz.com/cloud

Milvus社区:https://github.com/milvus-io/milvus/discussions

探索BGE-M3:https://zilliz.com/learn/bge-m3-and-splade-two-machine-learning-models-for-generating-sparse-embeddings

  • Denis Kuria

    Denis Kuria

    Freelance Technical Writer

    准备好开始了吗?

    立刻创建 Zilliz Cloud 集群,存储和检索您的向量。

    免费试用 Zilliz Cloud