文档过滤和检索
在 Spring AI 的向量存储(VectorStore
)中,文档过滤和检索是构建 RAG(检索增强生成)等应用的核心流程,它们结合向量相似度和元数据筛选,实现精准的文档查找。
SpringAI将文档过滤和检索分为了三个阶段,分别为预检索、检索中、检索后。每一个阶段都提供了自定义组件来更好地增强检索,提高准确性。
预检索
负责优化用户输入的查询语句,使描述问题更清晰,更有针对性,提高后续检索的质量。
核心任务:
- 对用户查询文本进行清洗、分词或扩展(如同义词替换)
- 基于业务规则过滤掉明显不相关的文档集合
- 动态生成或调整检索过滤条件(
Filter.Expression
)
RewriteQueryTransformer:对用户的查询进行改写,当用户查询含糊不清或者包含无意义的信息时,会使其更加清洗明确。
由源码可以看出,实际上就是将这个语句和用户查询的语句拼接在一起,同时用了动态参数。
QueryTransformer:用于转换用户原始查询,例如:
public class CustomQueryTransformer implements QueryTransformer {
@Override
public String transform(String query) {
// 示例:将英文缩写替换为全称
return query.replace("AI", "人工智能");
}
}
- 对查询进行拼写纠错
- 扩展查询关键词(如将 “AI” 扩展为 “人工智能”)
- 提取查询中的实体作为过滤条件(如从 “北京的天气” 中提取 “location: 北京” 作为过滤条件)
此外还有很多组件,需要我们耐心探索
检索中
目标:在向量数据库执行检索时,优化相似度计算和结果筛选逻辑,查询出最相关的文档。
核心任务:
- 调整相似度度量方式(如从余弦相似度切换为点积)
- 动态设置检索参数(如
topK
、similarityThreshold
) - 结合向量相似度和元数据过滤进行混合检索
DocumentRetriever:是负责从向量存储(或其他数据源)中检索与查询相关的文档的核心组件。支持元数据过滤、设置相似度阈值、设置返回的结果数。
ConcatenationDocumentJoiner:是一个用于将多个文档内容合并为单一字符串的组件,当检索到多个相关文档后,需要将它们的内容合并成一个连贯的上下文,再传递给大语言模型(LLM)生成回答。
检索后
目标:对检索返回的结果进行二次处理,提升最终结果的相关性和可用性。
核心任务:
- 重排序检索结果(如基于业务权重调整顺序)
- 过滤低质量或重复文档
- 对文档内容进行摘要或格式化
查询增强和关联
在 Spring AI 及 RAG(检索增强生成)场景中,查询增强(Query Enhancement) 和关联(Correlation) 是提升检索准确性和生成质量的重要技术,旨在解决原始查询表达不清晰、上下文缺失或与文档匹配度低等问题。
是RAG流程的最终环节,负责将检索的文档与用户查询结合起来,为AI提供必要的上下文。
QuestionAnswerAdvisor
当用户问题发给AI模型时,Advisor会查询向量数据库搜索与用户问题相关的文档作为上下文,附加到用户查询中
ChatResponse response = ChatClient.builder(chatModel)
.build().prompt()
.advisors(new QuestionAnswerAdvisor(vectorStore))
.user(userText)
.call()
.chatResponse();
实现原理就是将上下文和用户查询拼接为一个新的Prompt。
RetrievalAugmentationAdvisor
RetrievalAugmentationAdvisor
(检索增强顾问)是一个专注于优化 RAG(检索增强生成)核心链路的组件。它的核心职责是通过动态调整 “检索 - 增强 - 生成” 全流程中的关键环节,解决检索与生成脱节、上下文相关性不足、LLM 幻觉等问题,最终提升回答的准确性、相关性和可靠性。
核心定位与解决的核心问题
RAG 流程中常见的痛点包括:
- 检索到的文档冗余或噪音过多,导致 LLM 注意力分散;
- 检索结果与用户问题的语义匹配度低,增强效果有限;
- 上下文拼接方式简单(如直接拼接),LLM 难以高效提取关键信息;
- 缺乏对检索质量的评估与二次优化机制。
RetrievalAugmentationAdvisor
正是针对这些痛点,通过 “评估 - 优化 - 增强” 的闭环逻辑,让检索结果更好地服务于生成环节。
ContextualQueryAugmenter
默认情况,空上下文模型会被RetrievalAugmentationAdvisor命令不回答。但ContextualQueryAugmenter会对空上下文做出一些处理