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

实现高级RAG(Advanced RAG)--RetrievalAugmentor--LangChain4j

高级RAG解决的痛点:

解决基础 RAG(Naive RAG)在面对复杂业务场景时暴露出的“找不到、找不准、用不好”等核心痛点,我们可以把基础 RAG 的痛点归纳为三个阶段:检索前(提问阶段)、检索中(寻找阶段)和检索后(生成阶段)。高级 RAG 正是通过引入更复杂的机制,精准干预了这三个阶段。

Advanced RAG流程(高级 RAG 流程):

RetrievalAugmentor检索增强器

实现高级RAG的核心就是配置RetrievalAugmentor(检索增强器)

在配置AiServices的时候,官方包里有对应的获取retrievalAugmentor方法

package dev.langchain4j.service; public abstract class AiServices<T> { ... public AiServices<T> retrievalAugmentor(RetrievalAugmentor retrievalAugmentor) { if (this.contentRetrieverSet) { throw IllegalConfigurationException.illegalConfiguration("Only one out of [retriever, contentRetriever, retrievalAugmentor] can be set"); } else { this.retrievalAugmentorSet = true; this.context.retrievalAugmentor = (RetrievalAugmentor)ValidationUtils.ensureNotNull(retrievalAugmentor, "retrievalAugmentor"); return this; } } ... }

所以可以直接注入AIservice:

注意:这里“MyAiService”必须是接口,LangChain4j 内部使用了 Java 的动态代理

当你调用AiServices.builder(MyService.class).build()时,自动为你生成了一个代理实现类。

/** LangChain4j 的 AiServices 原生支持响应式流。 如果返回值是 Flux<String>, LangChain4j 会自动将其识别为流式传输(Streaming) */ public interface MyAiService{ public Flux<String> streamChat(自定义参数); public String chat(自定义参数); } =============================================================================== MyAiService aiService = AiServices.builder(MyAiService.class) .... .retrievalAugmentor(retrievalAugmentor)//放到这里 .build();

如何配置 RetrievalAugmentor?

RetrievalAugmentor主要组件:

可以通过 LangChain4j 配合以下核心组件实现

QueryTransformer优化检索词解决“用户不会提问”问题
QueryRouter查询路由允许同一个系统同时向不同的介质(向量库、关系型数据库、Web 搜索引擎)发起检索
ContentRetriever检索器
ContentAggregator聚合检索结果(重排序对这些杂乱的数据进行合并、去重、筛选和重新排序。
ContentInjector将检索到的内容注入 prompt“高质量上下文”
代码实现:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package dev.langchain4j.rag; public interface RetrievalAugmentor { AugmentationResult augment(AugmentationRequest var1); } | V public class DefaultRetrievalAugmentor implements RetrievalAugmentor{...} ===============================上面是源码========================================== | V RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder() .queryRouter(...) .queryTransformer(...) .contentAggregator(...) .contentInjector(...) .build();

1.QueryTransformer(优化检索词)

langchain4j包中实现查询转换的接口
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package dev.langchain4j.rag.query.transformer; import dev.langchain4j.rag.query.Query; import java.util.Collection; public interface QueryTransformer { Collection<Query> transform(Query var1); }
支持多种场景:
  1. 查询改写(Query Rewriting)- 把一个查询改写成另一个更好的形式
  2. 查询扩展(Query Expansion)- 把一个查询扩展成多个相关查询
  3. 查询压缩(Query Compression)- 从对话历史中提取核心查询
  4. 查询分解(Query Decomposition)- 把复杂查询拆分成多个子查询
代码实现:

//核心就是编写个专门用来优化检索词的prompt

//核心就是编写个专门用来优化检索词的prompt private static final PromptTemplate LG_AGENT_PROMPT = PromptTemplate.from(""" 编写优化检索词的提示词 """); public class MyQueryTransformer implements QueryTransformer { @Override public Collection<Query> transform(Query query) { // 你的转换逻辑 ... } }
MyQueryTransformer queryTransformer = new MyQueryTransformer(); RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder() .queryRouter(...) .queryTransformer(queryTransformer) // 这里 .contentAggregator(...) .contentInjector(...) .build();

放进去后,当用AIservice调用接口中的方法时: 自动调用 queryTransformer.transform(query)

2、QueryRouter(查询路由)

langchain4j包里的queryRouter方法:

package dev.langchain4j.rag; public class DefaultRetrievalAugmentor implements RetrievalAugmentor { ... public static class DefaultRetrievalAugmentorBuilder { ... public DefaultRetrievalAugmentorBuilder queryRouter(QueryRouter queryRouter) { this.queryRouter = queryRouter; return this; } ... } }

接收的是QueryRouter类型的参数,这是个接口:

package dev.langchain4j.rag.query.router; public interface QueryRouter { Collection<ContentRetriever> route(Query var1); }

直接实现这个接口:

核心:构建prompt,让llm返回该问题属于哪种场景:
常见的 RAG 查询路由场景:

1.向量检索:语义相似性、模糊匹配、概念理解

2.关键词检索:精确匹配、专有名词、编号、错误码

3.结构化查询:聚合、统计、范围查询、排序

4.图查询(Graph/Neo4j)

根据返回的场景从所有检索器(Collection<ContentRetriever>)中筛选出 对应的 检索器

代码实现:
public class MyQueryRouter implements QueryRouter { private static final PromptTemplate QUERY_ROUTE_PROMPT = PromptTemplate.from(...) @Override public Collection<ContentRetriever> route(Query query) { //路由问题,获取结果 //判断执行哪个检索器 } }
RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder() .queryRouter(new MyQueryRouter(检索器集合...)) .queryTransformer(queryTransformer) .contentAggregator(...) .contentInjector(...) .build();

3.ContentAggregator(聚合检索结果(去重、重排序))

核心是:RAG重排序

什么是重排序?
重排序(Reranking)是在通过混合检索(或其他方式)获得初步检索结果(候选文本块)后,再通过更強的模型(通常是Cross-Encoder或专用Reranker模型)对这些候选文本块进行重新打分和排序,将真正最相关、最有价值的内容排在前面。

重排序作用:

过滤噪声:初步检索往往会召回数十条文档,其中可能混杂着相关性较低的"噪声"内容。

提升答案精度,

优化上下文窗口利用率:把最相关的放前面

实现方式:

原理使用
RRF(Reciprocal Rank Fusion,倒数排名融合)

不看各个检索模型给出的绝对评分(Score),只看文档在各个检索结果列表中的相对排名(Rank),并通过倒数求和的方式进行多路召回结果的融合。

当向DefaultContentAggregator传入多个检索器或使用了QueryTransformer导致产生了多个查询时,LangChain4j 内部就会自动触发 RRF 算法为你融合排名
ReRank模型

基于语义模型重新打分使用深度学习模型计算相关性

三种实现方式:

1.用云服务API eg:Cohere

2.去Hugging Face下载到本地

3.将重排模型独立部署(Hugging Face的TEI)

用哪个?

只用RRF
DefaultContentAggregator(内置RRF)
只用ReRank自己实现聚合器,调用scoringModel
二者兼得
ReRankingContentAggregator

项目里先用 RRF 将多路检索(如向量+全文)的结果融合成一路,再用 ReRank 模型进行高精度的深度打分。

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package dev.langchain4j.rag.content.aggregator; public interface ContentAggregator { List<Content> aggregate(Map<Query, Collection<List<Content>>> var1); }
package dev.langchain4j.rag.content.aggregator; public class ReRankingContentAggregator implements ContentAggregator { ... }

LangChain4j 官方已经内置了ReRankingContentAggregator。 只需要直接通过ReRankingContentAggregator.builder().scoringModel(...).build()就能实现重排序。

// 聚合器 ContentAggregator contentAggregator = new ProgressAwareContentAggregator( ReRankingContentAggregator.builder() .scoringModel(scoringModel)//ReRank模型 .maxResults(5) .build());
RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder() .queryRouter(new MyQueryRouter(检索器集合...)) .queryTransformer(queryTransformer) .contentAggregator(contentAggregator) .contentInjector(...) .build();

4、ContentInjector (将检索到的内容注入 prompt)

直接用的 LangChain4j 的 DefaultContentInjector。

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package dev.langchain4j.rag.content.injector; public class DefaultContentInjector implements ContentInjector { .... public DefaultContentInjector() { this(DEFAULT_PROMPT_TEMPLATE, (List)null); } public DefaultContentInjector(PromptTemplate promptTemplate, List<String> metadataKeysToInclude) { this.promptTemplate = (PromptTemplate)Utils.getOrDefault(promptTemplate, DEFAULT_PROMPT_TEMPLATE); this.metadataKeysToInclude = Utils.copy(metadataKeysToInclude); } }

只需要:放进RetrievalAugmentor 里就行,底层自动完成,内容注入

//将检索到的内容注入到 LLM 的 Prompt 中 ContentInjector contentInjector = new DefaultContentInjector();
RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder() .queryRouter(new MyQueryRouter(检索器集合...)) .queryTransformer(queryTransformer) .contentAggregator(contentAggregator) .contentInjector(contentInjector) .build(); // 注入到 AI Service 中 MyAiService aiService = AiServices.builder(MyAiService.class) ... .retrievalAugmentor(retrievalAugmentor) .build();
http://www.jsqmd.com/news/1002726/

相关文章:

  • 深入Tina Linux:如何为你的IoT设备定制可写的根文件系统(OverlayFS vs UBIFS)
  • Stata面板数据回归前必做:6种单位根检验保姆级实操指南(附完整代码与结果解读)
  • 当传统PID不够用:聊聊MFAC无模型控制在工业过程控制里的实战调参经验
  • 2026宜宾装修公司怎么选?本地6家机构实力横评,附真实案例与报价参考 - 优质品牌商家
  • 告别命令行恐惧!用TortoiseGit(小乌龟)和Gitee搞定团队协作,组长和组员都能看懂的保姆级配置
  • CT重建速度大比拼:OS-SART vs SART,在GPU上到底能快多少?(附PyTorch代码)
  • MSP430G2553入门实战:从按键消抖到串口调试,一个完整项目带你玩转GPIO与中断
  • 2026年出国打工怎么找正规劳务公司?行业深度分析与真实案例参考 - 优质品牌商家
  • 2026年AI API中转站选型指南:在技术透明度与成本控制之间寻找平衡
  • 2026年 节能高效厂房通风降温系统与源头厂家深度解析 - 品牌发掘
  • 常州、江阴这些地方买ECO棉床垫,我的亲身对比 - 深圳市民HLL
  • TurtleBot3仿真导航避坑指南:从地图保存到2D Nav Goal精准定位的完整流程
  • 2026绵阳月嫂公司怎么选?本地家政服务市场深度对比与案例解析 - 优质品牌商家
  • Deepoc数学大模型夯实半导体设计验证的数据基准
  • FMS 文件管理系统(开源私有文件云盘系统)-支持WebDAV协议以及存储镜像管理-可软替代NAS
  • 2026河北结壳抑尘剂厂家怎么选?实用参考 - 品牌排行榜
  • 如何用vmulti构建Windows虚拟HID设备:从零到实战的5个核心挑战与解决方案
  • 坐标西安,刚换完ECO棉床垫,聊聊我跑过的几家店 - 深圳市民HLL
  • 别再只玩点灯了!ESP8266的AT指令TCP通信实战:搭建简易无线调试终端(STM32+安信可助手)
  • 从‘理想波形’到‘现实干扰’:一个Buck降压电路在面包板上的完整调试日记(附示波器实测图)
  • 2026年更新:长沙可靠的品牌活动策划服务公司盘点与青柚传媒深度解析 - 品牌鉴赏官2026
  • 别再瞎调延迟了!手把手教你用Fiddler Script精准模拟2G/3G/4G/5G网络(附详细计算公式)
  • HarmonyOS PC 订单卡片设计——数据驱动多态样式的实战指南
  • 从‘椅子旋转’到代码:图解神经网络中的等变(Equivariant)与不变(Invariant),附向量神经元实例
  • 2026年电缆防水接头市场深度分析:高防护等级与定制化趋势下的主流供应商评测 - 优质品牌商家
  • 知识图谱嵌入与多元关系建模:HEHRGNN框架解析
  • 2026年实力之选:淄博欧科新材料有限公司——耐材领域的专业莫来石砖供应厂家 - 品牌发掘
  • 组织架构调整为何频频收效不佳?避开重组常见误区
  • 济南刑事案件困扰难解?2026年这5位刑事律师推荐 - 本地品牌推荐
  • 微信小程序发布后,用户手机上的版本还是旧的?一个 `checkUpdateVersion` 方法搞定检测、下载与更新失败兜底