1. 为什么选择Spring AI集成Gemini大模型
最近两年大模型技术发展迅猛,各种AI应用层出不穷。作为Java开发者,我们最熟悉的Spring生态也迎来了AI能力的加持。Spring AI这个项目让我眼前一亮,它就像给Spring Boot插上了AI的翅膀,让我们可以用熟悉的Java语法调用各种大模型。
我实际测试过多个大模型API,发现谷歌的Gemini在中文处理和多轮对话上表现尤为出色。特别是Gemini 2.5 Pro版本,不仅响应速度快,对技术问题的理解也很到位。最棒的是它提供了免费的调用额度,对于个人开发者和小型项目完全够用。
相比直接调用原生API,通过Spring AI集成有三大优势:
- 开发效率高:省去了自己封装HTTP客户端的麻烦
- 代码更简洁:用面向对象的方式处理对话和流式响应
- 易于扩展:一套代码可以适配不同的大模型提供商
2. 环境准备与API配置
2.1 获取Gemini API密钥
首先需要访问谷歌AI开发者平台(https://ai.google.dev),用谷歌账号登录后,在控制台创建一个新项目。这里有个小技巧:建议项目名称加上日期后缀,方便后续管理多个测试项目。
创建完项目后,在左侧菜单找到"API密钥"选项。点击"创建API密钥"按钮,系统会生成一个以"AIzaSy"开头的字符串。这个密钥相当于访问Gemini的密码,一定要妥善保管。我建议把它保存在项目的application.yml中,而不是直接硬编码在Java文件里。
注意:免费额度每分钟限制5次请求,开发调试时建议在代码中加入1秒的延迟,避免触发限流。
2.2 初始化Spring Boot项目
使用Spring Initializr创建一个新项目,我推荐选择以下依赖:
- Spring Web
- Lombok(简化代码)
- Spring AI(核心依赖)
关键是要添加Spring AI对Gemini的支持。在pom.xml中加入:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-google-gemini-spring-boot-starter</artifactId> <version>0.8.1</version> </dependency>配置application.yml示例:
spring: ai: google: gemini: api-key: ${GEMINI_API_KEY} model: gemini-2.5-pro chat: options: temperature: 0.7 top-p: 0.93. 核心代码实现
3.1 基础对话功能实现
创建一个ChatController来处理用户请求:
@RestController @RequiredArgsConstructor public class ChatController { private final ChatClient chatClient; @PostMapping("/chat") public String simpleChat(@RequestBody String question) { return chatClient.call(question); } }这个最简单的版本已经可以实现问答功能。但实际项目中,我们需要更复杂的交互。比如添加系统角色设定:
public ChatResponse chatWithRole(String userInput) { SystemMessage systemMessage = new SystemMessage("你是一位资深Java技术专家"); UserMessage userMessage = new UserMessage(userInput); Prompt prompt = new Prompt(List.of(systemMessage, userMessage)); return chatClient.generate(prompt); }3.2 流式响应处理
大模型生成内容可能需要较长时间,流式响应可以显著提升用户体验。Spring AI提供了Flux支持:
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamChat(@RequestParam String question) { return chatClient.stream(question) .map(ChatResponse::getOutput) .map(AssistantMessage::getText); }前端可以通过EventSource监听这个接口,实现打字机效果。我在项目中实测,流式响应比普通接口快2-3秒就能看到首字返回。
4. 高级功能与优化技巧
4.1 多轮对话管理
实际对话需要维护上下文,这里分享我的实现方案:
@Service public class ChatService { private final List<Message> history = new ArrayList<>(); public Flux<String> multiTurnChat(String userInput) { history.add(new UserMessage(userInput)); Prompt prompt = new Prompt(history); return chatClient.stream(prompt) .doOnNext(response -> { history.add(response.getOutput()); }) .map(response -> response.getOutput().getText()); } }关键点:
- 使用成员变量保存对话历史
- 每次交互都带上全部历史记录
- 注意控制history大小,避免token超限
4.2 性能调优建议
经过多次测试,我总结了这些优化经验:
- 超时设置:默认超时可能不够
spring: ai: google: gemini: client: connect-timeout: 30s read-timeout: 60s- 重试机制:应对API偶尔不稳定
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000)) public ChatResponse reliableChat(String input) { //... }- 缓存常用回答:对固定问题可以缓存结果
4.3 异常处理实践
大模型API调用可能遇到各种异常,完善的错误处理很重要:
@ExceptionHandler(ApiException.class) public ResponseEntity<ErrorResponse> handleApiException(ApiException ex) { if(ex.getStatusCode() == 429) { return ResponseEntity.status(429) .body(new ErrorResponse("请求过于频繁,请稍后再试")); } // 其他错误处理... }特别要注意速率限制(429错误),建议在前端也做相应提示。