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

Qdrant

This section walks you through setting up the Qdrant 0 to store document embeddings and perform similarity searches.spring-doc.cadn.net.cn

Qdrant 是一个开源的、高性能的向量搜索引擎/数据库。它使用 HNSW(分层可移动的小世界)算法进行高效的 k-NN 搜索操作,并提供基于元数据的高级过滤能力。spring-doc.cadn.net.cn

前提条件

  • Qdrant实例:按照以下步骤设置一个Qdrant实例:首先访问Qdrant官网,然后找到安装说明部分,阅读并按照上面提供的安装说明来配置您的Qdrant实例。spring-doc.cadn.net.cn

  • 如果需要,获取用于在存储于QdrantVectorStore中的嵌入模型的API密钥。spring-doc.cadn.net.cn

It is recommended that the Qdrant collection is 创建 in advance with the appropriate dimensions and configurations. 如果未创建集合,QdrantVectorStore将尝试使用Cosine相似性和配置好的EmbeddingModel维度创建一个。

自动配置

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

Spring AI提供为Qdrant向量存储一键配置的Spring Boot设置。 要 enable it, 在您的项目Maven pom.xml文件中添加以下依赖项:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-qdrant</artifactId>
</dependency>

或者添加到您的Gradle 构建脚本文件中。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-vector-store-qdrant'
}
参考以下依赖管理部分,添加Spring AI BOM到你的构建文件中。

请查看以下向量存储的配置参数列表,了解默认值和配置选项。这些配置参数的类型为C0。spring-doc.cadn.net.cn

引用 Artifact 仓库 部分,以在构建文件中添加 Maven Central 和/或 Snapshot 仓库。

向量存储实现可以初始化必要的schema,但您必须通过指定builder中的initializeSchema布尔值或在application.properties文件中设置…​initialize-schema=true来启用此功能。spring-doc.cadn.net.cn

这是一个破坏性变更!在早期版本的 Spring AI 中,此模式初始化是默认进行的。

此外,您还需要配置一个EmbeddingModel的豆。有关详细信息,请参阅EmbeddingModel部分。spring-doc.cadn.net.cn

现在您可以在应用程序中自动将QdrantVectorStore作为向量存储进行注入。spring-doc.cadn.net.cn

@Autowired VectorStore vectorStore;

// ...

List<Document> documents = List.of(
    new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
    new Document("The World is Big and Salvation Lurks Around the Corner"),
    new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));

// Add the documents to Qdrant
vectorStore.add(documents);

// Retrieve documents similar to a query
List<Document> results = vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());

配置属性

连接到Qdrant并使用QdrantVectorStore,您需要提供实例的访问权限信息。 一个简单的配置可以通过Spring Boot的application.yml提供:spring-doc.cadn.net.cn

spring:
  ai:
    vectorstore:
      qdrant:
        host: <qdrant host>
        port: <qdrant grpc port>
        api-key: <qdrant api key>
        collection-name: <collection name>
        use-tls: false
        initialize-schema: true

spring.ai.vectorstore.qdrant.* 开头的属性用于配置 QdrantVectorStorespring-doc.cadn.net.cn

属性 描述 默认值

spring.ai.vectorstore.qdrant.hostspring-doc.cadn.net.cn

Qdrant服务器的宿主spring-doc.cadn.net.cn

localhostspring-doc.cadn.net.cn

spring.ai.vectorstore.qdrant.portspring-doc.cadn.net.cn

Qdrant 服务器的 gRPC 端口spring-doc.cadn.net.cn

6334spring-doc.cadn.net.cn

spring.ai.vectorstore.qdrant.api-keyspring-doc.cadn.net.cn

用于认证的密钥spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.qdrant.collection-namespring-doc.cadn.net.cn

需要使用的集合名称spring-doc.cadn.net.cn

vector_storespring-doc.cadn.net.cn

spring.ai.vectorstore.qdrant.use-tlsspring-doc.cadn.net.cn

是否要使用 TLS(HTTPS)spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.ai.vectorstore.qdrant.initialize-schemaspring-doc.cadn.net.cn

是否初始化元数据spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

手动配置

不是使用Spring Boot的自动配置,你可以手动配置Qdrant向量存储。为此,你需要添加以下代码到你的项目中:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-qdrant-store</artifactId>
</dependency>

或者添加到您的Gradle 构建脚本文件中。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-qdrant-store'
}
参考以下依赖管理部分,添加Spring AI BOM到你的构建文件中。

创建一个Qdrant客户端Bean类:spring-doc.cadn.net.cn

@Bean
public QdrantClient qdrantClient() {
    QdrantGrpcClient.Builder grpcClientBuilder =
        QdrantGrpcClient.newBuilder(
            "<QDRANT_HOSTNAME>",
            <QDRANT_GRPC_PORT>,
            <IS_TLS>);
    grpcClientBuilder.withApiKey("<QDRANT_API_KEY>");

    return new QdrantClient(grpcClientBuilder.build());
}

然后使用构建器模式创建 QdrantVectorStore Bean:spring-doc.cadn.net.cn

@Bean
public VectorStore vectorStore(QdrantClient qdrantClient, EmbeddingModel embeddingModel) {
    return QdrantVectorStore.builder(qdrantClient, embeddingModel)
        .collectionName("custom-collection")     // Optional: defaults to "vector_store"
        .initializeSchema(true)                  // Optional: defaults to false
        .batchingStrategy(new TokenCountBatchingStrategy()) // Optional: defaults to TokenCountBatchingStrategy
        .build();
}

// This can be any EmbeddingModel implementation
@Bean
public EmbeddingModel embeddingModel() {
    return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("OPENAI_API_KEY")));
}

元数据过滤

你可以利用通用且可移植的 元数据过滤器 与Qdrant存储库一起使用。spring-doc.cadn.net.cn

例如,你可以使用文本表达式语言:spring-doc.cadn.net.cn

vectorStore.similaritySearch(
    SearchRequest.builder()
        .query("The World")
        .topK(TOP_K)
        .similarityThreshold(SIMILARITY_THRESHOLD)
        .filterExpression("author in ['john', 'jill'] && article_type == 'blog'").build());

或通过编程方式使用 Filter.Expression DSL:spring-doc.cadn.net.cn

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.builder()
    .query("The World")
    .topK(TOP_K)
    .similarityThreshold(SIMILARITY_THRESHOLD)
    .filterExpression(b.and(
        b.in("author", "john", "jill"),
        b.eq("article_type", "blog")).build()).build());
自动转换成Qdrant的 proprietary 滤镜表达式。

访问原生客户端

Qdrant向量存储实现提供了通过0方法访问底层的Qdrant客户端。spring-doc.cadn.net.cn

QdrantVectorStore vectorStore = context.getBean(QdrantVectorStore.class);
Optional<QdrantClient> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
    QdrantClient client = nativeClient.get();
    // Use the native client for Qdrant-specific operations
}

本地客户端赋予了您访问Qdrant特有的功能和操作的机会,这些功能和操作在VectorStore接口中可能无法访问。spring-doc.cadn.net.cn