1. 项目概述
SpringAI作为当前企业级AI应用开发的热门框架,正在改变传统Java开发者构建智能应用的方式。作为一名经历过三次SpringAI环境搭建的老手,我深刻理解新手在配置过程中可能遇到的各种"坑"。本文将基于Spring Boot 3.2+和JDK 17环境,带你完整走通从零开始的环境搭建流程。
不同于官方文档的简略说明,这里会包含我在多个实际项目中总结的环境配置技巧。比如如何解决国内开发者常见的依赖下载问题,不同操作系统下的环境变量配置差异,以及IDE选择对开发体验的影响等实战经验。这些细节往往决定了你能否在半小时内顺利完成环境搭建,而不是浪费一整天在环境问题上。
2. 环境准备
2.1 硬件与基础软件要求
开发机器建议配置:
- 内存:最低8GB,推荐16GB以上(AI模型加载较耗内存)
- 存储:至少20GB可用空间(用于存放依赖包和模型文件)
- 操作系统:Windows 10+/macOS 10.15+/主流Linux发行版
注意:虽然SpringAI支持在低配环境运行,但处理复杂AI任务时性能会明显下降。如果需要进行模型微调,建议使用32GB内存及以上配置。
2.2 JDK安装与配置
必须使用JDK 17或更高版本:
# 检查Java版本 java -version如果未安装或版本不符,推荐通过SDKMAN管理多版本JDK:
# 安装SDKMAN curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" # 安装JDK 17 sdk install java 17.0.10-tem配置JAVA_HOME环境变量(以macOS/Linux为例):
# 确定JDK安装路径 /usr/libexec/java_home -v 17 # 添加到环境变量 echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc source ~/.zshrc2.3 开发工具选择
推荐IDE组合:
- IntelliJ IDEA Ultimate(最佳Spring支持)
- VS Code + Java扩展包(轻量级选择)
必备插件:
- Spring Boot Tools
- Lombok(减少样板代码)
- AI Assistant(可选,提供代码建议)
3. 项目初始化
3.1 使用Spring Initializr创建项目
通过start.spring.io生成项目时关键配置:
- Project: Maven Project
- Language: Java
- Spring Boot: 3.2.5(稳定版)
- Dependencies:
- Spring Web
- Spring AI
- Lombok
- DevTools
或者使用curl快速创建:
curl https://start.spring.io/starter.tgz \ -d type=maven-project \ -d language=java \ -d bootVersion=3.2.5 \ -d groupId=com.example \ -d artifactId=springai-demo \ -d name=springai-demo \ -d dependencies=web,ai,lombok,devtools \ -d javaVersion=17 \ | tar -xzvf -3.2 解决国内依赖问题
配置阿里云镜像加速依赖下载:
<!-- 在pom.xml中添加 --> <repositories> <repository> <id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> </repository> </repositories>对于Spring AI特有的依赖,可能需要额外配置:
<repository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository>4. 核心配置详解
4.1 应用配置文件
application.properties基础配置:
# 服务端口 server.port=8080 # Spring AI基础配置 spring.ai.openai.api-key=${OPENAI_API_KEY} spring.ai.openai.chat.options.model=gpt-3.5-turbo spring.ai.openai.chat.options.temperature=0.7 # 开启Actuator端点 management.endpoints.web.exposure.include=health,info,env更推荐使用application.yml格式:
spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: options: model: gpt-3.5-turbo temperature: 0.74.2 环境变量管理
安全提示:永远不要将API密钥硬编码在代码中!
推荐做法:
开发环境:使用
.env文件配合IDE插件# .env文件示例 OPENAI_API_KEY=sk-your-key-here生产环境:使用配置中心或Kubernetes Secrets
IntelliJ配置环境变量:
- Run → Edit Configurations → Environment variables
- 添加
OPENAI_API_KEY=your_key
4.3 连接不同AI提供商
除了OpenAI,SpringAI还支持多种AI服务:
# Azure OpenAI配置示例 spring: ai: azure: openai: api-key: ${AZURE_OPENAI_API_KEY} endpoint: https://your-resource-name.openai.azure.com chat: options: deployment-name: gpt-35-turbo5. 验证环境
5.1 创建测试Controller
@RestController @RequiredArgsConstructor public class AiController { private final ChatClient chatClient; @GetMapping("/ask") public String ask(@RequestParam String question) { return chatClient.call(question); } }5.2 启动应用检查
正常启动日志应包含:
Started SpringaiDemoApplication in 2.305 seconds Initialized Spring AI ChatClient for OpenAi访问健康检查端点:
http://localhost:8080/actuator/health5.3 常见启动问题排查
Bean创建失败:
- 检查
application.properties配置是否正确 - 确认环境变量已正确加载
- 检查
连接超时:
spring: ai: openai: connect-timeout=30s read-timeout=60s内存不足: 在启动配置中添加VM参数:
-Xmx2G -XX:MaxRAMPercentage=70
6. 高级配置技巧
6.1 多模型切换策略
使用@Qualifier注入不同模型:
@Bean @Qualifier("openai") public ChatClient openAiChatClient(OpenAiChatClient openAiChatClient) { return openAiChatClient; } @Bean @Qualifier("azure") public ChatClient azureChatClient(AzureOpenAiChatClient azureChatClient) { return azureChatClient; }6.2 自定义Prompt模板
创建resources/prompts/qa-prompt.st:
Answer the following question in a professional tone: {question}Java中使用:
@Value("classpath:/prompts/qa-prompt.st") private Resource promptTemplate; public String generateAnswer(String question) { PromptTemplate template = new PromptTemplate(promptTemplate); Prompt prompt = template.create(Map.of("question", question)); return chatClient.call(prompt.getContents()); }6.3 性能监控配置
添加Micrometer监控:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency>配置Prometheus端点:
management: endpoints: web: exposure: include: prometheus metrics: tags: application: ${spring.application.name}7. 生产环境建议
7.1 安全加固措施
启用Spring Security:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/ask").authenticated() .anyRequest().permitAll() ) .httpBasic(Customizer.withDefaults()); return http.build(); } }配置HTTPS:
server.ssl.enabled=true server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:keystore.p12 server.ssl.key-store-password=changeit
7.2 性能优化
连接池配置:
spring: ai: openai: connection-pool: max-idle: 10 max-total: 50响应缓存:
@Cacheable("aiResponses") public String getCachedResponse(String prompt) { return chatClient.call(prompt); }
7.3 容器化部署
Dockerfile示例:
FROM eclipse-temurin:17-jdk-jammy WORKDIR /app COPY target/*.jar app.jar ENTRYPOINT ["java","-jar","app.jar"]构建命令:
./mvnw clean package docker build -t springai-demo . docker run -p 8080:8080 -e OPENAI_API_KEY=your_key springai-demo8. 开发工作流优化
8.1 自动化测试配置
集成测试示例:
@SpringBootTest class AiApplicationTests { @Autowired private ChatClient chatClient; @Test void contextLoads() { assertNotNull(chatClient); } @Test void testSimpleQuery() { String response = chatClient.call("Hello"); assertTrue(response.length() > 0); } }Mock测试方案:
@TestConfiguration class TestConfig { @Bean @Primary public ChatClient mockChatClient() { return prompt -> "Mocked response"; } }8.2 持续集成配置
GitHub Actions示例:
name: Java CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - name: Build with Maven run: ./mvnw -B package --file pom.xml - name: Test run: ./mvnw test8.3 本地开发技巧
热部署配置:
spring.devtools.restart.enabled=true spring.devtools.livereload.enabled=true快速测试端点:
http :8080/ask question=="SpringAI是什么"日志级别调整:
logging: level: org.springframework.ai: DEBUG com.example: INFO
9. 常见问题解决方案
9.1 依赖冲突解决
查看依赖树:
./mvnw dependency:tree排除冲突依赖示例:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency>9.2 连接问题诊断
测试API连通性:
@SpringBootTest class ConnectivityTest { @Value("${spring.ai.openai.api-key}") private String apiKey; @Test void testOpenAIConnection() throws IOException { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.openai.com/v1/models")) .header("Authorization", "Bearer " + apiKey) .GET() .build(); HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); assertEquals(200, response.statusCode()); } }9.3 性能问题排查
使用Arthas进行诊断:
# 启动Arthas java -jar arthas-boot.jar # 监控方法调用 watch org.springframework.ai.client.AiClient call '{params, returnObj}' -x 3JVM调优参数:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4