一、简介二、代码SimpleLoggerAdvisor日志拦截器SafeGuardAdvisor敏感词拦截器MessageChatMemoryAdvisor自动维护会话上下文QuestionAnswerAdvisor检索拦截器RAG 把知识库内容塞到 prompt。SimpleLoggerAdvisor 日志拦截器打印出入参。ChatClient.builder(deepSeekChatModel).defaultSystem(默认系统提示词).defaultAdvisors(newSimpleLoggerAdvisor()).build();application.propertieslogging.level.org.springframework.ai.chat.client.advisor DEBUGSafeGuardAdvisor 敏感词拦截器当会话中出现敏感词终止整条调用链路不会调用大模型不会继续执行后面其他 Advisor直接返回预设拒绝文本。ChatClient.builder(deepSeekChatModel).defaultSystem(默认系统提示词).defaultAdvisors(newSafeGuardAdvisor(List.of(草泥马))).build();自定义拦截器自定义一个更改用户提示词的示例更改用户的输入提示词。getOrder(): 执行顺序数字越小越优先执行before(): 调用 LLM之前 修改 Requestafter(): LLM 返回之后修改 Responseimportorg.springframework.ai.chat.client.AdvisorChain;importorg.springframework.ai.chat.client.BaseAdvisor;importorg.springframework.ai.chat.client.ChatClientRequest;importorg.springframework.ai.chat.client.ChatClientResponse;importorg.springframework.ai.chat.messages.UserMessage;importorg.springframework.ai.chat.prompt.PromptTemplate;importjava.util.Map;/** * 自定义Advisor修改/增强用户提示词 * 作用在请求发送给LLM之前改写用户的UserMessage内容 */publicclassReReadingAdvisorimplementsBaseAdvisor{privatestaticfinalStringDEFAULT_USER_TEXT_ADVISE {re2_input_query} Read the question again: {re2_input_query} ;/** * before调用大模型【之前】执行修改用户prompt */OverridepublicChatClientRequestbefore(ChatClientRequestchatClientRequest,AdvisorChainadvisorChain){// 获取原始用户输入StringinputQuerychatClientRequest.prompt().getUserMessage().getText();// 模板渲染填充占位符StringaugmentedUserTextPromptTemplate.builder().template(DEFAULT_USER_TEXT_ADVISE).render(Map.of(re2_input_query,inputQuery));// 构造新用户消息mutate复制新request原对象不可修改UserMessagenewUserMessagenewUserMessage(augmentedUserText);ChatClientRequestnewRequestchatClientRequest.mutate().userMessage(newUserMessage).build();// 将修改后的请求继续交给链路returnadvisorChain.nextAroundCall(newRequest);}/** * after大模型返回结果【之后】执行需求不做处理直接原样返回response */OverridepublicChatClientResponseafter(ChatClientResponsechatClientResponse,AdvisorChainadvisorChain){// 无任何业务逻辑直接原样返回响应returnchatClientResponse;}OverridepublicintgetOrder(){return0;}}BeanpublicChatClientchatClient(DashScopeChatModeldashScopeChatModel){returnChatClient.builder(dashScopeChatModel).defaultAdvisors(newReReadingAdvisor()).build();}