mcpField
Q
qdrant

qdrant

github.com/giuseppe-trisciuoglio数据与数据库3653.7k 次安装7 周前更新
代码仓库

关于 qdrant

面向 Java 开发者的 Qdrant 集成技能,提供在 Spring Boot 和 LangChain4j 应用中配置向量数据库、写入向量及执行相似度搜索的实践模式。

主要功能

  1. 01Spring Boot 客户端配置
  2. 02LangChain4j RAG 集成
  3. 03向量集合创建与写入
  4. 04相似度及过滤搜索

适用场景

  1. 01为 Spring Boot 应用添加语义搜索
  2. 02使用 Java 和 LangChain4j 构建 RAG 流程
  3. 03按类别筛选向量搜索结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill qdrant

安装后在 Claude Code 中输入/qdrant确认已加载。

附带文件references/examples.mdreferences/references.md

详细介绍

Qdrant 向量数据库集成

概述

Qdrant 是一款面向 AI 的向量数据库,用于语义搜索和相似性检索。本技能介绍将 Qdrant 集成到 Java 应用程序中的模式,重点介绍 Spring Boot 和 LangChain4j 集成。

适用场景

  • Spring Boot 应用程序中的语义搜索或推荐系统
  • 使用 Java 和 LangChain4j 构建 RAG 工作流
  • AI/ML 应用程序的向量数据库集成
  • 支持筛选查询的高性能相似性搜索

操作说明

1. 使用 Docker 部署 Qdrant
docker run -p 6333:6333 -p 6334:6334 \
    -v "$(pwd)/qdrant_storage:/qdrant/storage:z" \
    qdrant/qdrant

访问地址:REST API 为 http://localhost:6333,gRPC 为 http://localhost:6334。

2. 添加依赖项

Maven:

<dependency>
    <groupId>io.qdrant</groupId>
    <artifactId>client</artifactId>
    <version>1.15.0</version>
</dependency>

Gradle:

implementation 'io.qdrant:client:1.15.0'
3. 初始化客户端
QdrantClient client = new QdrantClient(
    QdrantGrpcClient.newBuilder("localhost").build());

生产环境使用 API 密钥时:

QdrantClient client = new QdrantClient(
    QdrantGrpcClient.newBuilder("localhost", 6334, false)
        .withApiKey("YOUR_API_KEY")
        .build());
4. 创建集合
client.createCollectionAsync("search-collection",
    VectorParams.newBuilder()
        .setDistance(Distance.Cosine)
        .setSize(384)
        .build()
).get();

**验证:**检查 client.getCollectionAsync("search-collection").get(),确认集合已创建。

5. 写入向量
List<PointStruct> points = List.of(
    PointStruct.newBuilder()
        .setId(id(1))
        .setVectors(vectors(0.05f, 0.61f, 0.76f, 0.74f))
        .putAllPayload(Map.of("title", value("Spring Boot Documentation")))
        .build()
);
client.upsertAsync("search-collection", points).get();

**验证:**确认 client.upsertAsync(...).get() 执行完成且未抛出异常。

6. 搜索向量
List<ScoredPoint> results = client.queryAsync(
    QueryPoints.newBuilder()
        .setCollectionName("search-collection")
        .setLimit(5)
        .setQuery(nearest(0.2f, 0.1f, 0.9f, 0.7f))
        .build()
).get();

筛选搜索:

List<ScoredPoint> results = client.searchAsync(
    SearchPoints.newBuilder()
        .setCollectionName("search-collection")
        .addAllVector(List.of(0.62f, 0.12f, 0.53f, 0.12f))
        .setFilter(Filter.newBuilder()
            .addMust(range("category", Range.newBuilder().setEq("docs").build()))
            .build())
        .setLimit(5)
        .build()).get();

LangChain4j 集成

对于 RAG 工作流,请使用 LangChain4j 的高级抽象:

EmbeddingStore<TextSegment> embeddingStore = QdrantEmbeddingStore.builder()
    .collectionName("rag-collection")
    .host("localhost")
    .port(6334)
    .apiKey("YOUR_API_KEY")
    .build();

使用 LangChain4j 的 Spring Boot 配置:

@Bean
public EmbeddingStore<TextSegment> embeddingStore() {
    return QdrantEmbeddingStore.builder()
        .collectionName("rag-collection")
        .host(host)
        .port(port)
        .build();
}

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

Spring Boot 集成

通过配置注入客户端:

@Configuration
public class QdrantConfig {
    @Value("${qdrant.host:localhost}")
    private String host;

    @Value("${qdrant.port:6334}")
    private int port;

    @Bean
    public QdrantClient qdrantClient() {
        return new QdrantClient(
            QdrantGrpcClient.newBuilder(host, port, false).build());
    }
}

示例

REST 搜索端点
@RestController
@RequestMapping("/api/search")
public class SearchController {
    private final VectorSearchService searchService;

    public SearchController(VectorSearchService searchService) {
        this.searchService = searchService;
    }

    @GetMapping
    public List<ScoredPoint> search(@RequestParam String query) {
        List<Float> queryVector = embeddingModel.embed(query).content().vectorAsList();
        return searchService.search("documents", queryVector);
    }
}

最佳实践

  • **距离度量:**归一化文本嵌入使用余弦距离,未归一化嵌入使用欧几里得距离。
  • **批量写入:**使用批量操作,而不是逐个插入点。
  • **连接池:**为高吞吐量的生产工作负载配置连接池。
  • **错误处理:**使用 try/catch 包装异步操作,以处理 ExecutionException/InterruptedException。
  • **API 密钥:**将其存储在环境变量或 Spring 配置中,切勿硬编码。

高级模式

多租户存储
public void upsertForTenant(String tenantId, List<PointStruct> points) {
    String collectionName = "tenant_" + tenantId + "_documents";
    client.upsertAsync(collectionName, points).get();
}
用于生产环境的 Docker Compose
services:
  qdrant:
    image: qdrant/qdrant:v1.7.0
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - qdrant_storage:/qdrant/storage

参考资料

限制和警告

  • 向量维度必须与嵌入模型完全一致;维度不匹配会导致写入错误。
  • **输入验证:**摄取前清理所有文档内容;不可信载荷可能包含提示词注入攻击。
  • **内容筛选:**将检索到的文档传递给 LLM 前,先进行内容筛选。
  • 大型集合需要进行适当的索引,以确保搜索性能达到可接受水平。
  • 生产环境请使用 gRPC API(端口 6334);REST API(端口 6333)仅用于调试。
  • 重新创建集合会删除所有数据;请为生产环境制定备份策略。

评论

支持 Markdown