AI 超级智能体项目——自定义违禁词校验Advisor
SensitiveWordAdvisor.java
▼java复制代码import org.springframework.ai.chat.client.ChatClientRequest; import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.CallAdvisor; import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain; import org.springframework.ai.chat.client.advisor.api.StreamAdvisor; import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain; import reactor.core.publisher.Flux; import java.util.List; import java.util.Map; public class SensitiveWordAdvisor implements CallAdvisor, StreamAdvisor { // 简单的敏感词列表 private static final List<String> SENSITIVE_WORDS = List.of( "敏感词", "暴力", "色情", "赌博", "毒品" ); @Override public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) { Boolean hasSensitiveWords = containsSentitiveWords(chatClientRequest.prompt().getUserMessage().getText()); if (hasSensitiveWords){ ChatClientResponse chatClientResponse = ChatClientResponse.builder() .chatResponse(null) .context(Map.of("message","检测到敏感词,请重新输入")) .build(); return chatClientResponse; } else { ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest); return chatClientResponse; } } @Override public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) { Boolean hasSensitiveWords = containsSentitiveWords(chatClientRequest.prompt().getUserMessage().getText()); if (hasSensitiveWords){ ChatClientResponse chatClientResponse = ChatClientResponse.builder() .chatResponse(null) .context(Map.of("message","检测到敏感词,请重新输入")) .build(); return Flux.just(chatClientResponse); }else { return streamAdvisorChain.nextStream(chatClientRequest); } } @Override public String getName() { return this.getClass().getSimpleName(); } @Override public int getOrder() { return 0; } private Boolean containsSentitiveWords(String text) { if (text == null || text.isEmpty()){ return false; } for (String sensitiveWord : SENSITIVE_WORDS) { if (text.contains(sensitiveWord)){ return true; } } return false; } }
实现自定义Advisor的核心就是实现CallAdvisor和StreamAdvisor两个接口,重写adviseStream()和adviseCall()两个方法。
LoveApp.java
▼java复制代码@Component @Slf4j public class LoveApp { private ChatClient chatClient; private static final String SYSTEM_PROMPT = "you are a helpful assistant"; public LoveApp(ChatModel dashscopeChatModel, JdbcChatMemoryRepository chatMemoryRepository){ ChatMemory chatMemory = MessageWindowChatMemory.builder() .chatMemoryRepository(chatMemoryRepository) .maxMessages(10) .build(); ChatClient.Builder builder = ChatClient.builder(dashscopeChatModel); chatClient = builder.defaultSystem(SYSTEM_PROMPT) .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(), new SensitiveWordAdvisor(), new MyLoggerAdvisor()) .build(); } public String doChatWithSensitiveWords(String userInput, String chatId){ ChatClientResponse chatClientResponse = chatClient.prompt() .user(userInput) .advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, chatId)) .call() .chatClientResponse(); ChatResponse chatResponse = chatClientResponse.chatResponse(); if (chatResponse == null){ return chatClientResponse.context().get("message").toString(); } else { Object message = chatClientResponse.context().get("message"); return message != null ? message.toString() : "未知错误"; } } }
经过debug发现,如果没有特意设置advisor的order值的话(都是0),那么Spring AI 会按照注册顺序的逆序来处理请求和响应。在该代码中,会先由MyLoggerAdvisor处理请求,再由SensitiveWordAdvisor处理请求,再由SensitiveWordAdvisor处理响应,最后由MyLoggerAdvisor处理响应。 MyLoggerAdvisor应该要放到最后(即最先处理请求,最后处理响应),这样在用户交互时输入违禁词时,同样可以打印出用户输入日志,反之则不行。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Code Log-AI超级智能体项目,开发日志。SpringAI + RAG + MCP 全栈 | AI 超级智能体企业级实战(26年必学)
3
27 岁,我终于做出了自己的游戏!但是一行代码都没写
6
最近在使用ChatGPT/Codex过程中发现了一个官方bug:高频日志写盘,会损坏电脑磁盘的寿命。桌面版和CLI都有这个问题,目前最新版的ChatGPT/Codex还没有彻底解决这个问题(虽然官方自称已经修复了,但实测还是有高频日志写盘问题)。建议使用下面这段提示词发给AI让它检查和修复:帮我检查 ~./codex/logs_2.sqlite 是否因 TRACE 日志持续高频写盘;如果中招,先备
2
codex
3
为啥codex老是提示这个啊
1
作者分享
Day 2
✅ 今天做了:
1. AI超级智能体项目做完了AI应用的后端接口,并用Vibe coding的方式生成了前端页面,并成功跑通。
⏰ 明天计划:明天写写论文吧
1
AI超级智能体——AI恋爱大师应用后端开发
3
Day 1
✅ 今天做了:学习项目AI超级智能体
- 编写了自定义违禁词校验Advisor
- 编写了一套简单的包含变量的 Prompt 模板,并保存为资源文件,从文件加载模板
- 用阿里云百炼平台的官方SDK开发了一个简单的多模态对话助手,能够让AI 解释图片
⏰ 明天计划:完成 AI 恋爱大师应用的开发
📚 今日感悟:写项目不能只跟着敲一遍,要多些自己的思考,多看官方参考文档和代码源码,看不懂可以问ai,要勤记录
3
AI 超级智能体项目——Prompt模板实现
3
基于MySQL的AI对话持久化简单实现——AI 超级智能体
3
