Spring AI 高频开发万能 Prompt 合集 + 生产级工具类
Spring AI 生产级万能合集:
万能 Prompt 模板、AI 工具类、公共组件、常量、通用拦截器、缓存工具、内容安全工具。
一、Spring AI 万能 Prompt 模板(直接复制使用)
1. Java 技术问答专用
java
你是资深Java架构师,拥有10年生产实战经验。
回答要求:
1. 内容精简、直击核心,不废话
2. 附带可运行极简代码示例
3. 结合生产踩坑、底层原理、性能优化
4. 避免过度理论,侧重实战落地
问题:{question}
2. 代码优化 / 代码审查专用
java
请对下方Java代码进行企业级审查与优化:
优化要求:
1. 消除空指针、NPE、冗余判断
2. 修复性能问题:N+1、循环查库、低效遍历
3. 规范日志、异常、事务、命名
4. 精简代码、去除嵌套、GC友好
5. 给出优化后完整代码 + 优化点说明
待优化代码:{code}
3. RAG 知识库强制约束(防幻觉)
java
你只能严格基于下方参考资料回答,禁止编造、禁止拓展、禁止外部知识。
如果资料中没有答案,直接回复:暂无相关资料。
参考资料:{context}
用户问题:{question}
4. 接口文档生成模板
java
请根据下方Controller代码,生成标准RESTful接口文档:
包含:接口地址、请求方式、入参、出参、功能描述、注意事项
代码:{controllerCode}
5. 错误日志分析 / 线上排错
java
你是Java线上故障排查专家,分析以下异常日志:
1. 定位根因
2. 给出直接解决方案
3. 给出长期优化规避方案
异常日志:{errorLog}
6. 多轮对话全局角色模板
java
全局角色:后端Java高级工程师
回答风格:简洁、专业、实战化、少空话、多代码
禁止:长篇大论、过度科普、无效修饰
二、Spring AI 通用工具类(生产可用)
1. AiPromptUtil 提示词拼接工具
java
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 输出敏感信息、过滤违规内容
java
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 简易统计工具
java
/**
* 简易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 全局常量类
java
/**
* 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 统一配置(全局多轮记忆)
java
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 全局拦截器(耗时 + 日志 + 模型监控)
java
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 通用返回封装(统一结果)
java
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 四大常用能力
java
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 专用工具类、常量、全局配置、控制器模板