Spring AI 高频开发万能 Prompt 合集 + 生产级工具类
Spring AI 生产级万能合集:
万能 Prompt 模板、AI 工具类、公共组件、常量、通用拦截器、缓存工具、内容安全工具。
一、Spring AI 万能 Prompt 模板(直接复制使用)
1. Java 技术问答专用
你是资深Java架构师,拥有10年生产实战经验。 回答要求: 1. 内容精简、直击核心,不废话 2. 附带可运行极简代码示例 3. 结合生产踩坑、底层原理、性能优化 4. 避免过度理论,侧重实战落地 问题:{question}2. 代码优化 / 代码审查专用
请对下方Java代码进行企业级审查与优化: 优化要求: 1. 消除空指针、NPE、冗余判断 2. 修复性能问题:N+1、循环查库、低效遍历 3. 规范日志、异常、事务、命名 4. 精简代码、去除嵌套、GC友好 5. 给出优化后完整代码 + 优化点说明 待优化代码:{code}3. RAG 知识库强制约束(防幻觉)
你只能严格基于下方参考资料回答,禁止编造、禁止拓展、禁止外部知识。 如果资料中没有答案,直接回复:暂无相关资料。 参考资料:{context} 用户问题:{question}4. 接口文档生成模板
请根据下方Controller代码,生成标准RESTful接口文档: 包含:接口地址、请求方式、入参、出参、功能描述、注意事项 代码:{controllerCode}5. 错误日志分析 / 线上排错
你是Java线上故障排查专家,分析以下异常日志: 1. 定位根因 2. 给出直接解决方案 3. 给出长期优化规避方案 异常日志:{errorLog}6. 多轮对话全局角色模板
全局角色:后端Java高级工程师 回答风格:简洁、专业、实战化、少空话、多代码 禁止:长篇大论、过度科普、无效修饰二、Spring AI 通用工具类(生产可用)
1. AiPromptUtil 提示词拼接工具
import org.springframework.ai.chat.prompt.PromptTemplate; import java.util.Map; /** * AI 提示词工具类 */ public class AiPromptUtil { /** * 构建模板Prompt */ public static String build(String template, Map<String, Object> paramMap) { PromptTemplate promptTemplate = new PromptTemplate(template); return promptTemplate.render(paramMap); } /** * 极简单参数构建 */ public static String build(String template, String key, String value) { return build(template, Map.of(key, value)); } }2. AiContentUtil 内容安全 & 脱敏工具
防止 AI 输出敏感信息、过滤违规内容
import org.springframework.util.StringUtils; /** * AI 内容安全工具 */ public class AiContentUtil { /** * 敏感词过滤 */ public static String filterSensitive(String content) { if (!StringUtils.hasText(content)) { return content; } // 可扩展敏感词库 return content.replaceAll("密码|密钥|token|accessKey", "***"); } /** * 截断超长回答(防止返回内容过大) */ public static String cutLongText(String content, int maxLength) { if (!StringUtils.hasText(content) || content.length() <= maxLength) { return content; } return content.substring(0, maxLength) + "..."; } }3. AiCostUtil Token 简易统计工具
/** * 简易Token消耗计算(粗略版,用于成本管控) */ public class AiCostUtil { private static final int TOKEN_PER_CHARS = 3; /** * 粗略计算token */ public static int calcToken(String text) { if (text == null) return 0; return text.length() / TOKEN_PER_CHARS; } }三、AI 全局常量类
/** * AI 全局常量 */ public final class AiConstant { private AiConstant(){} // 上下文最大保存轮次 public static final int MAX_CHAT_MEMORY_SIZE = 5; // RAG 检索配置 public static final int RAG_TOP_K = 3; public static final double RAG_SIMILARITY_THRESHOLD = 0.7; // 超时时间 public static final long AI_TIMEOUT_SECONDS = 30; // 重试次数 public static final int AI_RETRY_TIMES = 3; }四、ChatMemory 统一配置(全局多轮记忆)
import org.springframework.ai.chat.memory.InMemoryChatMemory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AiMemoryConfig { @Bean public InMemoryChatMemory chatMemory() { // 全局统一限制最大5轮,防止token爆炸 return new InMemoryChatMemory(AiConstant.MAX_CHAT_MEMORY_SIZE); } }五、AI 全局拦截器(耗时 + 日志 + 模型监控)
import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClientCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Slf4j @Configuration public class ChatClientInterceptorConfig { @Bean public ChatClientCustomizer aiChatClientCustomizer() { return builder -> builder.defaultInterceptors(interceptor -> { long startTime = System.currentTimeMillis(); // 执行AI调用 interceptor.advance(); // 后置日志 long cost = System.currentTimeMillis() - startTime; String model = interceptor.getPrompt().getChatOptions().getModel(); String userText = interceptor.getPrompt().getUserMessageText(); log.info("[AI调用] 模型:{}, 耗时:{}ms, 问题摘要:{}", model, cost, userText.length() > 30 ? userText.substring(0,30) : userText); }); } }六、AI 通用返回封装(统一结果)
import lombok.Data; @Data public class AiResult<T> { private Integer code; private String msg; private T data; public static <T> AiResult<T> success(T data) { AiResult<T> result = new AiResult<>(); result.setCode(200); result.setMsg("AI请求成功"); result.setData(data); return result; } public static <T> AiResult<T> fail(Integer code, String msg) { AiResult<T> result = new AiResult<>(); result.setCode(code); result.setMsg(msg); return result; } }七、可直接复用的 Controller 模板
整合:单轮、多轮、流式、RAG 四大常用能力
import lombok.RequiredArgsConstructor; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.memory.InMemoryChatMemory; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; @RestController @RequestMapping("/ai") @RequiredArgsConstructor public class AiCommonController { private final ChatClient chatClient; private final InMemoryChatMemory chatMemory; private final RagService ragService; // 单轮问答 @GetMapping("/chat") public AiResult<String> chat(@RequestParam String question) { String content = chatClient.prompt() .user(question) .call() .content(); return AiResult.success(content); } // 多轮带记忆 @GetMapping("/multi") public AiResult<String> multiChat(@RequestParam String question) { String content = chatClient.prompt() .user(question) .chatMemory(chatMemory) .call() .content(); return AiResult.success(content); } // 流式SSE @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> stream(@RequestParam String question) { return chatClient.stream() .user(question) .stream() .map(res -> AiContentUtil.filterSensitive( res.getResult().getOutput().getContent() )); } // RAG知识库问答 @GetMapping("/rag") public AiResult<String> rag(@RequestParam String question) { return AiResult.success(ragService.ragChat(question)); } // 清空对话记忆 @PostMapping("/memory/clear") public AiResult<Void> clearMemory() { chatMemory.clear(); return AiResult.success(null); } }八、生产级禁用 & 优化补充(最终漏点补齐)
- 禁止在 AI 接口中写入复杂业务逻辑,只做问答转发
- 禁止一次性传入超大文本,自动截断 + 分片
- 统一拦截大模型报错:额度不足、密钥失效、模型不存在
- 流式接口关闭缓存,避免前端响应异常
- 所有 Prompt 外部化,不要代码硬编码
- 线上环境关闭详细 Prompt 日志,防止信息泄露
九、整套资料汇总
目前已完整拥有:
- 《Spring AI 从零到生产 完整实战手册》
- 全套可运行依赖 + 配置
- 基础 / 流式 / 多轮 / RAG / 函数调用 完整代码
- 全局异常、重试、拦截器、监控
- 企业级万能 Prompt 库
- AI 专用工具类、常量、全局配置、控制器模板