当前位置: 首页 > news >正文

【Spring AI】Filter 简单使用

目录

关于Filter

Filter的操作符

基本使用步骤

结合RAG实战

注意


关于Filter

在 Spring AI 中,Filter 通常指 Filter.Expression(或其构建器 FilterExpressionBuilder),它用于在向量检索(如使用 VectorStore)时基于文档的元数据(metadata)进行条件过滤。这与向量相似度搜索结合,形成混合检索模式,既考虑语义相似度,也满足业务条件。

Spring AI 主要通过 FilterExpressionBuilder 来构建复杂的过滤表达式

主要应用场景

  • 属性过滤:例如,只检索某个分类、某个作者或某个时间段的文档。

  • 权限控制:例如,只检索用户有权限访问的文档。

  • 业务逻辑约束:例如,只检索已发布状态的文章。

Filter的操作符

操作符方法名说明示例(假设)
==eq等于b.eq("category", "news")
!=ne不等于b.ne("status", "draft")
>gt大于b.gt("publishDate", "2024-01-01")
>=gte大于等于b.gte("rating", 4.5)
<lt小于b.lt("price", 100)
<=lte小于等于b.lte("viewCount", 1000)
INin在集合中b.in("tag", "tech", "ai")
NINnin不在集合中b.nin("lang", "cn", "en")
ANDand逻辑与b.and(b.eq("a", "1"), b.gt("b", 2))
ORor逻辑或b.or(b.eq("x", "a"), b.eq("x", "b"))
NOTnot逻辑非b.not(b.eq("status", "deleted"))

基本使用步骤

  1. 构建 SearchRequest:使用 SearchRequest.query(your_query_string) 创建搜索请求。

  2. 创建 FilterExpression:使用 FilterExpressionBuilder 构建过滤条件。

  3. 设置过滤条件:通过 SearchRequest 的 withFilterExpression() 方法设置过滤表达式。

  4. 执行搜索:调用 VectorStore.similaritySearch(SearchRequest) 方法执行检索。

简单使用过滤条件:

@Service
public class DocumentSearchService {@Autowiredprivate VectorStore vectorStore;public List<Document> searchRecentTechNews(String userQuery) {// 1. 创建 FilterExpressionBuilderFilterExpressionBuilder b = new FilterExpressionBuilder();// 2. 构建过滤表达式: (category == "tech" OR category == "ai") AND publishYear >= 2023 AND status != "draft"Filter.Expression expression = b.and(b.and(b.or(b.eq("category", "tech"),b.eq("category", "ai")),b.gte("publishYear", 2023)),b.ne("status", "draft")).build();// 3. 创建搜索请求,设置查询语句、返回数量(topK)和过滤表达式SearchRequest searchRequest = SearchRequest.query(userQuery).withTopK(10).withSimilarityThreshold(0.7).withFilterExpression(expression);// 4. 执行搜索List<Document> results = vectorStore.similaritySearch(searchRequest);return results;}
}

结合RAG实战

在 RAG(Retrieval-Augmented Generation)应用中,Filter 常与 QuestionAnswerAdvisor 或 RetrievalAugmentationAdvisor 结合使用,在检索阶段注入业务过滤逻辑。

需求:跟据用户的提示词和过滤条件,筛选出合适的文档Document

比如Document类的metadata,这就是一个hashMap,用来存储每篇文档的元数据:

可能的数据如下,可以这篇文章看到有四个元数据:

而我们要的Filter就是基于上面的这四个元数据展开过滤,比如我现在就要过滤filename元数据,规定字段"filename"的值不能包含参数filename:

        Filter.Expression expression = new FilterExpressionBuilder().nin("filename", filename) // 添加不包含条件:字段"filename"的值不能包含参数filename.build(); // 构建过滤表达式

这样,一个简单的过滤条件就搞定了,我们还可以将这个过滤器放到文档检索器里面,同时设置一些参数,:

        // 创建文档检索器,配置检索参数// VectorStoreDocumentRetriever是DocumentRetriever的一个实现类DocumentRetriever documentRetriever = VectorStoreDocumentRetriever.builder().vectorStore(vectorStore) // 设置向量存储源.filterExpression(expression) // 设置过滤条件:按状态过滤文档.similarityThreshold(0.5) // 设置相似度阈值:只返回相似度大于0.5的文档(0-1范围).topK(3) // 设置返回文档数量:最多返回3个最相关的文档.build(); // 构建DocumentRetriever实例

我们可以再顺手将这个文档检索器放进检索增强顾问RetrievalAugmentationAdvisor里面,自动返回一个Advisor:

        // 创建并返回检索增强顾问// 该顾问将在AI生成回答时,自动从vectorStore中检索相关文档作为上下文return RetrievalAugmentationAdvisor.builder().documentRetriever(documentRetriever) // 设置文档检索器.build(); // 构建RetrievalAugmentationAdvisor实例

将上面的代码封装成一个类,也叫自定义的 RAG 检索增强顾问类,里面的主要方法的参数是VectorStore(向量存储实例)和String(要过滤的条件),然后我们在需要的地方使用ChatClient的adviosors()方法进行调用即可:

chatClient.prompt().user().advisors(填入你的检索增强顾问).call().chatResponse();

如果对ChatClient不明白怎么用的话可以看看我之前的文章【Spring AI】ChatClient 使用详解-CSDN博客

注意

  1. 元数据键的命名:确保过滤条件中使用的元数据键(如 "category")与存入 VectorStore 的 Document 元数据键一致。

  2. 值的类型:过滤时,值的类型(字符串、数字、布尔值)应与元数据中存储的类型匹配。

  3. 底层向量数据库的支持:不同的向量数据库(如 Elasticsearch6、Redis、Pgvector)对过滤操作符的支持度和语法可能有细微差异。Spring AI 的 FilterExpressionBuilder 会尽力转换为底层数据库的查询语法,但极端复杂的情况仍需测试。

看到这里了,如果对你有帮助,可以点个赞么~


文章转载自:

http://I2261LNh.ppghc.cn
http://qgcu3AGW.ppghc.cn
http://sLPB8tJO.ppghc.cn
http://RZBaJWtI.ppghc.cn
http://7bBUvAP6.ppghc.cn
http://tEDceFbV.ppghc.cn
http://nOR2e58Q.ppghc.cn
http://eeKSyMy2.ppghc.cn
http://Xf6NjJdx.ppghc.cn
http://bV7wGi2b.ppghc.cn
http://Z6ipMcVV.ppghc.cn
http://ejMZz3Ay.ppghc.cn
http://R4AF6fG9.ppghc.cn
http://iYUdHGhf.ppghc.cn
http://lZu8Zvh9.ppghc.cn
http://6wl1URoK.ppghc.cn
http://gYH6Gjlw.ppghc.cn
http://RQu2jNCU.ppghc.cn
http://2krvJgpX.ppghc.cn
http://If5NobPS.ppghc.cn
http://z6BGllev.ppghc.cn
http://FivGYSZa.ppghc.cn
http://ndJTsXbh.ppghc.cn
http://sKcZ5FIh.ppghc.cn
http://6PGt2uSr.ppghc.cn
http://UGoJpAhi.ppghc.cn
http://tIUdZVa7.ppghc.cn
http://341GcQy6.ppghc.cn
http://3LegxNa9.ppghc.cn
http://uYOrXPac.ppghc.cn
http://www.dtcms.com/a/382119.html

相关文章:

  • html各种常用标签
  • Linux 进程信号之信号的捕捉
  • 实验-高级acl(简单)
  • C++之特殊类设计
  • stm32教程:USART串口通信
  • 地级市绿色创新、碳排放与环境规制数据
  • ES——(二)基本语法
  • 中级统计师-统计法规-第十一章 统计法律责任
  • 拥抱直觉与创造力:走进VibeCoding的新世界
  • Python进程和线程——多进程
  • 论文阅读 2025-9-13 论文阅读随心记
  • leecode56 合并区间
  • 用R获取 芯片探针与基因的对应关关系 bioconductor的包的 三者对应关系
  • xxl-job的使用
  • 2025 年 9 月 12 日科技前沿动态全览
  • 高德地图自定义 Marker:点击 悬停 显示信息框InfoWindow实战(Vue + AMap 2.0)
  • 猿辅导Java后台开发面试题及参考答案
  • 启动项目提示:org.springframework.context.annotation不存在问题
  • 从零开始的指针(3)
  • “移动零”思路与题解
  • 大模型训练框架:Swift 框架
  • [笔记] 来到了kernel 5.14
  • 【算法笔记】快速排序算法
  • 数据结构——顺序表(c语言笔记)
  • Java 黑马程序员学习笔记(进阶篇6)
  • Day04 前缀和差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
  • Java 类加载与对象内存分配机制详解
  • 【数据结构——图与邻接矩阵】
  • 再次深入学习深度学习|花书笔记1
  • 信息检索、推荐系统模型排序质量指标:AP@K和MAP@K