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;
}
}
结果: 涉及到过滤词 直接拦截返回 不会去请求大模型
