Azure Cosmos DB
本节将指导您完成设置以存储文档嵌入并执行相似性搜索。CosmosDBVectorStore
什么是 Azure Cosmos DB?
Azure Cosmos DB 是 Microsoft 的全球分布式云原生数据库服务,专为任务关键型应用程序而设计。 它提供高可用性、低延迟以及水平扩展以满足现代应用程序需求的能力。 它是从头开始构建的,其核心是全球分发、精细的多租户和水平可扩展性。 它是 Azure 中的一项基础服务,被全球范围内的大多数 Microsoft 关键任务应用程序使用,包括 Teams、Skype、Xbox Live、Office 365、Bing、Azure Active Directory、Azure 门户、Microsoft Store 等。 它还被数以千计的外部客户使用,包括 OpenAI for ChatGPT 和其他需要弹性扩展、交钥匙全球分发以及全球低延迟和高可用性的任务关键型 AI 应用程序。
什么是 DiskANN?
DiskANN(基于磁盘的近似最近邻搜索)是 Azure Cosmos DB 中用于增强矢量搜索性能的创新技术。 它通过对 Cosmos DB 中存储的嵌入进行索引,实现对高维数据的高效且可缩放的相似性搜索。
DiskANN 具有以下优势:
-
效率:与传统方法相比,通过利用基于磁盘的结构,DiskANN 显著缩短了查找最近邻所需的时间。
-
可扩展性:它可以处理超过内存容量的大型数据集,使其适用于各种应用程序,包括机器学习和 AI 驱动的解决方案。
-
低延迟:DiskANN 最大限度地减少了搜索操作期间的延迟,确保应用程序即使在数据量很大的情况下也能快速检索结果。
在 Spring AI for Azure Cosmos DB 的上下文中,向量搜索将创建并利用 DiskANN 索引来确保相似性查询的最佳性能。
使用自动配置设置 Azure Cosmos DB 矢量存储
以下代码演示了如何设置 with auto-configuration:CosmosDBVectorStore
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.query("Sample content").withTopK(1));
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();
}
}
自动配置
将以下依赖项添加到您的 Maven 项目中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-cosmos-db-store-spring-boot-starter</artifactId>
</dependency>
配置属性
以下配置属性可用于 Cosmos DB 矢量存储:
财产 | 描述 |
---|---|
spring.ai.vectorstore.cosmosdb.databaseName |
要使用的 Cosmos DB 数据库的名称。 |
spring.ai.vectorstore.cosmosdb.containerName |
要使用的 Cosmos DB 容器的名称。 |
spring.ai.vectorstore.cosmosdb.partitionKeyPath |
分区键的路径。 |
spring.ai.vectorstore.cosmosdb.metadataFields |
以逗号分隔的元数据字段列表。 |
spring.ai.vectorstore.cosmosdb.vectorStore吞吐量 |
向量存储的吞吐量。 |
spring.ai.vectorstore.cosmosdb.vectorDimensions |
向量的维数。 |
spring.ai.vectorstore.cosmosdb.endpoint |
Cosmos DB 的终结点。 |
spring.ai.vectorstore.cosmosdb.key |
Cosmos DB 的密钥。 |
使用过滤器进行复杂搜索
可以使用 Cosmos DB 矢量存储中的筛选器执行更复杂的搜索。 下面是演示如何在搜索查询中使用筛选器的示例。
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.query("The World")
.withTopK(10)
.withFilterExpression((this.builder.in("country", "UK", "NL")).build()));
在不进行自动配置的情况下设置 Azure Cosmos DB 矢量存储
以下代码演示了如何在不依赖自动配置的情况下进行设置:CosmosDBVectorStore
package com.example.demo;
import com.azure.cosmos.CosmosAsyncClient;
import com.azure.cosmos.CosmosClientBuilder;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.transformers.TransformersEmbeddingModel;
import org.springframework.ai.vectorstore.CosmosDBVectorStore;
import org.springframework.ai.vectorstore.CosmosDBVectorStoreConfig;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
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;
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Lazy
@Autowired
private VectorStore vectorStore;
@Lazy
@Autowired
private EmbeddingModel embeddingModel;
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.query("Sample content").withTopK(1));
log.info("Search results: {}", results);
}
@Bean
public ObservationRegistry observationRegistry() {
return ObservationRegistry.create();
}
@Bean
public VectorStore vectorStore(ObservationRegistry observationRegistry) {
CosmosDBVectorStoreConfig config = new CosmosDBVectorStoreConfig();
config.setDatabaseName("spring-ai-sample");
config.setContainerName("container");
config.setMetadataFields("country,city");
config.setVectorStoreThroughput(400);
CosmosAsyncClient cosmosClient = new CosmosClientBuilder()
.endpoint(System.getenv("COSMOSDB_AI_ENDPOINT"))
.userAgentSuffix("SpringAI-CDBNoSQL-VectorStore")
.key(System.getenv("COSMOSDB_AI_KEY"))
.gatewayMode()
.buildAsyncClient();
return new CosmosDBVectorStore(observationRegistry, null, cosmosClient, config, this.embeddingModel);
}
@Bean
public EmbeddingModel embeddingModel() {
return new TransformersEmbeddingModel();
}
}
手动依赖项设置
在 Maven 项目中添加以下依赖项:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-cosmos-db-store</artifactId>
</dependency>