获取最新的快照版本,请使用 Spring AI 1.1.3spring-doc.cadn.net.cn

Azure Cosmos DB

本节将引导您完成配置CosmosDBVectorStore以存储文档嵌入并执行相似性搜索的过程。spring-doc.cadn.net.cn

什么是Azure Cosmos DB?

Azure Cosmos DB 是微软的全球分布式云原生数据库服务,专为关键任务应用程序设计。 它提供了高可用性、低延迟,并能够横向扩展以满足现代应用程序需求。 它是从头开始构建的,核心特性包括全球分布、细粒度多租户和横向可扩展性。 它是Azure中的一个基础服务,被微软大多数全球规模的关键任务应用程序使用,包括Teams、Skype、Xbox Live、Office 365、Bing、Azure Active Directory、Azure门户、Microsoft Store等众多服务。 同时,它也被成千上万的外部客户所使用,例如OpenAI的ChatGPT及其他需要弹性扩展、开箱即用的全球分布、以及全球范围内低延迟和高可用性的关键任务AI应用。spring-doc.cadn.net.cn

什么是DiskANN?

DiskANN(基于磁盘的近似最近邻搜索)是Azure Cosmos DB中用于增强向量搜索性能的一项创新技术。 它通过为Cosmos DB中存储的嵌入式向量建立索引,实现了高维数据上的高效且可扩展的相似性搜索。spring-doc.cadn.net.cn

DiskANN提供了以下优势:spring-doc.cadn.net.cn

  • 效率: 通过使用基于磁盘的结构,DiskANN相较于传统方法显著减少了查找最近邻所需的时间。spring-doc.cadn.net.cn

  • 可扩展性: 它能处理超出内存容量的大型数据集,适用于包括机器学习和AI驱动解决方案在内的多种应用场景。spring-doc.cadn.net.cn

  • 低延迟: DiskANN 在搜索操作中最大限度地减少了延迟,确保即使在处理大量数据时,应用程序也能迅速获取结果。spring-doc.cadn.net.cn

在Spring AI针对Azure Cosmos DB的场景中,向量搜索将创建并利用DiskANN索引来确保相似性查询达到最佳性能。spring-doc.cadn.net.cn

使用自动配置设置Azure Cosmos DB向量存储

以下代码演示了如何使用自动配置设置Spring Boot:spring-doc.cadn.net.cn

package com.example.demo;

import io.micrometer.observation.ObservationRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;

import java.util.List;
import java.util.Map;
import java.util.UUID;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootApplication
@EnableAutoConfiguration
public class DemoApplication implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);

    @Lazy
    @Autowired
    private VectorStore vectorStore;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Document document1 = new Document(UUID.randomUUID().toString(), "Sample content1", Map.of("key1", "value1"));
        Document document2 = new Document(UUID.randomUUID().toString(), "Sample content2", Map.of("key2", "value2"));
		this.vectorStore.add(List.of(document1, document2));
        List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Sample content").topK(1).build());

        log.info("Search results: {}", results);

        // Remove the documents from the vector store
		this.vectorStore.delete(List.of(document1.getId(), document2.getId()));
    }

    @Bean
    public ObservationRegistry observationRegistry() {
        return ObservationRegistry.create();
    }
}

自动配置

There has been a significant change in the Spring AI auto-configuration, starter modules' artifact names. Please refer to the 升级说明以获取更多信息。spring-doc.cadn.net.cn

在您的Maven项目中添加以下依赖:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-azure-cosmos-db</artifactId>
</dependency>

配置属性

以下配置属性可用于Cosmos DB向量存储:spring-doc.cadn.net.cn

属性 描述

spring.ai.vectorstore.cosmosdb.databaseNamespring-doc.cadn.net.cn

使用的Cosmos DB数据库的名称。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.containerNamespring-doc.cadn.net.cn

使用的Cosmos DB容器的名称。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.partitionKeyPathspring-doc.cadn.net.cn

分区键的路径。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.metadataFieldsspring-doc.cadn.net.cn

以逗号分隔的元数据字段列表。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.vectorStoreThroughputspring-doc.cadn.net.cn

向量存储的吞吐量。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.vectorDimensionsspring-doc.cadn.net.cn

向量的维度数量。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.endpointspring-doc.cadn.net.cn

Cosmos DB 的端点。spring-doc.cadn.net.cn

spring.ai.vectorstore.cosmosdb.keyspring-doc.cadn.net.cn

Cosmos DB的密钥(如果未提供密钥,将使用[DefaultAzureCredential](learn.microsoft.com/azure/developer/java/sdk/authentication/credential-chains#defaultazurecredential-overview))。spring-doc.cadn.net.cn

使用过滤器进行复杂搜索

您可以在Cosmos DB向量存储中使用过滤器执行更复杂的搜索。 以下是一个示例,演示如何在搜索查询中使用过滤器。spring-doc.cadn.net.cn

Map<String, Object> metadata1 = new HashMap<>();
metadata1.put("country", "UK");
metadata1.put("year", 2021);
metadata1.put("city", "London");

Map<String, Object> metadata2 = new HashMap<>();
metadata2.put("country", "NL");
metadata2.put("year", 2022);
metadata2.put("city", "Amsterdam");

Document document1 = new Document("1", "A document about the UK", this.metadata1);
Document document2 = new Document("2", "A document about the Netherlands", this.metadata2);

vectorStore.add(List.of(document1, document2));

FilterExpressionBuilder builder = new FilterExpressionBuilder();
List<Document> results = vectorStore.similaritySearch(SearchRequest.builder().query("The World")
    .topK(10)
    .filterExpression((this.builder.in("country", "UK", "NL")).build()).build());

在不使用自动配置的情况下设置Azure Cosmos DB向量存储

以下代码演示了如何在不依赖自动配置的情况下设置CosmosDBVectorStore。对于Azure Cosmos DB的认证,推荐使用[DefaultAzureCredential](learn.microsoft.com/azure/developer/java/sdk/authentication/credential-chains#defaultazurecredential-overview)。spring-doc.cadn.net.cn

@Bean
public VectorStore vectorStore(ObservationRegistry observationRegistry) {
    // Create the Cosmos DB client
    CosmosAsyncClient cosmosClient = new CosmosClientBuilder()
            .endpoint(System.getenv("COSMOSDB_AI_ENDPOINT"))
            .credential(new DefaultAzureCredentialBuilder().build())
            .userAgentSuffix("SpringAI-CDBNoSQL-VectorStore")
            .gatewayMode()
            .buildAsyncClient();

    // Create and configure the vector store
    return CosmosDBVectorStore.builder(cosmosClient, embeddingModel)
            .databaseName("test-database")
            .containerName("test-container")
            // Configure metadata fields for filtering
            .metadataFields(List.of("country", "year", "city"))
            // Set the partition key path (optional)
            .partitionKeyPath("/id")
            // Configure performance settings
            .vectorStoreThroughput(1000)
            .vectorDimensions(1536)  // Match your embedding model's dimensions
            // Add custom batching strategy (optional)
            .batchingStrategy(new TokenCountBatchingStrategy())
            // Add observation registry for metrics
            .observationRegistry(observationRegistry)
            .build();
}

@Bean
public EmbeddingModel embeddingModel() {
    return new TransformersEmbeddingModel();
}

此配置展示了所有可用的建造者选项:spring-doc.cadn.net.cn

手动依赖设置

在您的Maven项目中添加以下依赖:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-azure-cosmos-db-store</artifactId>
</dependency>

访问原生客户端

Azure Cosmos DB 向量存储实现通过 getNativeClient() 方法提供了对底层本机 Azure Cosmos DB 客户端 (CosmosClient) 的访问:spring-doc.cadn.net.cn

CosmosDBVectorStore vectorStore = context.getBean(CosmosDBVectorStore.class);
Optional<CosmosClient> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
    CosmosClient client = nativeClient.get();
    // Use the native client for Azure Cosmos DB-specific operations
}

原生客户端为您提供访问Azure Cosmos DB特定功能和操作的权限,这些可能未通过VectorStore接口暴露出来。spring-doc.cadn.net.cn