Spring AI 向量库similaritySearch筛选高分相似度查询

编程教程 > Java > Spring (34) 2025-09-02 15:40:11
  • 使用 VectorStore.similaritySearchWithScore 获取带分数的结果
  • 过滤掉低分(低相关性)结果,只保留 score > threshold 的文档
  • 提高输入给 LLM 的上下文质量,从而提升回答准确率

1. Spring AI 中的 VectorStore 与相似度分数

Spring AI 1.0.1 中,VectorStore 接口默认不返回分数,但大多数实现(如 QdrantVectorStoreChromaVectorStoreMilvusVectorStore 等)都支持 带分数的搜索方法

🔍 关键方法:similaritySearch(…) 的扩展

虽然 VectorStore 接口本身没有暴露 WithScore 方法,但具体实现类通常提供:

List<Document> similaritySearch(String query, int k, String... filters);

但为了获取 score,您需要使用:

👉 VectorStore#similaritySearch(SearchRequest request)

其中 SearchRequest 支持:

  • setQuery(String)
  • setTopK(int)
  • setSimilarityThreshold(double) ✅(关键!)

2. ✅ 正确做法:使用 SearchRequest 设置 similarityThreshold

这是 Spring AI 提高检索准确率的核心方式

✅ 示例代码(Spring Boot + Spring AI 1.0.1)

@Service
public class RetrievalService {
    private final VectorStore vectorStore;
    public RetrievalService(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }
    public List<Document> retrieveRelevantDocuments(String query, double minScore, int maxResults) {
        SearchRequest request = new SearchRequest();
        request.setQuery(query);
        request.setTopK(maxResults);
        request.setSimilarityThreshold(minScore); // ← 只返回 score >= minScore 的结果
        return vectorStore.similaritySearch(request);
    }
}

📌 配置示例(application.yml)

spring:
  ai:
    vectorstore:
      qdrant:
        host: localhost
        port: 6333
      # 或 chroma, milvus, etc.

3. ⚠️ 注意:相似度分数范围

不同向量数据库的 score 范围不同,设置阈值时要小心:

向量库 相似度类型 分数范围 越高越好?
Qdrant 余弦相似度 [0, 1] ✅ 是(1 最相似)
Chroma 余弦相似度 [-1, 1] ✅ 是(1 最相似)
Milvus 内积/余弦 [-1, 1][0,1] ✅ 是
Pinecone 余弦 [0,1] ✅ 是
FAISS (原始) L2 距离 [0, ∞) ❌ 越小越好

✅ 推荐阈值(以余弦相似度为例)

  • 0.75 ~ 0.95:高质量匹配(推荐用于 RAG)
  • < 0.6:通常噪声较大,建议过滤
// 示例:只返回高相关性文档
List<Document> docs = retrieveRelevantDocuments("人工智能", 0.75, 10);

4. ✅ 结合 ChatClient 提升准确率

@Service
public class ChatService {
    private final ChatClient chatClient;
    private final RetrievalService retrievalService;
    public ChatService(ChatClient chatClient, RetrievalService retrievalService) {
        this.chatClient = chatClient;
        this.retrievalService = retrievalService;
    }
    public String chat(String userMessage) {
        // 1. 检索高相关性上下文
        List<Document> relevantDocs = retrievalService.retrieveRelevantDocuments(
            userMessage, 0.75, 5
        );
        // 2. 构建上下文
        String context = relevantDocs.stream()
            .map(Document::getContent)
            .reduce("", (a, b) -> a + "\n\n" + b);
        // 3. 调用 LLM
        return chatClient.prompt()
            .user(userMessage)
            .advisory(context) // 使用 advisory 添加上下文(Spring AI 推荐方式)
            .call()
            .content();
    }
}

💡 advisory() 是 Spring AI 中用于添加 RAG 上下文的推荐方式,不会干扰主语义。


5. ✅ 提高准确率的其他建议

方法 说明
提高 embedding 质量 使用高质量模型(如 text-embedding-3-large
优化文本分块 块大小 256~512 token,避免截断关键信息
添加元数据过滤 request.setFilter("category = 'tech'")
重排序(Rerank) 检索后使用 Cross-Encoder 重排序(Spring AI 即将支持)
查询扩展 生成同义查询并合并结果

✅ 总结

目标 实现方式
获取相似度分数 使用 SearchRequest 而非简单 similaritySearch
过滤低分结果 request.setSimilarityThreshold(0.75)
提高 RAG 准确率 结合高阈值 + 高质量 embedding + 合理分块
集成 ChatClient 使用 advisory() 注入过滤后的上下文

最终建议配置

SearchRequest request = new SearchRequest();
request.setQuery(userMessage);
request.setTopK(5);
request.setSimilarityThreshold(0.75); // 关键:提高门槛
List<Document> results = vectorStore.similaritySearch(request);

这样可以有效过滤噪声,提升 RAG 系统的整体准确率和稳定性


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
使用 VectorStore.similaritySearchWithScore 获取带分数的结果过滤掉低分(低相关性)结果,只保留 score &gtl; thres
概述本文讲解Java编程中如何通过Spring AI框架 集成 Redis Stack 向量数据库和Ollama模型服务提供者实现RAG本地外挂知识库。前置条件
目标使用Redis Stack中间件作为向量数据库(Vector Database)实现文档数据的存储和查询功能。先决条件已安装好的 redis stack ,
基于上一个项目Spring Boot 接入Ollama实现与Deepseek简单对话修改,增加嵌入库配置,修改模型拉取策略为alwaysapplication.
Ollama 环境准备Ollama安装使用参考:Deepseek Windows安装和入门使用Spring Boot项目接入OllamaSpring Boot
继上一篇deepseek Windows安装和入门使用 本地部署deepseek只能在cmd窗口使用,体验感不好。这里使用一个可视化工具Cherry Studi
1 pt = 1 / 72 Inch 是数字排版中对 pt 这个单位的定义。所以,无论是在 PS、AI 还是 ID 中,1 pt 对应的物理长度单位都是一样的。
在科技领域,新兴公司的涌现几乎每天都有,而每一家公司背后都有着独特的故事和潜力。最近,一家名为“深度求索”(DeepSeek)的中国公司引发了广泛关注。这家公司
Spring Context 与Spring MVC Context那些坑
Spring WebFlux,spring框架5.0将会新增的web增强框架,这里主要讲述什么是Spring WebFlux以及Spring WebFlux的新功能,Spring WebFlux...
Spring框架Spring IoC容器的核心原理,前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的...
Spring Boot 2.0,Spring框架的Spring Boot 中的Spring Boot Actuator变化讲解。并且了解如何在Spring Boot 2.0中使用Actuator...
java编程中spring框架5.0介绍说明/概述,spring5,spring框架,java编程
Spring AOP来由,为何会出现Spring AOP这样的框架? 上一篇从Web开发演进过程的一个侧面简述了一下为什么会有Spring框架?事实上只介绍了为什么会有Spring IOC(控制...
spring boot 入门之spring session实现restful apis。通过spring boot或者spring mvc整合spring session的方式来实现sessio...