ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java大模型应用开发实战:Spring AI、LangChain与Agent全解析

Java大模型应用开发实战:Spring AI、LangChain与Agent全解析 这次我们不聊某个具体工具而是完整拆一套 Java 大模型应用开发的实战路线Spring AI、Spring AI Alibaba、LangChain、Agent、大模型面试全部串在一个学习闭环里。如果你是一个 Java 后端工程师最近想接大模型能力但不知道先学什么、先搭什么、面试会被问什么这贴可以直接当导航图用。先说结论Java 生态做大模型应用核心不是去写 Python而是把模型调用、提示词管理、工具调用、向量检索、工作流编排这些能力用你熟悉的 Spring Boot 方式封装成服务。Spring AI 是 Spring 官方给出的答案Spring AI Alibaba 是阿里在它之上的企业级增强LangChain 则提供了一套值得参考的应用设计范式Agent 是当前落地价值最高的架构方向。这篇文章会按“技术全景 - 环境准备 - 本地模型接入 - 功能测试 - Agent 实战 - 批量工程化 - 面试考点”的顺序展开全程给可执行步骤和代码模板。本文覆盖内容比较多建议先收藏再跟着做。第一遍先跑通“Spring AI Ollama 本地模型”的最小对话接口第二遍再来看 Agent 和 Graph 工作流最后一节面试考点可以直接当复习提纲。1. 核心知识全景速览技术栈定位解决什么问题适合人群Spring AISpring 官方 AI 框架统一对接大模型接口让 AI 能力以 Spring Boot Starter 方式接入Java / Spring 后端开发者Spring AI Alibaba阿里开源连接通义千问等国内模型提供 Graph 工作流、Agent 样例、Skills 等生产级能力使用阿里云、需要中文大模型的团队LangChain大模型应用编排范式定义 Chain、Memory、Retriever、Agent 等应用抽象需要方法论参考的 Java 开发者Agent应用架构让大模型自主规划、调用工具、完成任务做自动化和复杂工作流的开发者大模型面试能力验收考察对模型原理、框架理解、工程落地的深度准备面试的 Java 工程师这条路线里Spring AI 是骨架Spring AI Alibaba 是扩展库LangChain 是思想参考Agent 是最终落地形态。四者不是互相替代而是层层递进。2. 适用场景与学习路线2.1 适合谁去学如果你符合下面任意一条这条学习路线对你是有价值的熟悉 Java 和 Spring Boot想把大模型能力集成进现有业务系统。公司有私有化部署需求需要把开源模型或云端模型封装成内部 API。负责知识库问答、工单自动回复、内容审核、报表生成这类业务场景。准备面试岗位描述里出现 Spring AI、LangChain、Agent 关键词。2.2 不太适合的场景这条路线不是万能的。如果你要做深度模型训练、模型微调底层算法、分布式训练框架Spring AI 帮不上什么忙那是算法工程师的范畴。如果你只想快速搭一个纯前端 Demo后端不归你管也不需要从 Java 后端的角度深挖这些框架。2.3 建议学习顺序先跑通一个最小可用的 Spring AI 对话接口无论接云端 API 还是 Ollama 本地模型。再做 Prompt Template 和结构化输出理解提示词工程在 Java 里怎么写。引入向量数据库做 RAG 知识库问答。学 Function Calling把 Agent 工具调用跑通。最后看 Spring AI Alibaba 的 Graph 工作流理解复杂 Agent 如何编排。过程中穿插面试题复习把概念和实现对应起来。3. 环境准备与前置条件3.1 基础环境依赖项要求说明JDK17 及以上Spring Boot 3.x 强制要求Maven3.6也可用 GradleSpring Boot3.x需要与 Spring AI 版本匹配IDEIntelliJ IDEA / Eclipse推荐 IDEA模型服务云端 API 或 Ollama 本地模型二选一即可3.2 模型来源选择本地方案建议用 Ollama。它是一个非常轻量的本地模型运行工具能直接拉取 Qwen、Llama 等开源模型并且提供了 OpenAI 兼容的 HTTP 接口对 Spring AI 非常友好。首次安装后只需要两条命令# 拉取模型这里以 Qwen 7B 为例 ollama pull qwen2.5:7b # 启动服务默认端口 11434 ollama serve云端方案则选择 OpenAI、通义千问、DeepSeek 等平台的 API Key。如果团队对数据隐私有要求优先本地部署如果追求响应速度和效果优先云 API。3.3 创建一个最小 Spring Boot 工程在 Spring Initializr 或 IDE 里创建工程时注意勾选 Spring Web。然后手动引入 Spring AI 相关依赖。由于 Spring AI 版本迭代较快这里给出依赖模板具体版本以你引入的 Spring AI BOM 为准dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.0.0/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement引入本地 Ollama 模型 Starterdependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-ollama-spring-boot-starter/artifactId /dependency如果你的工程用云端 OpenAI 兼容接口则把上面的依赖替换为spring-ai-openai-spring-boot-starter。版本号建议统一由 BOM 管理避免多个模型依赖之间版本冲突。4. 本地大模型部署与 Spring AI 接入4.1 配置 application.yml以 Ollama 本地模型为例配置文件里的重点是 base-url 和模型名。Ollama 默认端口是 11434spring: application: name: ai-service ai: ollama: base-url: http://localhost:11434 chat: model: qwen2.5:7b options: temperature: 0.7如果你的机器配置不高可以换成更小的模型比如qwen2.5:3b甚至qwen2.5:1.5b。模型名必须是你本地已经ollama pull过的名字否则调用时会报模型不存在。4.2 编写 ChatService 和 ControllerSpring AI 提供的核心 API 是ChatClient。这个类负责把用户输入、系统提示词、工具列表统一封装然后调用模型。下面是 Web 层可以直接用的最小服务import org.springframework.ai.chat.client.ChatClient; import org.springframework.stereotype.Service; Service public class ChatService { private final ChatClient chatClient; public ChatService(ChatClient.Builder chatClientBuilder) { this.chatClient chatClientBuilder.build(); } public String chat(String userMessage) { return chatClient.prompt() .user(userMessage) .call() .content(); } }import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/ai) public class ChatController { private final ChatService chatService; public ChatController(ChatService chatService) { this.chatService chatService; } PostMapping(/chat) public String chat(RequestBody ChatRequest request) { return chatService.chat(request.message()); } }请求体用一个简单的 record 接收即可public record ChatRequest(String message) { }启动 Spring Boot 应用后用 curl 做一次冒烟测试curl -X POST http://localhost:8080/ai/chat \ -H Content-Type: application/json \ -d {message: 你好请用一句话介绍你自己}如果配置正确响应会返回一段模型生成的文本。这个接口看起来简单但它已经把 Spring AI 的自动配置、模型调用、结果解析全链路打通了。后续所有复杂功能包括 RAG、Agent、批量任务都是在这个接口能力之上叠加。5. Spring AI 功能测试与效果验证接口跑通只是第一步。要做功能测试建议按下面几个维度逐项验证。5.1 单轮对话测试测试目的确认模型接入、提示词传递、结果返回都正常。输入示例{ message: 用 3 个要点解释什么是大模型 Token }判断标准返回内容合理、无报错、响应时间在可接受范围内。如果响应时间过长检查是否第一次加载模型或者模型体积过大。5.2 Prompt Template 测试业务场景里提示词往往不能写死在代码里。Spring AI 支持 Prompt Template用占位符填充便可以使用。例如public String generateSummary(String content) { return chatClient.prompt() .user(spec - spec.text(请对下面内容做摘要字数不超过 200 字{content}) .param(content, content)) .call() .content(); }测试时要特别关注大文本场景。如果 content 超过模型上下文窗口会报输入超长错误。5.3 多轮对话 Session 测试单轮对话不携带历史上下文。要支持多轮对话通常需要把历史消息一起传给模型。Spring AI 里可以通过ChatMemory管理会话记录。测试重点是模型能否记住前文关键信息、历史消息会不会导致上下文超长。建议每次都传最近几轮消息而不是全量历史。5.4 结构化输出测试实际业务中经常需要模型返回 JSON 而不是自然语言。例如让模型从一段文本里抽取实体或者分类成“投诉 / 咨询 / 建议”。Spring AI 支持把模型输出绑定到 Java 实体上。这类测试要重点验证字段映射和格式稳定性。模型偶尔会多返回解释性文字导致解析失败所以代码里要做好异常兜底。5.5 验证失败时怎么排查现象排查方向403 或 401API Key 无效、模型没权限模型不存在检查 model 字段是否和 Ollama 拉取的名称一致响应乱码检查请求和响应编码统一 UTF-8超时模型首次加载、网络慢、上下文过长6. Spring AI Alibaba 与 Graph 工作流Spring AI Alibaba 是阿里巴巴开源的 Spring AI 扩展实现。它的价值主要有两点一是把通义千问等国内模型接入方式做成了 Spring Boot Starter降低国内开发者的接入成本二是提供了比单轮 Chat 更复杂的应用编排能力例如 Agent Demo、Skills、Graph 工作流。Graph 工作流是目前 Agent 工程化的重要方向。简单说它把“一个 Agent 做一件事”扩展成“多个节点组成的执行图”。比如一个客服系统可以拆成意图识别节点、知识库检索节点、人工回复生成节点、情绪安抚节点。每个节点固定处理一类任务节点之间用边来连接数据在节点之间流转。LangChain 那边的 LangGraph 是同样的思路热词里也经常见到“langgraph 和 langchain 的区别”这个问题。Java 开发者学 Spring AI Alibaba Graph重点不是背 API而是理解这种节点编排模型。同一个问题放到工作流里代码结构会更清晰也更容易做监控和失败重试。某个节点挂了可以只重跑该节点而不用整个链路重来。如果你用阿里云的 DashScope 模型服务Spring AI Alibaba 的配置方式通常是设置 API Key 和模型名然后通过类似 ChatModel 的抽象调用。具体的包名和版本以项目文档为准建议直接参考官方仓库的 agent-demo 样例来启动第一个项目。7. LangChain 核心概念与 Java 生态对照LangChain 最初是 Python 生态的大模型应用框架后来 JS 也有对应版本。Java 开发者不需要死磕 Python但可以把它的抽象设计搬到 Java 生态里。Spring AI 和 LangChain4j 都是很好的 Java 载体。7.1 核心概念对照表LangChain 概念含义Java 生态对应Model大模型封装Spring AI ChatModel / OllamaChatModelPrompt Template提示词模板Spring AI PromptTemplateMemory对话记忆Spring AI ChatMemoryRetriever检索器Spring AI VectorStore / DocumentRetrieverChain调用链Spring AI 中的 ChatClient 链式 APIAgent自主智能体Spring AI 工具调用 Function CallingTool外部工具Spring AI Tool 注解7.2 怎么理解 LangChain 在 Java 里的存在形式最直接的方式是把 LangChain 当成“问题域词典”。例如它把“交给模型执行的任务”抽象成 Chain把“从外部数据库找答案再生成”的流程抽成 RetrievalQAChain。你在 Java 里不一定要引 LangChain 依赖但 Spring AI 提供的同样抽象你该认识。例如 RAG 问答在 Java 里一般是三步加载文档 - 向量化 - 检索后塞进 Prompt。这个流程对应 LangChain 里的 DocumentLoader VectorStore Retriever。用 Spring AI 时只需要关注 VectorStore 接口和 ChatClient 的增强提示词流程是完全等价的。7.3 LangChain 与 LangGraph 的区别LangGraph 在 LangChain 基础上加了图状态管理和循环控制更适合构建多步骤 Agent。LangChain 适合简单线性链LangGraph 适合复杂分支和循环任务。面试时如果被问到可以回答LangChain 是基础的链式抽象LangGraph 是更重的状态图编排主要用于需要多轮工具调用或分支决策的 Agent 场景。8. Agent 应用开发实战思路8.1 Agent 的本质Agent 不是某个具体框架而是一种“模型 工具 循环”的架构。当模型遇到无法直接回答的问题时它会决定调用某个工具然后把工具返回的结果继续交给模型推理直到得到最终答案。这个过程叫 ReAct 循环。这里最关键的工程能力是 Function Calling也就是模型能从自然语言里识别出“需要调用哪个函数函数参数是什么”。8.2 一个最小 Agent 的设计思路用 Java 实现一个极简 Agent 大概是这个结构public class SimpleAgent { private final ChatClient chatClient; public String run(String userMessage) { String messages 系统提示词你是一个可以调用工具完成任务的助手。; messages 用户问题 userMessage; for (int i 0; i 5; i) { String response chatClient.prompt().user(messages).call().content(); if (response.contains(需要调用工具)) { String toolResult executeTool(response); messages 工具执行结果 toolResult; } else { return response; } } return 已达到最大循环次数无法完成任务。; } private String executeTool(String response) { // 实际工程里通过解析函数名和参数映射到对应方法 return 计算器返回结果42; } }这个例子为了说明流程做了大幅简化。真实工程中模型不会天然返回“需要调用工具”这种字符串而是返回特殊格式的工具调用指令大模型框架会负责解析指令并绑定到具体方法。Spring AI 里可以通过Tool注解给模型暴露工具方法import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Component; Component public class CalculatorTools { Tool(name add, description 计算两个整数相加的结果) public int add( ToolParam(description 第一个加数) int a, ToolParam(description 第二个加数) int b) { return a b; } }当 ChatClient 启动工具调用时Spring AI 会自动把这个方法的信息构造进模型可识别的工具描述里。模型发现用户问题涉及加法就会传入 a、b 的值来调用该方法。整个过程相当于模型的“手”和“眼睛”都由你的 Java 代码控制。8.3 Agent 测试重点Agent 测试不能只看最终结果还要看路由过程和工具调用是否正确工具描述是否足够清晰模型是否在正确的场景调用了正确的工具。工具返回值异常时模型能不能感知并给出兜底回答。循环次数设置是否合理能否避免死循环和 Token 超长。并发调用时工具是否是无状态的是否会造成线程安全问题。9. 批量任务与 API 工程化9.1 批量任务场景很多 Java 后端场景不是单次聊天而是批量处理比如上千条工单自动分类、批量生成商品摘要、批量审核评论。批量调用大模型有两个关键问题成本控制和错误恢复。因为模型 API 是有限流的一次性并发太多会被限流而单条失败会导致整个任务中断。9.2 一个批量调用模板下面是一个使用线程池做并发控制、每条任务独立捕获异常的示例import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class BatchChatService { private final ChatService chatService; private final ExecutorService executor Executors.newFixedThreadPool(8); public BatchChatService(ChatService chatService) { this.chatService chatService; } public ListString batchChat(ListString messages) { ListFutureString futures new ArrayList(); for (String message : messages) { futures.add(executor.submit(() - chatService.chat(message))); } ListString results new ArrayList(); for (FutureString future : futures) { try { results.add(future.get()); } catch (Exception e) { results.add(ERROR: e.getMessage()); } } return results; } }这个模板里没有做重试和降级真实生产环境建议再增加失败重试队列例如把失败的输入收集起来延迟几秒后重新提交。还要注意线程池大小要和模型 API 的 QPS 上限匹配盲目加大并发只会导致大量报错。9.3 接口层设计建议对外暴露批量接口时推荐异步任务 状态查询模式而不是同步等待大批量结果。流程是提交任务时返回 taskId后台线程池依次处理前端轮询获取进度和结果。这样可以避免 HTTP 超时也方便做失败重跑。10. 资源占用与性能观察大模型应用的性能观察要分两种模式。10.1 云端 API 模式云端模式不消耗本地 GPU重点是观察三个指标请求延迟从发出请求到收到完整响应的时间。Token 用量提示词和补全分别消耗多少 Token。成本按 Token 计费上下文越长成本越高。优化手段主要是缓存。对相同输入的请求结果做缓存能显著降低重复调用成本。如果业务允许可以把模型回复流式返回用户体感会更快。10.2 本地模型模式本地模型模式一定要关注显存占用。判断模型能不能跑起来先看模型参数和量化级别。比如 7B 模型用 CPU 也能跑但速度很慢用 4-bit 量化的 7B 模型对显存的要求会明显低于 FP16 精度。具体显存占用需要以本机测试为准不能只看“能加载”就算成功。观察方法# Linux 下查看实时显存占用 nvidia-smi # 查看内存占用 free -h启动 Ollama 加载模型后运行一次对话再观察显存变化。如果出现显存不足可以先换更小的模型或者降低并发数。另外Ollama 默认在模型空闲一段时间后会释放显存有些版本也允许通过环境变量控制空闲保留策略。10.3 如何降低资源占用通用方案有四条换参数量更小的模型、使用量化版本、限制上下文长度、减少批量并发数。先保证功能稳定再逐步提升吞吐。11. 常见问题与排查方法问题现象可能原因排查方式解决方案Spring Boot 启动报依赖冲突Spring AI 版本和 Spring Boot 版本不匹配查看 Maven 依赖树通过 spring-ai-bom 统一版本调用接口返回 401API Key 错误或过期检查配置项重新生成并配置密钥返回“模型不存在”Ollama 里没有对应模型执行ollama list查看执行ollama pull 模型名对话返回内容乱码编码问题或模型输出格式异常检查前后端编码统一 UTF-8检查模型参数上下文超长文本超过模型最大 Token看日志中的长度提示截断文本或使用摘要并发调用大量超时超过 API QPS 限制查看响应状态码降低线程数加重试和退避本地模型推理速度慢CPU 模式或模型过大查看 CPU/GPU 占用换量化模型或换 GPUChatClient 注入失败没有引入对应模型 Starter查看自动配置日志检查依赖是否完整Agent 工具调用一直循环工具描述不清或返回值格式不对打印每次模型输出精简工具描述增加循环上限批量任务部分失败单条请求异常导致中断检查异常日志用独立任务捕获增加重试队列12. 大模型面试高频考点大模型面试题很多但真正和高频关键词相关的考点可以归纳为下面几类。12.1 大模型基础什么是 Token中文场景下 Token 计算有什么特点温度参数 temperature 的作用调大调小分别有什么影响预训练和微调的区别什么时候需要微调什么是 RAGRAG 和微调各自适合什么场景什么是模型幻觉有哪些缓解手段什么是上下文窗口超长输入怎么处理12.2 Spring AISpring AI 的核心编程模型是什么ChatClient和ChatModel有什么区别如何切换不同的大模型服务商如何在 Spring AI 中实现流式输出Spring AI 如何管理对话记忆Spring AI Alibaba 和 Spring AI 官方的关系是什么12.3 LangChain / LangGraphLangChain 中 Chain、Memory、Retriever、Agent 分别解决什么问题LangChain 和 LangGraph 的本质区别Java 生态中 LangChain4j 和 Spring AI 有什么区别一个 RAG 问答链路包含哪些环节12.4 AgentAgent 和普通 API 调用的区别是什么Function Calling 的工作原理是什么ReAct 模式的核心循环是什么多 Agent 协作如何设计什么时候需要多 AgentAgent 常见失败原因有哪些12.5 工程化与系统设计设计一个客服机器人数据从哪来、记忆怎么存、上下文怎么控制大模型 API 调用如何做限流、重试和成本控制如何保证模型输出符合业务 JSON 结构大模型应用上线前要做哪些安全评估面试时不要只背概念尽量结合你自己的项目来讲。比如你跑过 Ollama 本地模型就多提本地部署的显存观察和模型选型你写过批量任务就重点讲限流、重试和失败补偿。这些实践细节比标准答案更有区分度。13. 最佳实践与合规提醒13.1 工程实践第一次跑通时优先用最小的模型和最小的请求体不要一上来就接长文本。所有模型配置都放到配置中心或环境变量不要硬编码在代码里。对模型输出做结构校验尤其是 JSON 场景防止格式变化导致下游解析失败。批量任务一定要有日志和任务表方便失败重跑。接口服务要加鉴权和限流防止被外部恶意刷量。把模型调用封装成独立 Service业务代码不直接依赖具体模型供应商。13.2 合规与安全涉及用户数据、企业敏感信息时先确认是走云端 API 还是本地部署。不能把隐私数据直接发送给第三方大模型 API必须做脱敏和授权评估。如果使用本地开源模型注意模型本身的许可证和商用限制。涉及人脸、声音、版权素材的场景必须取得权利人的明确授权。14. 总结与下一步这条 Java 大模型学习路线里最值得先做的一件事就是跑通一个最小的 Spring AI 对话接口。不管是接云端 API 还是 Ollama 本地模型只要这个接口能返回正常结果你就已经掌握了大模型应用开发的地基。接下来再逐步增加 RAG、Agent 和批量任务难度会平滑很多。最容易踩的坑是版本不匹配。Spring AI 迭代速度快务必使用官方 BOM 管理版本不要在依赖里随便写一个数字。本地模型则要确认模型名和 Ollama 实际拉取的名称完全一致。后续可以继续扩展的方向包括接入更多模型供应商做自动降级、用 Graph 编排复杂 Agent 流程、把 RAG 里的向量库替换为生产级方案、为批量任务增加可视化管理后台。建议直接开一个最小 Spring Boot 工程把这篇文章里的 ChatClient 示例跑一遍再回来看面试考点很多概念会突然变得好记很多。
返回列表