Skip to main content
Milvus 是一个数据库,用于存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的海量嵌入向量。
本笔记本展示了如何使用与 Milvus 向量数据库相关的功能。

设置

你需要使用 pip install -qU langchain-milvus 安装 langchain-milvus 才能使用此集成。

凭证

使用 Milvus 向量存储不需要任何凭证。

初始化

Milvus Lite

最简单的原型设计方法是使用 Milvus Lite,其中所有内容都存储在本地向量数据库文件中。只能使用 Flat 索引。

Milvus 服务器

如果你有大量数据(例如,超过一百万个向量),我们建议在 DockerKubernetes 上设置一个性能更高的 Milvus 服务器。 Milvus 服务器支持多种索引。利用这些不同的索引可以显著增强检索能力并加快检索过程,以满足您的特定需求。 作为示例,考虑 Milvus Standalone 的情况。要启动 Docker 容器,您可以运行以下命令:
这里我们创建一个 Milvus 数据库:
请注意下面 URI 的更改。实例初始化后,导航到 127.0.0.1:9091/webui 查看本地 Web UI。 以下是使用 Milvus 数据库服务创建向量存储实例的示例:
如果你想使用 Zilliz Cloud(Milvus 的完全托管云服务),请调整 uri 和 token,它们分别对应 Zilliz Cloud 中的公共端点API 密钥

使用 Milvus 集合对数据进行分区

你可以在同一个 Milvus 实例中将不相关的文档存储在不同的集合中。 以下是创建新集合的方法:
以下是检索该存储集合的方法:

管理向量存储

创建向量存储后,我们可以通过添加和删除不同的项目与其交互。

向向量存储添加项目

我们可以使用 add_documents 函数向向量存储添加项目。

从向量存储删除项目

查询向量存储

创建向量存储并添加相关文档后,您很可能希望在链或代理运行期间对其进行查询。

直接查询

相似性搜索

执行带有元数据过滤的简单相似性搜索可以按如下方式进行:

带分数的相似性搜索

您也可以带分数进行搜索:
有关使用 Milvus 向量存储时所有可用搜索选项的完整列表,您可以访问 API 参考

通过转换为检索器进行查询

您也可以将向量存储转换为检索器,以便在链中更轻松地使用。

混合搜索

最常见的混合搜索场景是稠密 + 稀疏混合搜索,其中使用语义向量相似性和精确关键词匹配来检索候选结果。这些方法的结果被合并、重新排序,并传递给 LLM 以生成最终答案。这种方法平衡了精确度和语义理解,使其在各种查询场景中都非常有效。

全文搜索

Milvus 2.5 起,通过 Sparse-BM25 方法原生支持全文搜索,该方法将 BM25 算法表示为稀疏向量。Milvus 接受原始文本作为输入,并自动将其转换为存储在指定字段中的稀疏向量,无需手动生成稀疏嵌入。 对于全文搜索,Milvus VectorStore 接受一个 builtin_function 参数。通过此参数,您可以传入 BM25BuiltInFunction 的实例。这与语义搜索不同,语义搜索通常将稠密嵌入传递给 VectorStore 以下是 Milvus 中混合搜索的简单示例,使用 OpenAI 稠密嵌入进行语义搜索,使用 BM25 进行全文搜索:
  • 当您使用 BM25BuiltInFunction 时,请注意全文搜索在 Milvus Standalone 和 Milvus Distributed 中可用,但在 Milvus Lite 中不可用,尽管它已列入未来包含的路线图。它也将在 Zilliz Cloud(完全托管的 Milvus)中很快可用。请通过 support@zilliz.com 联系我们以获取更多信息。
在上面的代码中,我们定义了一个 BM25BuiltInFunction 实例并将其传递给 Milvus 对象。BM25BuiltInFunction 是 Milvus 中 Function 的轻量级包装类。我们可以将其与 OpenAIEmbeddings 一起使用来初始化稠密 + 稀疏混合搜索 Milvus 向量存储实例。 BM25BuiltInFunction 不需要客户端传递语料库或训练数据,所有内容都在 Milvus 服务器端自动处理,因此用户无需关心任何词汇表和语料库。此外,用户还可以自定义分析器以在 BM25 中实现自定义文本处理。

对候选结果重新排序

在第一阶段检索之后,我们需要对候选结果进行重新排序以获得更好的结果。您可以参考重新排序了解更多信息。 以下是加权重新排序的示例:

用于检索增强生成的用法

有关如何将此向量存储用于检索增强生成(RAG)的指南,请参阅以下部分:

按用户检索

构建检索应用程序时,您通常需要考虑多个用户。这意味着您可能不仅为一个用户存储数据,而是为许多不同的用户存储数据,并且他们不应该能够看到彼此的数据。 Milvus 建议使用 partition_key 来实现多租户。以下是示例:
Partition key 功能在 Milvus Lite 中不可用,如果您想使用它,需要启动 Milvus 服务器,如上所述。
要使用分区键进行搜索,您应在搜索请求的布尔表达式中包含以下任一项: search_kwargs={"expr": '<partition_key> == "xxxx"'} search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'} 请将 <partition_key> 替换为指定为分区键的字段名称。 Milvus 根据指定的分区键切换到分区,根据分区键过滤实体,并在过滤后的实体中进行搜索。

API 参考

有关所有 Milvus VectorStore 功能和配置的详细文档,请访问 API 参考