探索Milvus:一个强大的向量数据库用于大规模机器学习数据管理

83 阅读3分钟

引言

在深度学习和机器学习中,向量嵌入是将高维数据表示成低维空间的关键技术。然而,管理和检索大量向量数据可能会成为一项挑战。Milvus作为一个强大的向量数据库,专门用于存储、索引和管理大量嵌入向量,可以大大简化这一过程。本文将详细介绍如何使用Milvus,并提供实用的代码示例来展示其功能与优势。

主要内容

1. 环境设置

首先,需要安装langchain-milvus包来进行集成:

%pip install -qU langchain_milvus

最新版本的pymilvus附带了一个本地向量数据库Milvus Lite,适合原型设计。如果您有超过一百万个文档的规模数据,建议在Docker或Kubernetes上设置一个更高效的Milvus服务器。

2. 初始化

无论是使用OpenAI、HuggingFace还是Fake Embedding,都可以通过如下代码进行初始化:

import os
import getpass
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.embeddings import FakeEmbeddings

# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_KEY"] = getpass.getpass()  
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")  # OpenAI嵌入模型

# HuggingFace嵌入模型
# embeddings = HuggingFaceEmbeddings(model="sentence-transformers/all-mpnet-base-v2")

# Fake嵌入模型
# embeddings = FakeEmbeddings(size=4096)

from langchain_milvus import Milvus

URI = "./milvus_example.db"  # 本地文件存储
vector_store = Milvus(embedding_function=embeddings, connection_args={"uri": URI})

3. 创建和管理向量集合

可以在同一Milvus实例中维护不同的文档集合以保持上下文。以下是如何创建一个新的集合:

from langchain_core.documents import Document

vector_store_saved = Milvus.from_documents(
    [Document(page_content="foo!")],
    embeddings,
    collection_name="langchain_example",
    connection_args={"uri": URI},
)

4. 添加和删除项

向向量集合中添加项可以通过add_documents函数实现:

from uuid import uuid4
from langchain_core.documents import Document

documents = [
    Document(page_content="I had chocolate chip pancakes and scrambled eggs for breakfast.", metadata={"source": "tweet"}),
    Document(page_content="The weather forecast for tomorrow is cloudy and overcast.", metadata={"source": "news"}),
    # 其他文档...
]

uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)

删除项可以通过delete函数实现:

vector_store.delete(ids=[uuids[-1]])

5. 查询向量集合

可以通过以下方式进行简单的相似性搜索:

results = vector_store.similarity_search("LangChain makes working with LLMs easy", k=2, filter={"source": "tweet"})
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

6. 用户分区检索

使用partition_key来实现多租户管理:

docs = [
    Document(page_content="I worked at Kensho", metadata={"namespace": "harrison"}),
    Document(page_content="I worked at Facebook", metadata={"namespace": "ankush"}),
]

vectorstore = Milvus.from_documents(
    docs,
    embeddings,
    connection_args={"uri": URI},
    drop_old=True,
    partition_key_field="namespace",
)

results = vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke("where did I work?")
print(results)

常见问题和解决方案

1. 数据规模过大

如果数据规模过大,可以考虑在Docker或Kubernetes上设置Milvus服务器以提高性能和扩展性。

2. 网络访问问题

由于某些地区的网络限制,可能需要使用API代理服务来提高访问稳定性。

总结和进一步学习资源

Milvus提供了强大的向量数据管理功能,适用于大规模机器学习和深度学习应用。通过本文的介绍和代码示例,希望能帮助你更好地理解和使用Milvus。

参考资料

  1. Milvus官方文档
  2. LangChain API参考
  3. Docker 安装指南
  4. Kubernetes 安装指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---