资讯详情

资讯详情

Java开发者AI应用实战:Spring AI与LangChain4j框架解析

这两年 AI 的热度有多高不用我多说。但你发现没有朋友圈、技术群里聊 AI 应用的十个里有八个是 Python剩下两个在学 Python 的路上。搞得不少 Java 后端的朋友心里直打鼓难道 Java 真的要在 AI 时代掉队了自己深耕多年的技术栈说没用就没用了我先给个明确结论Java 不仅没掉队反而在 AI 应用落地的后半场优势越来越明显。尤其是到了 2026 年随着 Spring AI 和 LangChain4j 这两大 Java AI 框架逐渐成熟你用纯 Java 技术栈构建企业级 AI 应用已经不是什么新鲜事而是实实在在的可行方案。这篇文章我不打算讲那些虚头巴脑的概念而是从一个 Java 开发者的实际视角出发把这两个框架的核心玩法、落地步骤、还有我踩过的坑一次性给你讲透。看完你会发现告别 Python 内卷用 Java 玩转 AI路径比你想象的更清晰。1. 为什么 Java 开发者不需要焦虑AI 应用开发的底层逻辑变了在进入框架细节之前我想先聊聊一个更根本的问题为什么说 Java 开发者现在入场 AI反而是个好时机1.1 Python 的优势在“训练”Java 的优势在“应用”很多人一提起 AI 就想到 Python是因为 Python 在 AI 模型训练阶段有绝对统治力——PyTorch、TensorFlow 这些深度学习框架的生态太强了学术界和算法工程师几乎全在这个圈子里。但你仔细想想现在真正赚钱、真正有业务价值的场景是什么是训练一个 GPT 级别的大模型吗绝大多数公司没这个实力也没这个必要。大家真正在做的事情是把现成的、别人已经训练好的大模型集成到自己的业务系统里——比如做智能客服、知识库问答、文档分析、代码助手。这些场景考验的是系统工程能力而不是算法能力。换句话说AI 应用开发的重心已经从“怎么训出模型”转移到了“怎么把模型用好”。而“用好”一个 AI 模型本质上就是对接 API、处理数据、编排流程、管理状态、保证并发和稳定性。这些恰好是 Java 后端开发者最擅长的领域。Java 在大型企业级应用中的沉淀比如 Spring 生态、微服务治理、高并发处理、严谨的类型系统到了 AI 应用时代不但不过时反而成了构建可靠 AI 系统的基石。1.2 零基础通关的真实含义不需要懂算法但要懂工程我见过很多 Java 开发者一听说 AI 就下意识觉得门槛高觉得自己数学不行、算法不会学不了。这里我想澄清一个误区如果你走的是应用开发方向你真的不需要去啃反向传播、Transformer 原理这些底层知识。你用 Spring AI 或 LangChain4j 开发一个 AI 应用本质上做的事情跟开发一个普通 CRUD 接口没有太大区别——定义请求参数、调用服务、处理响应、返回结果。框架帮你把大模型的 API 封装好了把 Prompt 模板化管理了把对话记忆、工具调用这些复杂逻辑都处理掉了。你要做的是理解这些组件的用途然后把它们拼装起来解决具体的业务问题。这不就是 Java 程序员每天都在做的事吗1.3 告别内卷的另一个含义差异化竞争说实话现在 Python 方向的 AI 应用开发已经很卷了——培训班出来的人都会用 FastAPI 调一下 OpenAI 的接口都会写个简单的 RAG 脚本简历上全是类似的烂大街项目。但能在企业级场景中把 AI 能力稳定地嵌入到高并发、高可用的核心业务链路里的开发者仍然稀缺。如果你能用 Java 体系把这件事做好你的竞争差异一下就拉开了。你能跟现有的后端代码无缝集成你能用上企业级的安全方案和监控体系你能让 AI 功能真正成为核心业务的一部分而不是一个漂浮在边角料位置的 Demo。这才是“告别内卷”的正确打开方式。2. 两大 Java AI 框架核心拆解Spring AI 与 LangChain4j现在进入正题。目前 Java 生态里最值得你花时间去学的两大 AI 框架就是 Spring AI 和 LangChain4j。我在实际项目中都用过各有各的脾气也各有各的绝活。下面结合项目实战经验给你做个深度拆解。2.1 Spring AI官方背书的 AI 开发标准如果你用过 Spring Boot那么上手 Spring AI 的成本几乎为零。它是由 Spring 官方团队推出的项目目标很直接把 AI 能力打造成 Spring 生态的一等公民让开发者可以用我们最熟悉的依赖注入、自动配置、约定大于配置这套玩法去对接各种大模型。核心特征一高度抽象的 ChatClient用过 Spring 的老哥们都知道JdbcTemplate 这类 *Template 组件在 Spring 中的地位。Spring AI 里的 ChatClient 就是同样的思想——它把与大模型交互的底层细节全部封装好你只需要注入一个 ChatClient 实例然后调用它的方法就能完成一次对话。Service public class AIService { private final ChatClient chatClient; public AIService(ChatClient.Builder builder) { this.chatClient builder.build(); } public String chat(String message) { return chatClient.prompt() .user(message) .call() .content(); } }你看就这么简单。没有复杂的 HTTP 调用代码不需要自己去维护 API 密钥的请求头几行代码就能实现一个基础的 AI 对话能力。对于习惯了 Spring 风格的开发者来说这种体验非常自然。核心特征二结构化输出与类型安全这是我在实际项目中最喜欢的一个特性。业务开发中我们调用大模型绝不仅仅是为了聊聊天更多时候是希望从模型返回的文本中提取出结构化数据比如从一段用户反馈里提取用户意图和情感倾向。纯文本返回下解析逻辑又脆弱又难维护。Spring AI 直接支持把模型输出映射成 Java Bean非常优雅。public record SentimentAnalysis(String sentiment, double confidence, String summary) {} SentimentAnalysis result chatClient.prompt() .user(分析这段评论的情感倾向...) .call() .entity(SentimentAnalysis.class);这里使用了 Java 的 Record 类作为返回结构框架会自动引导模型按 JSON 格式输出并且完成反序列化。类型安全、编译期就能发现问题这真的很“Java”。核心特征三与 Spring 生态无缝融合Spring AI 的杀手锏在于它不是孤立存在的。你可以直接在 AI 相关的 Service 里注入其他业务 Service让 AI 能力与你的传统业务逻辑在同一个事务里协作你可以用 PreAuthorize 注解给 AI 接口加上权限控制你可以用 Spring Cloud 的组件对 AI 服务做负载均衡和链路追踪。这种自然融入现有架构的程度LangChain4j 目前还差点意思。2.2 LangChain4j面向 AI 开发者的瑞士军刀LangChain4j 的定位我觉得更像是 Python 界大名鼎鼎的 LangChain 的 Java 版本但它并不是简单的翻译移植而是针对 Java 生态做了大量优化。如果说 Spring AI 走的是“让 Java 开发者无缝进入 AI 世界”的路线那 LangChain4j 走的是“给 Java 开发者提供最灵活的 AI 开发工具箱”的路线。核心特征一极其丰富的模型与向量数据库支持LangChain4j 在接入层的覆盖面非常广。除了 OpenAI、通义千问这类主流大模型 API它还支持大量本地模型部署方案——比如你通过 Ollama 在本地跑一个 Qwen或者用 vLLM 部署一个开源模型LangChain4j 都能轻松对接。向量数据库方面更是惊人从开源的 Chroma、Qdrant到商业化的 Milvus、Redis Search再到云服务商的向量检索产品基本上你能想到的它都有对应的集成。我在做一个企业知识库系统时底层用的就是 LangChain4j 加 Docker 部署的 Qdrant。整个对接过程极其顺滑我只写了少量配置代码就把文本的向量化存储、相似度检索这些功能全部跑通了。这在半年前可能得自己手写一大堆 HTTP 调用逻辑。核心特征二原生支持 AiServices 与工具调用范式LangChain4j 提出了一个叫 AiServices 的概念我个人觉得这是它最强的一个设计。简单说它可以让你把 AI 能力包装成一个普通的 Java 接口——你定义接口比如public interface CustomerServiceAssistant { String answer(String question); }然后通过 AiServices 构建一个代理对象。这个代理对象会自动管理对话历史、调用你指定的工具方法、并把最终结果整理好返回。这种“面向接口编程”的思想Java 开发者再熟悉不过了它让 AI 逻辑的单元测试变得非常容易。我可以直接在测试里注入一个 Mock 的模型服务验证我的工具调用逻辑是否正确这在纯 Prompt 工程时代几乎是不可能做到的。核心特征三灵活的 Prompt 模板与输出解析LangChain4j 的 Prompt Template 系统也做得相当成熟。你可以用类似 Thymeleaf 的语法定义 Prompt 模板在运行时动态填充变量也可以给模型输出定义严格的 JSON Schema 约束配合框架提供的 OutputParser实现比 JSON Mode 更精细的格式化控制。2.3 两大框架怎么选一张表看懂差异说了这么多我用一张表格做个直观对比方便你根据自己的情况做选择对比维度Spring AILangChain4j出身背景Spring 官方团队社区驱动借鉴 LangChain 理念上手门槛低Spring 开发者几乎零成本中概念稍多需要理解 AiServices 等模式模型接入覆盖面广主流大模型 API 都支持极广本地模型和向量数据库支持更丰富与 Spring Boot 集成度原生级无缝融合良好有 Spring Boot Starter但部分功能需自行组装结构化输出简洁优雅Record 直接映射灵活支持 JSON Schema 和自定义解析器工具调用/Function Calling支持支持且 AiServices 模式更灵活RAG 支持有提供基础组件极强大量现成的 Embedding 和 Retriever 实现适合场景已经深陷 Spring 生态想快速加入 AI 能力的团队AI 功能复杂、需要高度定制化、追求极致灵活性的团队我的建议是如果你是 Spring Boot 的重度用户团队原有业务系统全是 Java 技术栈先从 Spring AI 开始平滑过渡能最快看到效果。如果你要做的是一个 AI 原生应用——比如 AI Agent、复杂的 RAG 系统、或者需要对接多种异构模型LangChain4j 的灵活度会让你后期省很多事。3. 零基础通关实战从零搭建一个 Java AI 智能问答系统光说不练假把式。这一节我带你完完整整走一遍实战流程从创建项目开始到最后跑通一个能解析 PFD 文档并进行问答的智能助手——这个场景在职场里有多常用不用我多说了吧项目里的很多同事就是在处理各种产品手册、合同文档时痛不欲生有了这个功能效率直接翻倍。我将使用 Spring AI 作为主框架因为对新手更友好整个项目跑通大概只需要二十分钟。3.1 开发环境与前置准备在动手之前你需要把下面这些东西准备好。这里我按 macOS / Windows / Linux 通用来写不特定某个系统JDK 17 及以上Spring AI 3.x 版本要求 JDK 17如果你还在用 JDK 8建议趁这个机会升级一下Maven 3.6 或者 Gradle 7.x一个可用的 LLM API Key推荐用 OpenAI 格式兼容的服务商或者硅基流动、阿里云百炼等国内平台的 API都很方便IntelliJ IDEA社区版就够用不强制3.2 创建项目并引入依赖直接去 Spring Initializr 生成一个基础工程或者在你现有的 Spring Boot 项目里加依赖。核心依赖如下dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId version1.0.0-M6/version /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-vector-store-pgvector/artifactId version1.0.0-M6/version /dependency注意Spring AI 目前版本更新极快我这里用的是 1.0.0-M6 的版本号等你看到这篇文章时正式版可能已经发布了。版本策略建议参考官方文档尽量选正式发布版本避开里程碑版本因为里程碑版之间 API 变动比较频繁。3.3 核心业务代码文档上传、向量化与检索问答接下来我直接给出核心代码每一步都会配上解释。第一步配置 application.ymlspring: ai: openai: api-key: ${OPENAI_API_KEY} base-url: ${OPENAI_BASE_URL:https://api.openai.com} chat: options: model: gpt-4o-mini temperature: 0.2 vectorstore: pgvector: initialize-schema: true这里有个关键点base-url一定要配置成可覆盖的这样你后面想换成国内其他兼容 OpenAI 协议的服务商时只需要改环境变量不用动代码。第二步写文档解析与向量化存储的服务Service public class DocumentIngestionService { private final VectorStore vectorStore; public DocumentIngestionService(VectorStore vectorStore) { this.vectorStore vectorStore; } public void ingestPdf(MultipartFile file) { // 1. 解析 PDF 文件内容 PdfReader reader new PdfReader(file.getInputStream()); // 2. 将内容按章节切分成块 ListDocument documents new ArrayList(); // 实际开发中建议使用 Spring AI 提供的 TikaDocumentReader // 这里为了演示简化处理 Document doc new Document(extractText(reader)); documents.add(doc); // 3. 向量化并存入向量数据库 vectorStore.add(documents); } }实际项目中解析 PDF 可以直接用 Spring AI 提供的TikaDocumentReader它内部封装了 Apache Tika能自动识别 PDF、Word、Markdown 等十几种格式。切分文本块时建议开启段落切分策略避免把一个完整段落拦腰截断导致检索时上下文丢失。第三步写检索问答的 ControllerRestController RequestMapping(/api/chat) public class ChatController { private final ChatClient chatClient; private final VectorStore vectorStore; public ChatController(ChatClient.Builder builder, VectorStore vectorStore) { this.chatClient builder.build(); this.vectorStore vectorStore; } PostMapping(/ask) public String ask(RequestBody QuestionRequest request) { // 1. 先在知识库中检索相关内容 ListDocument similarDocs vectorStore .similaritySearch(SearchRequest.query(request.question()) .withTopK(5) .withSimilarityThreshold(0.6)); // 2. 拼装 Prompt把检索结果作为上下文 String context similarDocs.stream() .map(Document::getText) .collect(Collectors.joining(\n\n---\n\n)); String promptTemplate 你是企业的智能客服助手。请仅基于以下知识库内容回答问题。 如果知识库中没有相关信息请明确告知用户你不知道。 知识库内容 %s 用户问题%s .formatted(context, request.question()); // 3. 调用大模型 return chatClient.prompt() .user(promptTemplate) .call() .content(); } }这个案例已经涵盖了 RAG检索增强生成的核心链路文档上传 - 解析切分 - 向量化存储 - 语义检索 - 拼装 Prompt - 调用模型生成回答。你照着这个流程走一遍就能跑通一个非常实用的企业知识库问答系统。3.4 为什么检索阈值要设成 0.6聊聊相似度阈值的学问在上面的示例里我设置了withSimilarityThreshold(0.6)。这个值不是拍脑袋拍的背后是有讲究的。向量相似度在不同模型和不同向量数据库里的分数意义不一样。拿 pgvector 默认的余弦相似度来说分数范围是 -1 到 1但在实际文本检索场景中大部分正常结果的相似度都在 0.5 到 0.9 之间。设成 0.6意味着我允许系统把那些“有一定相关性但不是完全命中”的文档也检索出来扩大上下文覆盖面。如果你的知识库文档质量很高、问题很明确可以把这个值往上调到 0.7 甚至 0.75提高检索精确率。反之如果你的文档内容杂糅、用户问题比较发散可以适当调到 0.5 左右宁可多给模型一些上下文让模型自己判断哪些是真正有用的信息。这个阈值得靠你实际测试多调几轮没有一个放之四海而皆准的值。4. 从 Demo 到生产Java AI 应用落地的关键进化把 Demo 跑通只是第一步。真正让 AI 功能在企业系统里稳定运行还有很多坑要趟这也是 Java 技术栈相比 Python 技术栈的隐蔽优势所在——整个生态体系里的工程化工具你都可以直接用来保护 AI 功能。4.1 对话记忆别让 AI“失忆”很多新手在做对话应用时都会遇到这样的问题模型上一次回答的内容下一次提问时就忘了。这是因为默认情况下你每次调用模型都是无状态的模型不保存任何历史对话。解决方法是引入 Conversation Memory。Spring AI 里有MessageChatMemoryLangChain4j 里有MessageWindowChatMemory思路都是一样的——把历史对话按时间窗口或消息条数保存起来每次请求时把历史记录一并传给模型。但这里有个工程问题内存里的对话历史在分布式部署下不止一个人在用怎么隔离答案是类似 Session 的机制——你可以给每个用户生成一个唯一的 conversationId存储在 Redis 中。Spring AI 的ChatMemory接口允许你按 conversationId 存取历史消息这样用户 A 和用户 B 的上下文就不会互串。这一块儿Java 生态里的 Redis、分布式缓存方案你都是现成的拿出来直接用就行。4.2 提高响应可靠性结构化输出与自动重试生产环境的接口最怕模型“开小差”返回一堆无法解析的内容。我之前在用 LangChain4j 对接一些开源模型时遇到过模型偶尔返回的 JSON 不合法的情况。解决方案有两个层面第一在 System Prompt 中明确要求 JSON 输出并给出严格的 Schema 示例这是软约束。第二在代码层面做硬兜底——解析失败时捕获异常自动重试一次如果重试仍失败就返回一个默认的错误响应。这个兜底逻辑本质跟你处理外部 HTTP 调用超时是一回事。Spring AI 的chatClient.call().entity(Class)方法内部已经做了输出格式的自动纠正逻辑我的经验是对于 GPT-4o 及以上级别的模型结构化输出成功率非常高。但对于一些小参数模型还是建议你手动加上重试和异常兜底别依赖框架的“智能”。4.3 成本控制与性能优化别再傻乎乎地全量塞上下文很多 RAG 新手有一个坏习惯把所有检索到的文档全部一股脑塞进 Prompt 里。这会导致两个问题一是 Token 消耗飙升成本爆炸二是上下文过长模型对关键信息的注意力反而被稀释。我的做法是把检索到的文档按相似度分数降序排列优先取分数最高的前 3 段并把每段控制在一定长度比如 1000 字符以内。这样既保证了信息相关度又控制了 Token 开销。如果确实需要更多上下文可以再叠加一个“内容摘要”的预处理的步骤——把多段文档提前用模型压缩成一段摘要。这一步的代码就不贴了核心思路就是先调用一次小模型做文本压缩再把摘要作为上下文给大模型。4.4 安全合规AI 应用不可忽视的底线聊点可能不太好听但必须说的事。在企业里做 AI 功能如果直接把员工上传的内部文档喂给公网大模型 API不出事则已出事就是大事。数据脱敏和私有化部署已经不是一个可选项而是必选项。我的建议是敏感业务场景优先使用私有化部署的开源模型通过 Ollama 部署 Qwen 或 GLM或者使用云服务商提供的专有 VPC 部署方式。同时在 Prompt 中明确限制模型的输出范围——比如“只回答与知识库相关的问题拒绝回答诱导性、越狱类提示词”。Spring AI 也提供了Advisor机制可以编写一个全局的提示词过滤器。我在给客户做的系统里就加了一个自定义 Advisor专门用于拦截包含“忽略之前的指令”、“解除限制”等关键词的恶意输入。5. 从零基础到熟练Java AI 开发者的学习路线建议最后聊点实际的学习路径规划。我知道很多人看完上面的内容会觉得“好像懂了”但真要自己动手还是不知道从哪开始。这里我给出一个可以直接照着做的路线图。5.1 第一阶段打好基础理解核心概念1-2周不要一上来就撸代码。先用一周时间把 AI 应用开发的核心概念搞清楚什么是 Token什么是 Prompt 工程什么是 Embedding 向量化什么是 RAG什么是 Function Calling这些概念你不一定需要深究数学原理但一定要知道它们解决什么问题。学习材料方面我强烈推荐去看 Spring AI 和 LangChain4j 的官方文档两个文档都写得不错而且有大量可运行的示例代码。你把官方文档里的 Quick Start 跑一遍比看任何视频教程都管用。5.2 第二阶段动手实践跑通一个完整场景2-3周选一个你熟悉的业务场景比如“公司内部知识库问答机器人”、“智能客服工单分类助手”、“代码 Review 助手”。从最简单的 Chat Completion 开始逐步加上 RAG再加上结构化输出最后加上对话记忆。这个阶段的目标不是做得多漂亮而是把一条链路完整打通。等你亲手把一个完整的 AI 应用从零写出来、跑起来你会发现之前积累的 Java 后端经验全部被激活了——你只是在用新的组件解决你本来就擅长解决的问题。5.3 第三阶段深入原理构建核心竞争力持续进行当你把基本流程跑通后想跟别人拉开差距就需要往深走一层。这时候你要关注的是如何优化 Prompt 让模型输出更稳定如何评估 RAG 的检索质量如何做模型调优Fine-tuning如何设计 AI Agent 的多步推理流程这个阶段LangChain4j 的 AiServices 和 Agent 相关功能值得花时间研究。它代码量很少但设计思想极为精炼你读源码的过程就是一次实实在在的架构能力提升。6. 常见问题与避坑实录最后我把这段时间看到的、自己被坑过的高频问题整理成一个速查表希望能帮你躲开一些明显的雷区。6.1 问题速查表问题现象可能原因解决方案调用模型时报 401 认证错误API Key 错误或未正确配置环境变量检查 application.yml 中的api-key配置确认使用Value注解注入环境变量避免硬编码模型返回内容总是重复Temperature 参数设置过低将 temperature 适当调高到 0.5-0.7给模型一点“随机性”RAG 检索到的内容与问题完全无关Embedding 模型与检索问题不匹配确认向量化和检索使用同一个 Embedding 模型不要混用向量数据库连接超时连接池配置过小或数据库本身性能瓶颈调大连接池和超时时间对大量文档分批次写入避免一次性提交对话历史越来越长导致 Token 爆掉没有设置对话窗口大小使用 MessageWindow 时限定窗口大小为 10-20 条历史消息超出自动丢弃Spring AI 版本升级后代码报错API 变动关注 CHANGELOG大版本升级前先在小项目里测试迁移6.2 三个独家建议建议一先小后大不要一上来就追求“全能 AI”。很多人刚开始做 AI 应用总想着做一个能回答所有问题的超级助手。实际上把场景限定得越窄模型的输出质量越高。比如“只回答公司产品使用问题”“只分析销售数据报表”限定范围后的效果远超开放域的通用聊天。建议二模型能力不够多用提示词凑提示词凑不够再想换模型。我在项目里遇到过模型回答质量差的问题第一反应是换更强的模型后来发现把 System Prompt 从一句话扩写成一段带示例的详细说明后模型表现提升非常明显。很多时候不是模型不行是引导不够到位。建议三务必做好 AI 功能的后备方案。企业应用中不能因为大模型 API 超时核心业务流程就挂掉。我在生产环境里给 AI 调用加了一层熔断连续失败三次自动返回兜底文案比如“智能助手暂时无法使用请稍后再试”。这个降级逻辑虽然简单但在关键时刻能救你一条命。作为一个从 Java 传统后端半路转向 AI 应用开发的从业者我太理解那种面对新技术的心理压力了。但这两年走下来我最深的体会是AI 应用开发真的没有想象中那么神秘它更多的是一场工程能力的比拼而不是算法能力的较量。你之前所有的 Java 经验——Spring 的依赖注入、模块化设计、异常处理、性能调优——到了 AI 应用时代没有一样是浪费的它们全都会成为你构建高质量 AI 系统的底气。2026 年Java AI 框架的生态只会越来越成熟现在入场时机刚刚好。别指望看几篇文章就瞬间成为专家真正的能力提升藏在你亲手写完一个完整项目的那个瞬间。挑个小场景动手吧。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →