Spring AI Alibaba Advisor如何实现拦截?

摘要:SpringAI利用面向切面的思想提供Advisors API,它提供了灵活而强大的方法来拦截、修改和增强Spring应用程序中的AI驱动交互。 引用: org.springframework.ai:spring-
SpringAI利用面向切面的思想提供Advisors API,它提供了灵活而强大的方法来拦截、修改和增强Spring应用程序中的AI驱动交互。 引用:org.springframework.ai:spring-ai-client-chat 包(spring ai 包自带) Advisor 分两种 一种 adviseCall 对应 chatclient.prompt().call() 一种 adviseStream 对应 chatclient.prompt().stream() //流式输出 一。对话拦截实现日志记录 请求 @RestController @RequestMapping("/advise") public class AdviseController { private final ChatClient chatClient; public AdviseController(ChatClient.Builder builder) { this.chatClient = builder .defaultAdvisors(new SimpleLoggerAdvisor()) //SimpleLoggerAdvisor 内置日志拦截记录 全局默认拦截配置 .build(); } @GetMapping("/chat") public String chat(@RequestParam(value = "input") String input) { String content= this.chatClient.prompt() .user(input) //.advisors() //单个拦截配置 .call() .content(); System.out.println(content); return content; } } 结果 request: AdvisedRequest[chatModel=org.springframework.ai.ollama.OllamaChatModel@1f6069a8, userText=我是谁, systemText=null, chatOptions=org.springframework.ai.ollama.api.OllamaOptions@a3c29623, media=[], functionNames=[], functionCallbacks=[], messages=[], userParams={}, systemParams={}, advisors=[org.springframework.ai.chat.client.DefaultChatClient$DefaultChatClientRequestSpec$1@10a1117b, org.springframework.ai.chat.client.DefaultChatClient$DefaultChatClientRequestSpec$2@5db795d4, SimpleLoggerAdvisor, org.springframework.ai.chat.client.DefaultChatClient$DefaultChatClientRequestSpec$1@512b60e7, org.springframework.ai.chat.client.DefaultChatClient$DefaultChatClientRequestSpec$2@4d9a6e43], advisorParams={}, adviseContext={}, toolContext={}] 2026-04-14T10:35:39.622+08:00 DEBUG 28608 --- [spring-ai] [nio-5050-exec-1] o.s.a.c.c.advisor.SimpleLoggerAdvisor : response: { "result" : { "metadata" : { "finishReason" : "stop", "contentFilters" : [ ], "empty" : true }, "output" : { "messageType" : "ASSISTANT", "metadata" : { "messageType" : "ASSISTANT" }, "toolCalls" : [ ], "media" : [ ], "text" : "我是阿里云的Qwen模型,属于超大规模语言模型团队。如果您有任何问题或需要帮助,请随时告诉我!" } }, "metadata" : { "id" : "", "model" : "qwen2.5:0.5b-instruct", "rateLimit" : { "tokensRemaining" : 0, "requestsReset" : 0.0, "requestsLimit" : 0, "tokensReset" : 0.0, "tokensLimit" : 0, "requestsRemaining" : 0 }, "usage" : { "promptTokens" : 31, "completionTokens" : 26, "totalTokens" : 57, "generationTokens" : 26 }, "promptMetadata" : [ ], "empty" : false }, "results" : [ { "metadata" : { "finishReason" : "stop", "contentFilters" : [ ], "empty" : true }, "output" : { "messageType" : "ASSISTANT", "metadata" : { "messageType" : "ASSISTANT" }, "toolCalls" : [ ], "media" : [ ], "text" : "我是阿里云的Qwen模型,属于超大规模语言模型团队。如果您有任何问题或需要帮助,请随时告诉我!" } } ] } 二。对话敏感词拦截 请求 @RestController @RequestMapping("/advise") public class AdviseController { private final ChatClient chatClient; public AdviseController(ChatClient.Builder builder) { this.chatClient = builder .defaultAdvisors(new SimpleLoggerAdvisor(),//SimpleLoggerAdvisor 内置日志拦截记录 new SafeGuardAdvisor(List.of("管华夏")) //SafeGuardAdvisor 内置敏感词拦截 全局默认此拦截配置 ) .build(); } @GetMapping("/chat") public String chat(@RequestParam(value = "input") String input) { String content= this.chatClient.prompt() .user(input) // .advisors() //单个拦截配置 覆盖全局默认 .call() .content(); return content; } } 结果: 涉及到过滤词 直接拦截返回 不会去请求大模型