探索Azure Cosmos DB NoSQL中的向量搜索功能
Azure Cosmos DB是一个可扩展的多模型数据库服务,支持多种数据模型和API。它不仅提供了强大的性能和可扩展性,还集成了向量数据库功能。本文将带你探索如何在Azure Cosmos DB NoSQL中使用向量索引和向量搜索,帮助开发者在高维向量数据中找到最接近的匹配。
引言
近年来,向量搜索技术因其在推荐系统、图像识别和自然语言处理等领域的应用而备受关注。Azure Cosmos DB for NoSQL现已支持向量索引和搜索,开发者可以将高维向量直接存储在文档中,并利用向量索引进行高效的向量搜索。
本文旨在帮助开发者理解如何在Azure Cosmos DB中实现向量搜索,包括如何存储向量、创建索引以及执行向量搜索查询。
主要内容
1. 存储和索引向量
Azure Cosmos DB允许开发者将向量作为文档的一部分进行存储。为了实现高效的搜索,需要为这些向量创建索引。
indexing_policy = {
"indexingMode": "consistent",
"includedPaths": [{"path": "/*"}],
"excludedPaths": [{"path": '/"_etag"/?'}],
"vectorIndexes": [{"path": "/embedding", "type": "quantizedFlat"}],
}
vector_embedding_policy = {
"vectorEmbeddings": [
{
"path": "/embedding",
"dataType": "float32",
"distanceFunction": "cosine",
"dimensions": 1536,
}
]
}
2. 插入数据
通过Langchain工具加载PDF并将其转换为文档。然后,可以将这些文档连同其嵌入向量一起插入到Azure Cosmos DB中。
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = PyPDFLoader("https://arxiv.org/pdf/2303.08774.pdf")
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
docs = text_splitter.split_documents(data)
3. 执行向量搜索
利用计算的嵌入向量与存储的向量进行相似性搜索。
query = "What were the compute requirements for training GPT 4"
results = vector_search.similarity_search(query)
for result in results:
print(result)
代码示例
完整的代码示例展示了如何在Azure Cosmos DB中进行向量搜索:
from azure.cosmos import CosmosClient, PartitionKey
from langchain_community.vectorstores.azure_cosmos_db_no_sql import AzureCosmosDBNoSqlVectorSearch
from langchain_openai import AzureOpenAIEmbeddings
cosmos_client = CosmosClient("AZURE_COSMOS_DB_ENDPOINT", "AZURE_COSMOS_DB_KEY")
database_name = "langchain_python_db"
container_name = "langchain_python_container"
partition_key = PartitionKey(path="/id")
openai_embeddings = AzureOpenAIEmbeddings(
azure_deployment="text-embedding-ada-002",
api_version="2023-05-15",
azure_endpoint="YOUR_ENDPOINT",
openai_api_key="YOUR_KEY",
)
vector_search = AzureCosmosDBNoSqlVectorSearch.from_documents(
documents=docs,
embedding=openai_embeddings,
cosmos_client=cosmos_client,
database_name=database_name,
container_name=container_name,
vector_embedding_policy=vector_embedding_policy,
indexing_policy=indexing_policy,
cosmos_container_properties={"partition_key": partition_key},
)
query = "What were the compute requirements for training GPT 4"
results = vector_search.similarity_search(query)
for result in results:
print(result)
常见问题和解决方案
-
网络限制:某些地区可能面临访问Azure API的限制。建议开发者考虑使用API代理服务来提高访问的稳定性。
-
性能优化:确保向量的维度和数据类型与索引策略一致,以获得最佳的查询性能。
总结和进一步学习资源
向量搜索是Azure Cosmos DB的一项增强功能,使其在处理高维数据时更具竞争力。开发者可以从微软官方文档中获取更多关于Cosmos DB和向量搜索的技术细节。
参考资料
- Azure Cosmos DB官方文档
- Langchain开发者指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---