引言
在深度学习和机器学习中,向量嵌入是将高维数据表示成低维空间的关键技术。然而,管理和检索大量向量数据可能会成为一项挑战。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。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---