Spring AI入门:从零搭建智能问答初级案例

一、Spring AI技术背景与核心价值

Spring AI是Spring生态针对人工智能场景的扩展模块,旨在简化AI模型与Java应用的集成。其核心价值体现在三方面:

  1. 生态兼容性:无缝兼容Spring Boot/Cloud,开发者可利用现有技术栈快速构建AI应用;
  2. 模型抽象层:通过统一接口支持主流大模型(如LLM、多模态模型),降低模型切换成本;
  3. 工程化能力:内置请求路由、结果解析、异常处理等企业级功能,提升开发效率。

以智能问答场景为例,传统方案需手动处理模型调用、上下文管理、结果格式化等逻辑,而Spring AI通过注解驱动和配置化设计,可将开发周期从数周缩短至数天。

二、环境准备与依赖配置

1. 开发环境要求

  • JDK 17+(推荐LTS版本)
  • Spring Boot 3.2+(支持Java 17+)
  • Maven 3.8+ 或 Gradle 8.0+
  • 模型服务(如百度千帆大模型平台API)

2. 项目初始化

通过Spring Initializr(https://start.spring.io)生成项目,添加以下依赖:

  1. <!-- Spring AI核心依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.ai</groupId>
  4. <artifactId>spring-ai-starter</artifactId>
  5. <version>0.7.0</version>
  6. </dependency>
  7. <!-- HTTP客户端(如调用远程模型服务) -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <!-- 可选:OpenAI兼容层(如需调用本地模型) -->
  13. <dependency>
  14. <groupId>org.springframework.ai</groupId>
  15. <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  16. <version>0.7.0</version>
  17. </dependency>

3. 配置模型服务

application.yml中配置模型服务参数(以某云厂商API为例):

  1. spring:
  2. ai:
  3. chat:
  4. endpoint: https://api.example.com/v1/chat/completions
  5. api-key: YOUR_API_KEY
  6. model: qianwen-7b # 示例模型名

三、核心功能实现

1. 基础问答服务

步骤1:定义请求/响应DTO

  1. public record ChatRequest(String prompt, String userId) {}
  2. public record ChatResponse(String answer, List<String> references) {}

步骤2:创建AI服务类

  1. @Service
  2. public class AiChatService {
  3. private final ChatClient chatClient;
  4. public AiChatService(ChatClient chatClient) {
  5. this.chatClient = chatClient;
  6. }
  7. public ChatResponse ask(ChatRequest request) {
  8. ChatMessage userMessage = ChatMessage.builder()
  9. .role(ChatMessageRole.USER)
  10. .content(request.prompt())
  11. .build();
  12. ChatCompletionRequest completionRequest = ChatCompletionRequest.builder()
  13. .messages(List.of(userMessage))
  14. .model("qianwen-7b") # 与配置文件保持一致
  15. .build();
  16. ChatCompletionResponse response = chatClient.call(completionRequest);
  17. String answer = response.getChoices().get(0).getMessage().getContent();
  18. return new ChatResponse(answer, extractReferences(answer));
  19. }
  20. private List<String> extractReferences(String text) {
  21. // 实现参考文献提取逻辑
  22. return List.of();
  23. }
  24. }

步骤3:创建REST控制器

  1. @RestController
  2. @RequestMapping("/api/chat")
  3. public class ChatController {
  4. private final AiChatService aiChatService;
  5. public ChatController(AiChatService aiChatService) {
  6. this.aiChatService = aiChatService;
  7. }
  8. @PostMapping
  9. public ResponseEntity<ChatResponse> chat(@RequestBody ChatRequest request) {
  10. ChatResponse response = aiChatService.ask(request);
  11. return ResponseEntity.ok(response);
  12. }
  13. }

2. 上下文管理优化

通过Conversation对象维护多轮对话状态:

  1. @Service
  2. public class ContextAwareChatService {
  3. private final ChatClient chatClient;
  4. private final Map<String, List<ChatMessage>> conversationHistory = new ConcurrentHashMap<>();
  5. public ChatResponse ask(String userId, String prompt) {
  6. List<ChatMessage> history = conversationHistory.computeIfAbsent(userId, k -> new ArrayList<>());
  7. history.add(ChatMessage.builder()
  8. .role(ChatMessageRole.USER)
  9. .content(prompt)
  10. .build());
  11. ChatCompletionRequest request = ChatCompletionRequest.builder()
  12. .messages(history)
  13. .build();
  14. ChatCompletionResponse response = chatClient.call(request);
  15. ChatMessage aiMessage = response.getChoices().get(0).getMessage();
  16. history.add(aiMessage);
  17. return new ChatResponse(aiMessage.getContent(), List.of());
  18. }
  19. }

四、性能优化与最佳实践

1. 异步处理设计

使用@Async实现非阻塞调用:

  1. @Service
  2. public class AsyncChatService {
  3. @Async
  4. public CompletableFuture<ChatResponse> askAsync(ChatRequest request) {
  5. // 同步调用逻辑...
  6. return CompletableFuture.completedFuture(response);
  7. }
  8. }
  9. // 启用异步需在主类添加@EnableAsync

2. 缓存策略

通过Caffeine缓存高频问题:

  1. @Configuration
  2. public class CacheConfig {
  3. @Bean
  4. public Cache<String, ChatResponse> chatCache() {
  5. return Caffeine.newBuilder()
  6. .maximumSize(1000)
  7. .expireAfterWrite(10, TimeUnit.MINUTES)
  8. .build();
  9. }
  10. }
  11. @Service
  12. public class CachedChatService {
  13. private final Cache<String, ChatResponse> cache;
  14. private final AiChatService aiChatService;
  15. public ChatResponse askWithCache(ChatRequest request) {
  16. String cacheKey = request.userId() + ":" + request.prompt();
  17. return cache.get(cacheKey, key -> aiChatService.ask(request));
  18. }
  19. }

3. 错误处理机制

自定义异常处理器:

  1. @ControllerAdvice
  2. public class AiExceptionHandler {
  3. @ExceptionHandler(AiServiceException.class)
  4. public ResponseEntity<ErrorResponse> handleAiException(AiServiceException e) {
  5. ErrorResponse error = new ErrorResponse(
  6. "AI_SERVICE_ERROR",
  7. e.getMessage(),
  8. e.getErrorCode()
  9. );
  10. return ResponseEntity.status(503).body(error);
  11. }
  12. }

五、部署与监控

1. 日志配置

logback-spring.xml中添加AI调用日志:

  1. <logger name="org.springframework.ai" level="DEBUG"/>

2. 指标监控

通过Micrometer收集AI调用指标:

  1. @Bean
  2. public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
  3. return registry -> registry.config().commonTags("ai.service", "qianwen");
  4. }

六、进阶方向建议

  1. 多模型路由:根据问题类型动态选择不同模型(如文本生成用LLM,数学题用专用模型);
  2. 安全加固:实现输入过滤、输出审核机制;
  3. 边缘计算:结合百度智能云边缘节点实现低延迟响应。

通过本文案例,开发者可快速掌握Spring AI的核心开发模式,后续可结合具体业务场景扩展功能模块。建议参考Spring AI官方文档(https://spring.io/projects/spring-ai)获取最新特性更新。