Milvus 是一个用于存储、索引和管理由深度神经网络及其他机器学习(ML)模型生成的海量嵌入向量的数据库。本 notebook 展示了如何使用与 Milvus 向量数据库相关的功能。
设置
您需要通过pip install -qU langchain-milvus 安装 langchain-milvus 来使用本集成。
凭证
使用Milvus 向量存储无需任何凭证。
初始化
Milvus Lite
最简单的原型开发方式是使用 Milvus Lite,所有内容存储在本地向量数据库文件中。只能使用 Flat 索引。Milvus 服务器
如果您有大量数据(例如超过一百万个向量),建议在 Docker 或 Kubernetes 上搭建性能更强的 Milvus 服务器。 Milvus 服务器支持多种索引。利用这些不同的索引可以显著提升检索能力,并根据您的具体需求加快检索过程。 以 Milvus Standalone 为例,要启动 Docker 容器,可以运行以下命令:如果您想使用 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 实现多租户。以下是一个示例:分区键功能在 Milvus Lite 中不可用,如需使用,请按上述方法启动 Milvus 服务器。
search_kwargs={"expr": '<partition_key> == "xxxx"'}
search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}
请将 <partition_key> 替换为被指定为分区键的字段名。
Milvus 会根据指定的分区键切换分区,按分区键过滤实体,并在过滤后的实体中进行搜索。
API 参考
有关所有 __ModuleName__VectorStore 功能和配置的详细文档,请访问 API 参考:python.langchain.com/api_reference/milvus/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html通过 MCP 将这些文档连接到 Claude、VSCode 等工具,获取实时解答。

