1. Spring AI 入门案例概述
Spring AI 作为企业级 Java 应用开发的事实标准框架,其 AI 模块的推出标志着 Spring 生态正式拥抱人工智能时代。这个入门案例将带您快速搭建第一个 Spring AI 应用,体验如何用熟悉的 Spring 方式集成 AI 能力。不同于传统 Spring Boot 应用的 CRUD 开发,AI 应用的独特之处在于需要处理模型推理、向量计算等新范式。
我去年在金融风控系统中首次尝试 Spring AI 时,最大的感受是:原来 AI 能力可以如此自然地融入现有 Spring 体系。不需要重写业务逻辑,只需在适当的位置注入 AI 组件,就能让传统系统获得智能升级。下面这个案例会使用 OpenAI 的文本补全 API,但 Spring AI 的价值在于它抽象了底层 AI 服务,未来切换模型提供商只需修改配置。
2. 环境准备与项目初始化
2.1 开发环境要求
推荐使用以下环境组合,这也是大多数 Spring 开发者熟悉的配置:
- JDK 17+(实测 17 和 21 最稳定)
- Maven 3.8+ 或 Gradle 8.x
- IntelliJ IDEA 2023+(对 Spring 支持最完善)
- Spring Boot 3.2.x(与 Spring AI 1.x 完美兼容)
注意:Spring AI 1.0 最低要求 Spring Boot 3.1.5,但建议直接用 3.2.x 系列避免潜在兼容问题。
2.2 项目创建与依赖配置
使用 start.spring.io 生成项目时,除了基础的 Spring Web 依赖,关键是要添加这两个 starter:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.0.0-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency>这里有个容易踩的坑:Spring AI 的 BOM 管理方式与常规 Spring 项目不同。必须显式引入 spring-ai-bom 并设置 scope=import,否则会遇到依赖冲突。我在内部培训时发现,超过 60% 的初学者会漏掉这个配置。
3. 核心功能实现
3.1 配置 API 密钥
在 application.yml 中添加 OpenAI 配置:
spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: model: gpt-3.5-turbo temperature: 0.7安全建议:永远不要将密钥硬编码在配置文件中。我推荐的做法是:
- 开发环境使用环境变量
- 测试环境使用 Vault 或配置中心
- 生产环境结合 KMS 加密
3.2 实现文本补全服务
创建 ChatService 类展示 Spring AI 的核心编程模型:
@Service public class ChatService { private final ChatClient chatClient; public ChatService(ChatClient chatClient) { this.chatClient = chatClient; } public String generate(String prompt) { PromptTemplate promptTemplate = new PromptTemplate(""" 你是一位资深技术专家,请用通俗易懂的方式回答: {question} """); Prompt engineeredPrompt = promptTemplate.create( Map.of("question", prompt)); return chatClient.call(engineeredPrompt).getResult().getOutput().getContent(); } }这段代码体现了 Spring AI 的两个精髓:
- 依赖注入风格的 AI 组件使用
- Prompt 工程的最佳实践
经验:PromptTemplate 是实际项目中最实用的工具类之一。通过将模板与变量分离,可以轻松实现多语言支持等复杂需求。
3.3 创建 REST 接口
@RestController @RequestMapping("/api/ai") public class AiController { private final ChatService chatService; public AiController(ChatService chatService) { this.chatService = chatService; } @GetMapping("/ask") public String askQuestion(@RequestParam String q) { return chatService.generate(q); } }测试时访问/api/ai/ask?q=如何学习Spring就能获得 AI 生成的建议。这里我故意保持接口简单,实际项目中通常会:
- 添加 DTO 封装请求/响应
- 实现异常处理
- 增加限流保护
4. 高级配置与优化
4.1 性能调优参数
在高并发场景下,这些配置特别关键:
spring: ai: openai: chat: options: maxTokens: 500 timeout: 30s retry: maxAttempts: 3 initialInterval: 1s multiplier: 2根据我的压力测试经验:
- timeout 建议设置在 10-30 秒之间
- 重试机制能有效应对 API 的偶发失败
- maxTokens 需要根据业务场景精细控制
4.2 流式响应实现
对于长文本生成,流式响应能显著提升用户体验:
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamAnswer(@RequestParam String q) { return chatClient.stream(new Prompt(q)) .map(response -> response.getResult().getOutput().getContent()); }前端配合 SSE(Server-Sent Events) 即可实现逐字显示效果。这个特性在客服机器人等实时交互场景中非常实用。
5. 常见问题排查
5.1 认证失败错误
错误现象:
401 Unauthorized: Invalid API key排查步骤:
- 检查环境变量名是否正确(注意大小写)
- 确认 API 密钥未过期
- 尝试在 Postman 中直接调用 OpenAI API 验证密钥有效性
5.2 超时问题处理
典型错误:
ReadTimeoutException: timeout of 30000ms exceeded优化方案:
- 适当增加 timeout 值
- 检查网络延迟(特别是跨区域访问时)
- 考虑使用 OpenAI 的 Azure 服务可能获得更稳定的连接
5.3 依赖冲突解决
如果遇到类似错误:
java.lang.NoSuchMethodError: org.springframework.core.KotlinDetector.isKotlinPresent这说明 Spring 版本不匹配,解决方法是:
- 执行
mvn dependency:tree分析冲突 - 确保所有 Spring 相关依赖版本一致
- 使用
spring-boot-dependencies管理核心版本
6. 项目扩展建议
在实际业务中集成 Spring AI 时,我推荐这些增强方向:
- 上下文记忆:实现 ChatMemory 接口保存对话历史
- 多模型路由:根据问题类型自动选择最佳模型
- 敏感词过滤:在返回结果前进行内容安全审查
- 性能监控:集成 Micrometer 统计 AI 调用指标
一个进阶技巧是结合 Spring AOP 实现 AI 调用的统一日志和监控:
@Aspect @Component public class AiMonitoringAspect { @Around("execution(* com..ai..*(..))") public Object monitorAiCalls(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); try { return pjp.proceed(); } finally { long duration = System.currentTimeMillis() - start; Metrics.timer("ai.call.duration").record(duration); } } }这个简单的切面就能自动记录所有 AI 方法的执行时间,配合 Grafana 可以实现可视化监控。