首页 / 资讯中心 / 文章详情

SpringAI的Advisors-用拦截器的思维管Agent

SpringAI的Advisors-用拦截器的思维管Agent ★ FEATURED ARTICLE
Spring AI 的 Advisors用拦截器的思维管 Agent日志要打、记忆要读写、敏感词要拦这些「每次对话都得做」的横切逻辑散在业务代码里就到处都是 if。写过 Spring 的人有现成的思路——拦截器或者 AOP把横切逻辑收到一条链上。Spring AI 的 Advisor 就是把这个思路用在对话循环上这篇先把链看清再亲手写一个护栏 Advisor。Advisor 是什么一次 ChatClient 的调用从请求到响应中间可以挂一串 Advisor每个都能在调用前后插手改请求、查响应、决定要不要放行。接口有两个CallAroundAdvisor 管普通调用StreamAroundAdvisor 管流式签名都是「收请求、交下一棒、收响应」。版本口径先说清核验 2026-10-251.0 之前叫 AdvisedRequest 和 AdvisedResponse1.0 起更名为 ChatClientRequest 和 ChatClientResponse接口名 CallAroundAdvisor 不变。本文按 2.x 口径写。ChatClient 请求Advisor 1日志Advisor 2记忆读写Advisor 3护栏模型最终响应和 AOP 的对照同一个思想两副身位放一起看很清楚。AOP 的代理壳Advisor 链拦的粒度任意 Bean 方法一次对话调用实现形态运行时代理一层壳链式 Around 拦截切点表达注解与切点表达式按顺序挂 Advisor典型用途事务、鉴权记忆、护栏、日志顺序控制OrdergetOrder区别在身位。AOP 站在对象外面套壳Advisor 站在对话循环的路径上排队。写过拦截器的人半小时就能上手这就是那套肌肉记忆带来的复利。写一个护栏 Advisor需求很具体用户消息里出现敏感词就拦下不发给模型。实现就是 Around 的标准形状请求进来先检查不干净就短路干净就交下一棒。importorg.springframework.ai.chat.client.ChatClientRequest;importorg.springframework.ai.chat.client.ChatClientResponse;importorg.springframework.ai.chat.client.advisor.CallAroundAdvisor;importorg.springframework.ai.chat.client.advisor.CallAroundAdvisorChain;publicclassGuardAdvisorimplementsCallAroundAdvisor{privatefinaljava.util.ListStringforbidden;publicGuardAdvisor(java.util.ListStringforbidden){this.forbiddenforbidden;}OverridepublicChatClientResponsenextAroundCall(ChatClientRequestrequest,CallAroundAdvisorChainchain){StringuserTextString.valueOf(request.prompt().getUserMessage());for(Stringword:forbidden){if(userText.contains(word)){// 短路不交下一棒直接返回兜底响应returnnewChatClientResponse(request.prompt().augmentSystemMessage(请求被拦截包含敏感内容。),java.util.Map.of());}}returnchain.nextAroundCall(request);// 干净就放行}OverridepublicStringgetName(){returnGuardAdvisor;}OverridepublicintgetOrder(){return0;// 数字小的先执行}}挂上去一行链就生效。StringanswerchatClient.prompt().user(userMessage).advisors(newGuardAdvisor(java.util.List.of(违禁词))).call().content();构造 ChatClientResponse 的具体签名随小版本微调以你所用版本的文档为准拦截与放行的控制流是稳的。内置的那些Spring AI 自带一批现成的 Advisor最常用的是记忆类把对话历史的读写挂进链里和「记忆落库」那篇的活对应只是位置从你的业务代码挪到了链上。日志类的 Advisor 把请求响应的来龙去脉打进日志是排查工单问题时的第一手资料。用法都是同一个动作往链上挂顺序靠 getOrder。顺序有个类比可以记请求像过滤器链一样按 order 从小到大走响应回来逆序再走一遍先挂的后拆。记住一句话横切逻辑住在链上业务代码只写业务。适用边界这一篇讲 Advisor 的机制与护栏实例。流式的 StreamAroundAdvisor、Advisor 的错误处理与重试以及把「记忆落库」整篇改造成 Advisor 形态都是另外的题。接口签名按 2026-10-25 的 2.x 口径整理从 1.x 迁移过来的项目注意更名。跑完护栏这个例子把项目里散落各处的日志和校验挨个搬上链搬完的那一刻你的 agent 代码和你的 Spring 代码就干净成同一种干净。
阅读完成 · 觉得有帮助?
咨询建站