Java 程序员第 2 阶段:精通 SpringBoot 整合大模型,快速搭建基础服务
前言上一阶段我们掌握了原生 API 调用但在大规模生产环境中使用专业的 Java 框架能大幅提升开发效率。SpringAI和LangChain4j是 Java 生态中最主流的大模型集成框架。本篇文章将手把手带你精通 SpringBoot 整合大模型快速搭建企业级 AI 服务。---1. SpringBoot 集成架构1.1 架构分层层级职责技术选型ControllerHTTP 接口、参数校验RestControllerService业务逻辑、Prompt 构建ServiceLLM Client模型调用封装SpringAI / LangChain4jConfig配置管理ConfigurationProperties1.2 项目依赖!-- pom.xml -- dependencies !-- SpringAI -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId version1.0.0-M4/version /dependency !-- 或使用 LangChain4j -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.35.0/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId version0.35.0/version /dependency !-- WebFlux支持流式 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency /dependencies---2. SpringAI 快速入门2.1 配置 application.ymlspring: application: name: llm-service ai: openai: api-key: ${OPENAI_API_KEY} base-url: https://api.openai.com chat: options: model: gpt-4 temperature: 0.7 max-tokens: 10002.2 核心配置类Configuration public class AIConfig { /** * OpenAI ChatModel 配置 */ Bean public ChatModel chatModel(OpenAiApi openAiApi) { return new OpenAiChatModel(openAiApi); } /** * Embedding 模型配置 */ Bean public EmbeddingModel embeddingModel(OpenAiApi openAiApi) { return new OpenAiEmbeddingModel(openAiApi); } }2.3 简单对话服务Service public class SimpleChatService { Autowired private ChatModel chatModel; /** * 简单对话 */ public String chat(String message) { return chatModel.call(message); } /** * 带选项的对话 */ public String chatWithOptions(String message) { ChatOptions options OpenAiChatOptions.builder() .withModel(gpt-4) .withTemperature(0.8) .withMaxTokens(500) .build(); return chatModel.call(message, options); } }2.4 Prompt 模板Service public class PromptTemplateService { Autowired private ChatModel chatModel; /** * 使用 Prompt 模板 */ public String explainCode(String code) { PromptTemplate template PromptTemplate.builder() .template(请解释以下 Java 代码的功能\njava\n{code}\n\n 请用简洁易懂的语言说明并指出可能的优化点。) .build(); Prompt prompt template.create(Map.of(code, code)); ChatResponse response chatModel.call(prompt); return response.getResult().getOutput().getText(); } /** * Few-shot 提示 */ public String translateWithExamples(String text) { PromptTemplate template PromptTemplate.builder() .template(将以下 Java 代码翻译为 Python\n 示例1\n输入ListString list Arrays.asList(\a\,\b\);\n 输出lst [\a\, \b\]\n\n 示例2\n输入MapString,Integer map new HashMap();\n 输出m {}\n\n 现在请翻译\n输入{input}\n) .build(); Prompt prompt template.create(Map.of(input, text)); return chatModel.call(prompt).getResult().getOutput().getText(); } }---3. LangChain4j 集成3.1 配置类Configuration public class LangChain4jConfig { Value(${openai.api.key}) private String apiKey; Bean public ChatLanguageModel chatModel() { return OpenAiChatModel.builder() .apiKey(apiKey) .modelName(gpt-4) .temperature(0.7) .build(); } Bean public AiServices aiServices(ChatLanguageModel chatModel) { return AiServices.builder(ChatAssistant.class) .chatLanguageModel(chatModel) .build(); } }3.2 定义 AI 服务接口/** * 定义 AI 服务接口 */ AiServices public interface CodeReviewAssistant { SystemMessage(你是一个资深的 Java 架构师专注于代码审查和性能优化。) String reviewCode(String code); SystemMessage(你是一个 SQL 优化专家) String optimizeSql(UserMessage String sql); UserMessage(请将以下文本翻译为英文{text}) String translate(V(text) String text); }3.3 使用示例Service public class CodeReviewService { Autowired private CodeReviewAssistant reviewAssistant; public ReviewResult review(String javaCode) { String review reviewAssistant.reviewCode(javaCode); return ReviewResult.builder() .originalCode(javaCode) .reviewComment(review) .timestamp(LocalDateTime.now()) .build(); } public String optimizeQuery(String sql) { return reviewAssistant.optimizeSql(sql); } }---4. 企业级服务设计4.1 统一响应格式Data Builder public class ApiResponseT { private int code; private String message; private T data; private long timestamp; public static T ApiResponseT success(T data) { return ApiResponse.Tbuilder() .code(200) .message(success) .data(data) .timestamp(System.currentTimeMillis()) .build(); } public static T ApiResponseT error(int code, String message) { return ApiResponse.Tbuilder() .code(code) .message(message) .timestamp(System.currentTimeMillis()) .build(); } }4.2 REST 接口RestController RequestMapping(/api/ai) public class AIController { Autowired private SimpleChatService chatService; Autowired private CodeReviewService reviewService; Autowired private PromptTemplateService templateService; /** * 简单对话 */ PostMapping(/chat) public ApiResponseString chat(RequestBody ChatRequest request) { try { String response chatService.chat(request.getMessage()); return ApiResponse.success(response); } catch (Exception e) { return ApiResponse.error(500, AI 服务调用失败: e.getMessage()); } } /** * 代码审查 */ PostMapping(/review) public ApiResponseReviewResult review(RequestBody CodeReviewRequest request) { try { ReviewResult result reviewService.review(request.getCode()); return ApiResponse.success(result); } catch (Exception e) { return ApiResponse.error(500, 代码审查失败: e.getMessage()); } } /** * 流式对话 */ GetMapping(value /chat/stream, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxString chatStream(RequestParam String message) { return chatService.chatStream(message); } }4.3 限流配置Configuration public class RateLimitConfig { Bean public FilterRegistrationBeanRateLimitFilter rateLimitFilter() { FilterRegistrationBeanRateLimitFilter bean new FilterRegistrationBean(); bean.setFilter(new RateLimitFilter()); bean.addUrlPatterns(/api/ai/*); return bean; } } Component public class RateLimitFilter extends OncePerRequestFilter { private final MapString, AtomicInteger counters new ConcurrentHashMap(); private final int maxRequests 10; // 每分钟10次 Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String key request.getRemoteAddr(); AtomicInteger count counters.computeIfAbsent(key, k - new AtomicInteger(0)); if (count.incrementAndGet() maxRequests) { response.setStatus(429); response.getWriter().write(Too Many Requests); return; } chain.doFilter(request, response); } }---5. 工具对比与选型框架优势劣势推荐场景SpringAISpring 生态、官方支持相对较新Spring 项目首选LangChain4j功能全面、社区活跃学习曲线复杂 AI 应用自定义封装完全可控、无依赖开发量大简单场景---6. 常见问题与解决问题原因解决方案API 调用超时网络/限流增加超时配置、添加重试Token 超出限制输入过长分块处理、摘要压缩返回内容不稳定Temperature 过高降低 temperature费用超支请求量过大添加限流、日志监控---7. 总结本篇文章深入讲解了SpringBoot 整合大模型✅ SpringAI 框架快速入门✅ LangChain4j 集成方案✅ 企业级服务设计与实现✅ REST 接口与流式响应✅ 限流与错误处理✅ 框架选型对比下一步预告第 3 阶段我们将学习《吃透提示词工程》掌握大模型业务场景调优技巧