在下面这篇文章中,我们介绍过了关于RAG的模块化RAG的支持:
✅LangChain4J中的Modular RAG支持
除了Spring AI中提供了模块化RAG的支持,其实LangChain4J中也有,甚至功能更加强大。 LangChain4J中提供了RetrievalAugmentor接口,他有一个默认的实现DefaultRetrievalAugment
LLMentor
我们的这个项目就会围绕着这个机制来实现RAG的检索流程。
上一篇文档中,我们介绍了各个组件,我们在这里再来回顾一下他们,并且把整个流程串起来。然后我们基于这些组件逐一展开开始课程的学习。
RetrievalAugmentor是LangChain4j中RAG检索的核心组件,只有给一个AIService配置了RetrievalAugmentor之后,他才会做检索。
RetrievalAugmentor中包含了以下组件:
| 组件 | 作用 | 默认实现 |
| --- | --- | --- |
| QueryTransformer | 将用户的原始查询转换为一个或多个新查询,目的是提升检索质量。 | 直接返回原查询 |
| QueryRouter | 根据查询语义,将其路由到最合适的一个或多个 ContentRetriever(内容检索器) | 将查询发到所有检索器 |
| ContentRetriever | 接收一个 Query,从底层数据源中检索出相关内容,返回按相关性排序的 List
用法:
DefaultRetrievalAugmentor.builder()
.queryRouter(new DefaultQueryRouter(
List.of(embeddingRetriever, fullTextRetriever, sqlRetriever, neo4jRetriever), chatModel)) // 自定义路由器和检索器
.queryTransformer(queryTransformer) // 自定义改写器
.contentAggregator(contentAggregator) // 自定义聚合器(多层去重+RRF)
.contentInjector(contentInjector) // 自定义注入模板
.build();
实际执行流程:
public AugmentationResult augment(AugmentationRequest augmentationRequest) {
// 从 UserMessage 提取原始查询
Query originalQuery = Query.from(queryText, augmentationRequest.metadata());
// 步骤1: 查询转换
Collection<Query> queries = queryTransformer.transform(originalQuery);
// 步骤2+3: 查询路由 + 内容检索(内部并行)
Map<Query, Collection<List<Content>>> queryToContents = process(queries);
// 步骤4: 内容聚合
List<Content> contents = contentAggregator.aggregate(queryToContents);
// 步骤5: 内容注入
ChatMessage augmentedChatMessage = contentInjector.inject(contents, chatMessage);
return AugmentationResult.builder()
.chatMessage(augmentedChatMessage)
.contents(contents)
.build();
}
后面,我们就从头开始,以此开始介绍QueryTransformer(查询改写)、QueryRouter(查询路由)、ContentRetriever(混合检索)、ContentAggregator(重排序)以及ContentInjector(内容注入)