1. 五分钟搭建Java AI智能体的必要性
在当今技术环境下,AI能力已经成为各类应用的基础需求。作为Java开发者,我们常常面临一个困境:大多数前沿AI框架都以Python生态为主,而企业级应用又往往基于Java技术栈构建。Spring AI的出现完美解决了这个矛盾点。
我最近在实际项目中验证了Spring AI的可行性。相比传统方案,它具有三个显著优势:
- 无需切换技术栈,保持Java开发习惯
- 与Spring生态无缝集成,特别是对Spring Boot开发者极其友好
- 抽象层设计良好,可以灵活切换不同AI服务提供商
重要提示:国内开发者建议直接使用Spring AI Alibaba,避免网络连接问题导致的调试困难。我在初期测试时,就曾因为网络波动浪费了两天时间排查"超时"问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与项目创建
2.1 开发环境要求
推荐使用以下配置:
- JDK 17+(我实测JDK 21也能完美运行)
- Maven 3.6+或Gradle 7.x
- IDE任选(IntelliJ IDEA或VS Code均可)
bash复制# 验证Java版本
java -version
# 验证Maven
mvn -v
2.2 项目初始化
使用Spring Initializr创建项目时,建议选择:
- Spring Boot 3.2+
- 打包方式:Jar
- 依赖项:
- Spring Web
- Lombok(可选但推荐)
对于国内开发者,需要额外配置阿里云镜像。这是我的settings.xml配置片段:
xml复制<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
3. 核心依赖配置
3.1 依赖项选择
国外方案:
xml复制<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M4</version>
</dependency>
国内方案(推荐):
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>spring-ai-alibaba-spring-boot-starter</artifactId>
<version>1.0.0-M1</version>
</dependency>
3.2 配置文件设置
application.yml配置示例:
yaml复制spring:
ai:
alibaba:
chat:
api-key: your-api-key
endpoint: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
安全提示:千万不要把API密钥提交到GitHub!建议使用环境变量或配置中心管理:
yaml复制api-key: ${AI_API_KEY}
4. 基础功能实现
4.1 创建聊天控制器
java复制@RestController
@RequiredArgsConstructor
public class ChatController {
private final AlibabaChatClient chatClient;
@GetMapping("/chat")
public String generate(@RequestParam String message) {
return chatClient.call(message);
}
}
4.2 测试验证
使用curl测试:
bash复制curl "http://localhost:8080/chat?message=Java是什么"
预期返回:
json复制{
"content": "Java是一种广泛使用的编程语言...",
"metadata": {...}
}
5. 进阶功能开发
5.1 对话记忆实现
java复制@Bean
public ChatMemory chatMemory() {
return new InMemoryChatMemory();
}
@PostMapping("/chat/with-memory")
public String chatWithMemory(@RequestBody ChatRequest request) {
Prompt prompt = new Prompt(request.message(),
new MemoryRetriever(chatMemory()));
return chatClient.call(prompt).getContent();
}
5.2 工具调用示例
定义天气查询工具:
java复制@Bean
public Function<WeatherRequest, WeatherResponse> weatherTool() {
return request -> {
// 调用天气API
return new WeatherResponse(...);
};
}
在Prompt中指定工具:
java复制Prompt prompt = new Prompt("北京天气怎么样?",
List.of(new ToolCall("weatherTool")));
6. 生产环境注意事项
6.1 性能优化
- 启用响应流式传输:
java复制@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
return chatClient.stream(message);
}
- 设置合理的超时:
yaml复制spring:
ai:
alibaba:
chat:
connect-timeout: 5s
read-timeout: 30s
6.2 异常处理
全局异常处理器示例:
java复制@RestControllerAdvice
public class AIExceptionHandler {
@ExceptionHandler(AIException.class)
public ResponseEntity<ErrorResponse> handleAIException(AIException ex) {
return ResponseEntity.status(502)
.body(new ErrorResponse("AI服务异常", ex.getMessage()));
}
}
7. 常见问题排查
7.1 依赖冲突解决
如果遇到类冲突,可以使用mvn dependency:tree分析:
bash复制mvn dependency:tree -Dincludes=org.springframework.ai
常见冲突解决方案:
- 排除冲突依赖
- 统一版本号
- 使用dependencyManagement管理版本
7.2 记忆失效问题
如果发现ChatMemory不生效,检查:
- 是否使用了同一个ChatMemory实例
- 是否在每次请求中都传入了MemoryRetriever
- 是否配置了合适的记忆存储策略
8. 项目结构优化建议
推荐的分层架构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 业务逻辑
│ │ ├── model/ # 数据模型
│ │ └── tools/ # AI工具定义
│ └── resources/
│ ├── application.yml
│ └── ...
└── test/ # 测试代码
我在实际项目中发现,将AI工具单独放在tools包下,可以显著提高代码可维护性。同时建议为每个工具编写单元测试,验证其与AI的交互逻辑。
9. 监控与日志
9.1 Prometheus监控配置
java复制@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags(
"application", "java-ai-agent");
}
9.2 日志记录策略
建议记录:
- 原始请求和响应(脱敏后)
- 耗时统计
- 异常堆栈
Logback配置示例:
xml复制<logger name="org.springframework.ai" level="DEBUG"/>
10. 扩展思路
基于这个基础框架,你可以进一步实现:
- 多模态处理(图片+文本)
- 批量任务处理
- 自定义模型微调
- 与其他系统集成(如工作流引擎)
我在电商项目中就成功实现了智能客服系统,能够处理订单查询、退换货等复杂流程。关键是在工具定义时,要充分考虑业务场景的复杂性。
