当前位置: 首页 > article >正文

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 阶段我们将学习《吃透提示词工程》掌握大模型业务场景调优技巧

相关文章:

Java 程序员第 2 阶段:精通 SpringBoot 整合大模型,快速搭建基础服务

前言上一阶段我们掌握了原生 API 调用,但在大规模生产环境中,使用专业的 Java 框架能大幅提升开发效率。SpringAI 和 LangChain4j 是 Java 生态中最主流的大模型集成框架。本篇文章将手把手带你精通 SpringBoot 整合大模型,快速搭建企业级 AI…...

Java 100 天进阶之路 | 从入门到上岗就业 · 完整目录导航

📚 Java 100 天进阶之路 | 从入门到上岗就业 完整目录导航 不背八股文,不堆概念。44篇基础56篇进阶,100天助你达到Java就业水平,从容面对技术面试。 零差评Java教程,从入门到微服务,每篇都有代码、避坑和面…...

基于ChatGPT与Next.js的React组件自然语言生成器开发实战

1. 项目概述:一个由ChatGPT驱动的React组件实时生成器 作为一名在React生态里摸爬滚打了多年的前端开发者,我深知从零开始构建一个UI组件,尤其是那些需要反复调整样式和交互逻辑的组件,是多么耗时耗力。我们常常在Figma里画好了设…...

番茄小说下载神器:3步轻松打造个人数字图书馆

番茄小说下载神器:3步轻松打造个人数字图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为找不到心仪的小说资源而烦恼吗?还在为阅读体验不佳…...

词达人自动化解决方案:从重复劳动到智能学习的效率革命

词达人自动化解决方案:从重复劳动到智能学习的效率革命 【免费下载链接】cdr 微信词达人,高正确率,高效简洁。支持班级任务及自选任务 项目地址: https://gitcode.com/gh_mirrors/cd/cdr 在数字化学习时代,词汇积累成为英语…...

基于Azure SQL与Semantic Kernel的RAG应用实战:低成本实现向量搜索与智能问答

1. 项目概述:当SQL数据库遇上向量搜索如果你正在用.NET技术栈构建智能应用,并且数据已经躺在Azure SQL Database里,那么“如何低成本、高效率地实现语义搜索和RAG(检索增强生成)”很可能就是你当前最头疼的问题。传统的…...

为什么Detect It Easy成为二进制文件分析的现代选择?

为什么Detect It Easy成为二进制文件分析的现代选择? 【免费下载链接】Detect-It-Easy Program for determining types of files for Windows, Linux and MacOS. 项目地址: https://gitcode.com/gh_mirrors/de/Detect-It-Easy 在恶意软件分析、逆向工程和数字…...

如何让老旧安卓电视流畅播放直播节目?mytv-android原生应用解决方案

如何让老旧安卓电视流畅播放直播节目?mytv-android原生应用解决方案 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否还在为家中那台开机需要5分钟、看直播卡顿的老旧安卓…...

WarcraftHelper完整指南:5分钟让魔兽争霸3在现代电脑上完美运行

WarcraftHelper完整指南:5分钟让魔兽争霸3在现代电脑上完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代Win…...

汽车软件平台演进:从AUTOSAR到Hypervisor,如何重塑开发与商业模式

1. 汽车软件平台现状:从“硬骨头”到“乐高积木”的演进干了十几年汽车电子,我亲眼看着车里的代码从几万行膨胀到上亿行。十年前,我们还在为某个ECU(电子控制单元)里塞进一个简单的网络协议栈而通宵调试;现…...

从零构建实时数据仪表盘:React+Node.js实现任务控制面板

1. 项目概述:从“任务控制面板”看现代数据驱动决策的落地最近在GitHub上看到一个挺有意思的项目,叫iriseye931-ai/mission-control-dashboard。光看这个名字,就让我想起了科幻电影里那些布满屏幕、闪烁着各种数据和图表的指挥中心。没错&…...

从28纳米HKMG工艺到GPU逆向工程:深度解析AMD Radeon HD 7970的芯片设计与技术遗产

1. 项目概述:一次对经典显卡的深度技术考古对于很多老玩家和硬件爱好者来说,AMD Radeon HD 7970是一个绕不开的名字。它不仅是AMD(或者说,收购了ATI之后的AMD)在2012年投下的一颗重磅炸弹,更是在显卡发展史…...

告别X11!在Ubuntu 22.04上从源码编译Wayland+Weston桌面(保姆级避坑指南)

从X11到Wayland:Ubuntu 22.04源码编译Weston全流程实战 如果你已经受够了X11的老旧架构和偶尔的卡顿,现在是时候拥抱Wayland了。作为Linux桌面图形栈的下一代接班人,Wayland不仅在设计上更现代化,还能带来更流畅的图形体验。本文将…...

LLM Wiki Bridge:将Markdown知识库编译为AI可操作的概念图谱

1. 项目概述:将你的知识库变成AI的“第二大脑” 如果你和我一样,是个重度笔记用户,大概率也经历过这样的场景:在Obsidian、Logseq或者任何你喜欢的Markdown编辑器里,日积月累了成百上千篇笔记。你清楚地记得自己写过某…...

Multi-Agent 智能办公场景落地:财务、法务、人力的自动协作链路

Multi-Agent 智能办公场景落地:财务、法务、人力的自动协作链路 关键词 Multi-Agent 协作、业财法税一体化、智能办公自动化、大模型Agent编排、跨域规则引擎、RPA增强架构、企业数字员工 摘要 当前中大型企业普遍存在跨部门协作摩擦成本高、规则执行不一致、合规风险不可…...

Obsidian+Cursor构建AI增强型项目规划与开发一体化工作流

1. 项目概述:构建你的数字项目规划中枢如果你和我一样,同时管理着好几个数字项目——可能是一个新的SaaS产品、一个开源工具,或者一个复杂的个人自动化脚本——你肯定体会过那种信息散落各处的痛苦。产品需求文档在Notion里,技术架…...

Shell脚本错误处理实战:用sh-guard提升Bash脚本健壮性

1. 项目概述:一个为Shell脚本穿上“防护服”的守护者在Linux运维、自动化部署乃至日常的系统管理工作中,Shell脚本是我们最得力的助手。从简单的日志清理到复杂的CI/CD流水线,Shell脚本无处不在。然而,脚本的健壮性却常常被忽视。…...

开源无模式数据表格框架:构建自主可控SaaS应用的核心组件

1. 项目概述:一个为SaaS而生的开源数据表格框架如果你正在寻找一个能嵌入到自己SaaS产品里的数据表格组件,或者想搭建一个类似CRM、内部仪表盘的工具,并且对Airtable、Clay这类产品的闭源、云依赖和定价模式感到头疼,那么你找对地…...

RESTful API最佳实践:构建优雅的接口设计

RESTful API最佳实践:构建优雅的接口设计 前言 大家好,我是cannonmonster01!今天我们来聊聊RESTful API的最佳实践。 想象一下,你去一家餐厅吃饭。如果菜单混乱不堪,菜名不知所云,服务员态度恶劣&#x…...

Cursor免费版高效使用指南:配置优化与本地工具链整合

1. 项目概述与核心价值最近在开发者圈子里,关于AI编程工具的讨论热度一直居高不下。Cursor作为一款深度集成AI能力的代码编辑器,凭借其强大的代码生成、理解和重构功能,迅速成为了许多程序员提升效率的“新宠”。然而,其Pro版本需…...

为什么选择这个Windows键盘记录工具?3个让你无法拒绝的理由

为什么选择这个Windows键盘记录工具?3个让你无法拒绝的理由 【免费下载链接】keylogger Keylogger for Windows. 项目地址: https://gitcode.com/gh_mirrors/keylogg/keylogger 你是否曾经需要监控自己的电脑使用情况,或者为技术研究寻找一个轻量…...

OBS多路推流插件技术深度解析:构建分布式直播分发系统的架构实践

OBS多路推流插件技术深度解析:构建分布式直播分发系统的架构实践 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 技术现状分析与行业痛点 在当前的实时流媒体生态中&#x…...

告别手动拷贝!用Qt Creator远程调试嵌入式Linux应用(保姆级配置流程)

告别手动拷贝!用Qt Creator远程调试嵌入式Linux应用(保姆级配置流程) 嵌入式开发中,最令人头疼的莫过于反复的"编译-拷贝-运行/调试"循环。每次修改代码后,都需要手动将可执行文件拷贝到开发板,再…...

【目录】运筹优化

运筹学篇章已全部更新完毕......运筹学开篇搜索理论基础线性规划之单纯形法线性规划的对偶理论线性规划之内点法单纯形法的补充与代码实现最短路与动态规划(一)最短路与动态规划(二)最短路与动态规划(三)网…...

不用OWL/RDF!Function 和 Action 在本体智能平台中的重要性体现

—— 从“语义建模”走向“可执行本体智能” 很多人初次接触企业级本体,总会陷入固有认知:将本体等同于传统知识图谱,或是OWL/RDF这类语义网标准的商业落地,执着于用标准化语法表达概念、关系与推理规则。行业内也有Palantir这类平…...

AI智能体如何革新LaTeX写作:PaperDebugger深度集成Overleaf实践

1. 项目概述:当AI助手遇上LaTeX写作如果你是一名科研工作者、研究生,或者任何需要和LaTeX文档打交道的人,那么下面这个场景你一定不陌生:深夜,你对着Overleaf编辑器里密密麻麻的代码和公式,反复修改着论文的…...

Xendit支付网关MCP服务端:东南亚支付集成的架构设计与工程实践

1. 项目概述:一个面向东南亚支付场景的MCP服务端最近在对接东南亚市场的支付业务时,遇到了一个挺有意思的挑战:如何高效、安全地集成Xendit这家东南亚主流的支付网关。Xendit提供的API功能强大,覆盖了印尼、菲律宾等国的多种本地化…...

前后端分离林业产品推荐系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展,林业产品的销售和推广方式逐渐从传统线下模式转向数字化和智能化。林业产品种类繁多,消费者在选购时往往面临信息不对称的问题,难以高效匹配自身需求。同时,林业企业也缺乏精准的用户画像和推荐机制&…...

1.7.3 掌握Scala函数 - 神奇占位符

本次Scala函数实战主要聚焦于“神奇占位符”下划线(_)的灵活运用,通过三个递进的案例深入理解其简化代码的核心作用。 演示过滤列表:利用 filter 方法,对比了常规匿名函数与使用占位符的写法,直观展示了如何…...

我让 AI 学会了“拆“App——Antigravity 逆向分析能力搭建手记

你能想象吗?对着 AI 说一句"帮我分析这个 APK",它就自己打开 IDA、拆解代码、Hook 运行时、提取密钥、还原源码……全程不用你碰一下鼠标。先说结论我给 AI 编程助手 Antigravity 装上了 4 把"瑞士军刀",让它从一个只会写…...