Spring AI 系列2: Advisors增强器简介

article/2025/8/15 18:51:55

一、Advisors简介

1.1 Advisors定义

Advisors 是在 AI 应用程序中处理请求和响应的拦截器。我们可以使用它们为提示流程设置额外的功能。例如,可以建立聊天历史、排除敏感词或为每个请求添加额外的上下文。        

Spring AI的Advisor,本质上是一个拦截器,专门负责在AI模型的请求和响应流中“搞事情”——动态修改输入、增强输出,甚至中途拦截敏感请求。它就像给AI应用装了个“智能管家”,既能帮你处理重复性工作(比如记录聊天历史),又能让模型回答更精准(比如结合知识库检索)。

1.2 Advisors核心功能

  • 拦截请求:在用户问题发送给AI模型前,Advisor可以修改问题或添加上下文(比如加一句“深呼吸,慢慢想”)。

  • 增强响应:在模型返回答案后,Advisor可以格式化结果(比如将字符串转为JSON)或添加安全校验。

  • 链式处理:多个Advisor像流水线一样串联,每个环节都能对数据动手脚。

适用场景:聊天记忆管理、敏感词过滤、知识库检索(RAG)、日志记录等。

1.3  附加或增强带有上下文数据的提示,让模型回答更精准

在调用带有用户文本的 AI 模型时,一个常见的模式是附加或增强带有上下文数据的提示,这种上下文数据可以是不同类型。常见类型包括:

您自己的数据

这是 AI 模型尚未训练过的数据。即使模型见过类似的数据,附加的上下文数据在生成响应时也会优先考虑。

对话历史

聊天模型的 API 是无状态的。如果您告诉 AI 模型您的名字,它不会在后续交互中记住它。必须随每个请求发送对话历史,以确保在生成响应时考虑先前的交互。

1.4  Advisor 接口

Advisors API提供了一种灵活而强大的方式来拦截、修改和增强 Spring 应用程序中的 AI 驱动交互。该功能的核心组件是 CallAroundAdvisor 接口。我们通过实现该接口来创建 Advisor 链,从而影响我们的请求或响应。我们会将提示(prompt)发送到一个聊天模型,该模型关联了一个 Advisor 链。在发送提示之前,链上的每个 Advisor 都会执行其 before 操作。同样,在收到聊天模型的回复之前,每个 Advisor 都会调用自己的 after 操作。

ChatClient 流畅 API 提供了 AdvisorSpec 接口用于配置 advisors。这个接口提供了添加参数、一次设置多个参数以及向链中添加一个或多个 advisors 的方法。

interface AdvisorSpec {AdvisorSpec param(String k, Object v);AdvisorSpec params(Map<String, Object> p);AdvisorSpec advisors(Advisor... advisors);AdvisorSpec advisors(List<Advisor> advisors);
}

advisors 添加到链中的顺序至关重要,因为它决定了它们的执行顺序。每个 advisor 都以某种方式修改提示或上下文,一个 advisor 所做的更改会传递给链中的下一个。

ChatClient.builder(chatModel).build().prompt().advisors(MessageChatMemoryAdvisor.builder(chatMemory).build(),QuestionAnswerAdvisor.builder(vectorStore).build()).user(userText).call().content();

在此配置中,MessageChatMemoryAdvisor 将首先执行,将对话历史添加到提示中。然后,QuestionAnswerAdvisor 将基于用户的问题和添加的对话历史执行其搜索,可能会提供更相关的结果。


二、增强器 API

Spring AI 增强器 API 提供了一种灵活而强大的方式来拦截、修改和增强 Spring 应用程序中的 AI 驱动交互。 通过利用增强器 API,开发者可以创建更复杂、可重用和可维护的 AI 组件。主要优势包括封装重复出现的生成式 AI 模式、转换发送到大型语言模型(LLM) 的数据,以及提供跨各种模型和用例的可移植性。

可以使用 ChatClient API
 配置现有增强器,如下例所示:

var chatClient = ChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(), // chat-memory 增强器QuestionAnswerAdvisor.builder((vectorStore).build() // RAG 增强器).build();var conversationId = "678";String response = this.chatClient.prompt()// 在运行时设置增强器参数	.advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, conversationId)).user(userText).call().content();

建议在构建时使用 builder 的 defaultAdvisors() 方法注册增强器。

2.1 核心组件

API 包含用于非流式场景的 CallAroundAdvisor 和 CallAroundAdvisorChain,以及用于流式场景的 StreamAroundAdvisor 和 StreamAroundAdvisorChain。 它还包括 AdvisedRequest 用于表示未密封的 Prompt 请求,AdvisedResponse 用于 Chat Completion 响应。两者都包含一个 advise-context 用于在增强器链中共享状态。

2.2 Advisors API 类

nextAroundCall() 和 nextAroundStream() 是关键增强器方法,通常执行诸如检查未密封的 Prompt 数据、自定义和增强 Prompt 数据、调用增强器链中的下一个实体、可选地阻止请求、检查聊天完成响应以及抛出异常以指示处理错误等操作。

此外,getOrder() 方法确定增强器在链中的顺序,而 getName() 提供唯一的增强器名称。

由 Spring AI 框架创建的增强器链允许按 getOrder() 值排序的多个增强器顺序调用。 较低的值首先执行。 最后一个增强器(自动添加)将请求发送到 LLM。

以下流程图说明了增强器链与聊天模型之间的交互:

Advisors API 流程

2.3 API 概述

主要增强器接口位于包 org.springframework.ai.chat.client.advisor.api 中。以下是创建自己的增强器时会遇到的关键接口

public interface Advisor extends Ordered {String getName();
}

同步和响应式增强器的两个子接口是:

public interface CallAroundAdvisor extends Advisor {/*** 环绕通知,包装 ChatModel#call(Prompt) 方法。* @param advisedRequest 建议的请求* @param chain 增强器链* @return 响应*/AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain);
}
public interface StreamAroundAdvisor extends Advisor {/*** 环绕通知,包装建议请求的调用。* @param advisedRequest 建议的请求* @param chain 要执行的增强器链* @return 建议请求的结果*/Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain);
}

要继续建议链,在您的建议实现中使用 CallAroundAdvisorChain 和 StreamAroundAdvisorChain

接口是:

public interface CallAroundAdvisorChain {AdvisedResponse nextAroundCall(AdvisedRequest advisedRequest);
}
public interface StreamAroundAdvisorChain {Flux<AdvisedResponse> nextAroundStream(AdvisedRequest advisedRequest);
}

2.4 实现增强器

要创建增强器,实现 CallAroundAdvisor 或 StreamAroundAdvisor(或两者)。要实现的关键方法是用于非流式的 nextAroundCall() 或用于流式增强器的 nextAroundStream()

下面将提供一些实践示例来说明如何实现用于观察和增强用例的增强器。

(1)日志增强器

我们可以实现一个简单的日志增强器,在调用链中的下一个增强器之前记录 AdvisedRequest,之后记录 AdvisedResponse。 注意,增强器只观察请求和响应,不修改它们。 此实现同时支持非流式和流式场景。

public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class);@Overridepublic String getName() { // (1)return this.getClass().getSimpleName();}@Overridepublic int getOrder() { // (2)return 0; }@Overridepublic AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {logger.debug("BEFORE: {}", advisedRequest);AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);logger.debug("AFTER: {}", advisedResponse);return advisedResponse;}@Overridepublic Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {logger.debug("BEFORE: {}", advisedRequest);Flux<AdvisedResponse> advisedResponses = chain.nextAroundStream(advisedRequest);return new MessageAggregator().aggregateAdvisedResponse(advisedResponses, advisedResponse -> logger.debug("AFTER: {}", advisedResponse)); // (3)}
}
  1. 为增强器提供唯一名称。

  2. 您可以通过设置顺序值来控制执行顺序。较低的值首先执行。

  3. MessageAggregator 是一个实用类,将 Flux 响应聚合为单个 AdvisedResponse。这对于记录或观察整个响应而不是流中的单个项目的其他处理很有用。注意,您不能在 MessageAggregator 中修改响应,因为它是只读操作。

(2)重读 (Re2) 增强器

“Re-Reading Improves Reasoning in Large Language Models” 文章介绍了一种称为重读 (Re2) 的技术,可以提高大型语言模型的推理能力。 Re2 技术要求像这样增强输入提示:

{Input_Query}
Read the question again: {Input_Query}

实现一个将 Re2 技术应用于用户输入查询的增强器可以这样做:

public class ReReadingAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {private AdvisedRequest before(AdvisedRequest advisedRequest) { // (1)Map<String, Object> advisedUserParams = new HashMap<>(advisedRequest.userParams());advisedUserParams.put("re2_input_query", advisedRequest.userText());return AdvisedRequest.from(advisedRequest).userText("""{re2_input_query}Read the question again: {re2_input_query}""").userParams(advisedUserParams).build();}@Overridepublic AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) { // (2)return chain.nextAroundCall(this.before(advisedRequest));}@Overridepublic Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) { // (3)return chain.nextAroundStream(this.before(advisedRequest));}@Overridepublic int getOrder() { // (4)return 0; }@Overridepublic String getName() { // (5)return this.getClass().getSimpleName();}
}
  1. before 方法通过应用重读技术增强用户的输入查询。

  2. aroundCall 方法拦截非流式请求并应用重读技术。

  3. aroundStream 方法拦截流式请求并应用重读技术。

  4. 您可以通过设置顺序值来控制执行顺序。较低的值首先执行。

  5. 为增强器提供唯一名称。


三、Spring AI 内置增强器

Spring AI 框架提供了几个内置增强器来增强您的 AI 交互。以下是可用增强器的概述:

3.1 聊天内存增强器

这些增强器在聊天内存存储中管理对话历史:

MessageChatMemoryAdvisor

检索内存并将其作为消息集合添加到提示中。这种方法保持了对话历史的结构。注意,并非所有 AI 模型都支持这种方法。

PromptChatMemoryAdvisor

检索内存并将其合并到提示的系统文本中。

VectorStoreChatMemoryAdvisor

从 VectorStore 检索内存并将其添加到提示的系统文本中。此增强器对于从大型数据集中高效搜索和检索相关信息很有用。

3.2 QuestionAnswerAdvisor 问题回答增强器

此增强器使用向量存储来提供问答功能,实现 RAG(检索增强生成)模式。

3.3  SafeGuardAdvisor 内容安全增强器 

一个简单的增强器,旨在防止模型生成有害或不适当的内容。

  1. MessageChatMemoryAdvisor

  • 功能:自动记录聊天历史,让AI记住“你刚才说了啥”。

  • 坑点:不是所有模型都支持上下文记忆,用前先查文档。

     2.QuestionAnswerAdvisor

  • 功能:执行RAG(检索增强生成),从知识库中捞答案,让AI不再“一本正经地胡说八道”。

  • 原理:用户提问时,先检索相似文本,拼接到提示词中。

    3.SafeGuardAdvisor

  • 功能:敏感词拦截器,遇到“颜色内容”直接打断施法,保护应用合规性

   4.VectorStoreChatMemoryAdvisor

  • 功能:将聊天记录存入向量数据库,实现长期记忆,但需小心chat_memory_conversation_id管理不当引发“数据海啸”。


四、流式与非流式

增强器流式与非流式流程

  • 非流式增强器处理完整的请求和响应。

  • 流式增强器将请求和响应作为连续流处理,使用响应式编程概念(例如,用于响应的 Flux)。

实现带有阻塞和非阻塞代码的流式增强器的示例:

@Override
public Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {return  Mono.just(advisedRequest).publishOn(Schedulers.boundedElastic()).map(request -> {// 这可以由阻塞和非阻塞线程执行。// 增强器在下一个部分之前}).flatMapMany(request -> chain.nextAroundStream(request)).map(response -> {// 增强器在下一个部分之后});
}

注意事项:

专注责任

保持增强器专注于特定任务以获得更好的模块化。

共享状态

必要时使用 adviseContext 在增强器之间共享状态。

支持两种模式

实现增强器的流式和非流式版本以获得最大灵活性。

考虑顺序

仔细考虑增强器在链中的顺序以确保正确的数据流。


参考链接:

Spring AI Advisor 指南 - spring 中文网

如何用Spring AI的Advisor,让AI应用像“瑞士军刀”一样灵活?

Spring AI SafeGuardAdvisor-CSDN博客


http://www.hkcw.cn/article/NjUsSnmXXH.shtml

相关文章

毕业前最后1堂课学生偷偷为老师准备惊喜 青春完美闭环

毕业前最后一课,学生偷偷准备惊喜,360度运镜是青春完美闭环。近日,广东厚街,毕业前最后一堂课,学生偷偷为老师准备惊喜,闪闪发光的不仅是礼花,还有师生之间的真心。网友:360度运镜,是青春完美的闭环。责任编辑:zx0002

团伙侵入某平台刷单骗补50万 警方全链条捣毁犯罪团伙

5月29日,上海警方侦破一起恶意刷单骗取补贴案,全链条捣毁券商、刷手、商户犯罪团伙,抓获犯罪嫌疑人15名。犯罪嫌疑人利用网络技术侵入平台系统后获取大量已下架优惠券,组织刷手、勾结商户虚假下单骗取平台补贴,非法牟利近50万元。2024年底,上海普陀警方接到饿了么负责人报…

美国若向印度提供F-35有何影响?

美国若向印度提供F-35有何影响?近日,美国在讨论是否出售给印度F-35战斗机时,美国国会议员提出警告,千万不要出售F-35战斗机给印度。第一、印度飞行员的训练不足以驾驶F-35战斗机。第二、如果与巴基斯坦开战,如果被击落,价值两万亿美元的F-35计划将彻底消失。这名议员说得…

传统项目管理总拖延?Scrum敏捷全流程拆解

在互联网高速发展的时代&#xff0c;企业竞争的核心要素正逐渐向 "速度" 倾斜。市场环境瞬息万变&#xff0c;用户需求呈现出多元化、动态化的显著特征&#xff0c;而传统管理模式固有的滞后性与僵化性&#xff0c;已难以匹配快速迭代的市场需求。在此背景下&#xf…

金文洙参拜麦克阿瑟铜像 红袍祭祖引热议

金文洙参拜麦克阿瑟铜像 红袍祭祖引热议!74岁的金文洙穿着一件大红色的官服站在墓地前,神情肃穆。乍一看,还以为是哪家新郎官走错了片场。实际上,这是韩国总统候选人金文洙在首露王陵前的祭拜仪式。5月28日,距离韩国大选缺席投票只剩一天,金文洙来到庆尚南道金海市,对着…

碱水粽 传统工艺的独特魅力

碱水粽 传统工艺的独特魅力!端午节的粽子种类越来越丰富,其中碱水粽子深受许多老一辈人的喜爱。在众多粽子中,碱水粽以其金黄透亮、软糯弹牙的独特口感脱颖而出。这种独特口感的关键在于传统工艺制作的天然碱水。制作碱水的原料主要有两种:稻草秸秆和黄荆枝叶。稻草秸秆是农…

Baklib内容中台与企业内容管理区别在哪?

Baklib技术架构优势解析 区别于传统企业内容管理工具侧重文档存储的单一模式&#xff0c;Baklib基于动态知识图谱与统一元数据架构构建智能内容中枢&#xff0c;通过全渠道发布引擎实现多源异构数据的实时映射与语义关联。其技术内核采用模块化设计&#xff0c;支持API接口快速…

男子离珠峰顶仅400米折返救陌生人 打破8000米以上无救援惯例

5月24日9点17分,范江涛登上了珠穆朗玛峰顶。这是他第二次挑战世界最高峰,终于成功登上8848米的巅峰。2023年5月18日,在距离珠峰峰顶仅400米处,范江涛放弃登顶,救下了一名中国登山遇险者,打破了国际登山界“8000米以上无救援”的惯例。救援后,因费用问题在网络上引起争议…

高质量发展看能源 探访大湾区最大新型储能电站

高质量发展看能源 探访大湾区最大新型储能电站!5月28日,“高质量发展能源行”调研团来到广东佛山,探访粤港澳大湾区最大新型储能电站和广东顺德川崎汽车产业园区近零碳示范区,深入了解能源低碳转型对经济社会绿色发展的推动作用。在广州佛山之间、北江之畔的宝塘电网侧独立…

男子狂骗亲友1200万后自杀 虚假生活背后的真相

男子狂骗亲友1200万后自杀 虚假生活背后的真相!一位看似事业有成、生活光鲜的年轻人,在长达七年的时间里,通过虚假承诺和编造的谎言欺骗了信任他的同学、客户乃至网友。他非法敛财达1200余万元。这位名叫彭某的男子三十多岁,表面上有着稳定体面的工作及温柔的女友,但这一切…

C++ 初阶 | 类和对象易错知识点(下)

目录 0.引言 1.初始化列表 2.static 静态成员变量&#xff1a; 静态成员函数&#xff1a; 3.友元函数 4.内部类 定义&#xff1a; 特点&#xff1a; 应用&#xff1a; 5.优化写法 6.例题 求和12...n (不能用for/while/if/else等关键字) 7.总结 0.引言 今天&…

马斯克打工128天裁员超10万人 特斯拉遇挫引发关注

马斯克打工128天裁员超10万人 特斯拉遇挫引发关注!当地时间5月28日,全球首富埃隆马斯克在社交平台上宣布,他将正式离开特朗普政府。截至当天,马斯克在美国“政府效率部”的任期已满128天。一名白宫官员证实了这一消息,并称马斯克将于当晚开始办理离职程序,主要包括文书工…

如何在CAD中利用LISP脚本根据一圈轮廓线自动生成一圈点?

我们在工作中可能会遇到这种CAD多段线&#xff1a; 它是一圈闭合的轮廓线&#xff0c;并没有点要素。现在需要生成一圈点&#xff0c;使这一圈点围成的轮廓与已有的多段线轮廓一致&#xff0c;并且要求生成点的数量与多段线各拐角点的数量一致。该如何快速实现&#xff1f; 这…

在Halcon中集成YOLO模型的步骤与注意事项

背景 在 Halcon 中集成 YOLO 的本质是传统视觉与深度学习的融合&#xff0c;既能保留 Halcon 在高精度测量、流程控制上的优势&#xff0c;又能借助 YOLO 解决复杂场景下的目标检测问题。这种组合尤其适合需要快速迭代、处理非结构化数据或对实时性有要求的应用场景&#xff0…

警犬找回走失42小时男童 生死救援成功

5月27日13时许,经过42小时持续搜救,重庆市公安局刑侦总队警犬追踪小组成功找到走失的2岁男童兵兵。在这场与时间赛跑的生死救援中,警犬技术再次发挥了关键作用。5月25日20时21分,綦江区公安局接到报警称石角镇下湾村一名2岁的男童兵兵走失。属地警方立即启动应急预案,组织…

全球稳定币风起 有何影响 监管与市场齐动

全球范围内,稳定币的风潮似乎一夜之间兴起。中国香港立法会通过了《稳定币条例草案》,设立法币稳定币发牌制度,预计今年底前机构可向香港金融管理局申请成为合规的稳定币发行商。美国参议院通过《GENIUS法案》,标志着稳定币立法过程中的重要进展。该法案旨在为与美元挂钩的…

哈佛校长毕业致辞获30秒热烈鼓掌 暗讽特朗普政策引共鸣

哈佛校长毕业致辞获30秒热烈鼓掌 暗讽特朗普政策引共鸣!当地时间5月29日,美国法官暂停了特朗普政府此前宣布的取消哈佛大学招收外国学生资质的政策。这项裁决为哈佛大学带来了暂时的胜利。同一天,哈佛大学校长艾伦加伯在毕业典礼上巧妙地讽刺了特朗普政府对大学的打压,获得…

leetcode hot100刷题日记——26.环形链表

解答&#xff1a;(快慢指针&#xff0c;他俩在环里肯定会有相遇的时候) class Solution { public:bool hasCycle(ListNode *head) {ListNode *slowhead;ListNode *fasthead;while(fast&&fast->next){slowslow->next;fastfast->next->next;if(slowfast){re…

女婴术后致瘫,医生被指6分钟无作为,检察官称哪条法律要医生马上急救

台湾台中市2岁多女婴在两个多月接连进行两次腹部手术,却在第二次手术时因缺氧而导致全身瘫痪变植物人。家长控诉,术后向医院询问未获合理回应,2023年11月起诉后才发现,手术中从送进手术室到麻醉师接手竟有6分钟无人处理,后续急救超35分钟仍因缺氧致瘫。家长每日以泪洗面,…

“车圈恒大论”之下汽车行业谁焦虑 负债结构引关注

长城汽车董事长魏建军关于“汽车行业的‘恒大’已经出现,只不过没爆”的言论,引发了市场广泛关注。这一观点不仅反映了新能源转型过程中部分企业的焦虑,也促使人们重新审视车企的资产负债结构和盈利能力等核心问题。将汽车行业简单类比于房地产高杠杆模式存在显著偏差。作为…