行业资讯
📅 2026/8/31 5:22:14
Spring AI实战:Java开发者如何快速构建大模型应用与Agent
这两年AI 大模型几乎成了后端技术圈讨论最多的话题。很多 Java 开发者的真实感受是一边是各种 Agent、RAG、LangChain 的内容满天飞一边又觉得这些概念离自己的日常开发很远或者说这些内容似乎只属于 Python 工程师。实际上随着 Spring AI 和 Spring AI Alibaba 的成熟Java 开发者已经可以用非常熟悉的 Spring Boot 方式把大模型能力接入到企业系统中。这篇文章会从 Java 后端开发者的视角出发完整梳理大模型应用开发需要用到的核心知识点Spring AI 的基本用法、Spring AI Alibaba 的国内落地方式、LangChain 的设计思想以及 Agent 智能体的开发实战。最后还会整理一套大模型方向的面试高频问题方便你检验学习成果。无论你是刚开始接触大模型还是已经写了一些 AI Demo这篇文章的内容都值得参考。1. 背景与核心概念Java 开发者为什么要拥抱大模型1.1 大模型应用开发到底做什么很多人对大模型开发有误解以为要懂模型训练、调参、微调这些偏算法的工作。其实企业里 90% 以上的大模型需求都属于“应用开发”也就是把已经训练好的通用大模型接入到具体业务系统中让它变成能回答问题、能查询数据、能调用工具、能辅助决策的可用功能。举个例子做一个企业内部知识库问答机器人核心工作并不是训练模型而是把企业文档切分成块转成向量存入向量数据库用户提问时先检索相关片段再把片段和问题一起交给大模型生成回答。这个过程涉及的是数据处理、检索逻辑、接口集成、权限控制和可观测性这些恰恰是 Java 后端开发者的主场。所以 Java 开发者不需要因为不懂算法而焦虑。你真正需要掌握的是如何用 Spring AI 统一对接各种模型服务、如何设计 Prompt、如何做 RAG、如何写 Function Calling 让模型具备工具调用能力以及如何把 Agent 落地到业务中。这些能力完全可以基于你已有的 Java 基础快速习得。1.2 Spring AIJava 生态的 AI 应用框架Spring AI 是 Spring 官方推出的 AI 应用开发框架目标是为 Java 生态提供一套标准、统一的大模型集成方式。你可以把它理解为 Java 界的 LangChain但它不是简单模仿而是把“接入大模型”这件事做成了 Spring 风格依赖注入、自动配置、统一抽象、约定优于配置。Spring AI 的核心价值在于屏蔽了不同模型厂商的 API 差异。无论你用的是 OpenAI、通义千问、Ollama 本地模型还是其他模型服务在 Spring AI 中操作方式几乎一致。主要面向开发者提供以下几类能力统一的模型接入接口例如ChatModel、EmbeddingModel。流式 API 客户端ChatClient支持同步调用、流式输出、结构化输出。Function Calling 机制让大模型能够调用你注册的 Java 方法。RAG 相关组件包括向量存储、文档读取器、检索增强等。ChatMemory 会话记忆管理方便做多轮对话。对于 Java 后端开发者来说Spring AI 最大的好处是可以继续使用熟悉的 Spring Boot 工程结构和开发习惯而不是引入一套全新的语言和技术栈。1.3 Spring AI Alibaba国内落地关键一环Spring AI Alibaba 是阿里云基于 Spring AI 做的增强实现核心目的是方便国内开发者快速接入通义千问系列模型并且和阿里云百炼平台深度打通。为什么要单独讲它因为国内很多 Java 团队在选型时更倾向于使用国内可访问、有企业级保障的模型服务。Spring AI Alibaba 提供了一套独立的 starter配置好 API Key 之后就可以直接调用通义千问的 qwen-plus、qwen-turbo、qwen-max 等模型。同时它也内置了一些企业级扩展能力比如模型调用链路观测、更细粒度的参数配置甚至支持将复杂业务流程编排成 Graph 工作流。这些能力对于做企业内部系统的人来说非常实用。1.4 LangChain 与 Agent必须理解的两个热词LangChain 是 Python 生态中最流行的大模型应用开发框架最早提出了一整套应用层抽象模型、提示词模板、链、记忆、检索器、智能体。Java 开发者不一定要去写 Python但必须理解 LangChain 提出的这些概念因为 Spring AI 中大量设计都借鉴了这些思想尤其是 Chain 和 Agent 的部分。Agent 智能体则是当前大模型应用最热门的方向。简单理解Agent 大模型 规划能力 工具调用 记忆。普通聊天接口只能把用户输入转成模型输出而 Agent 可以根据用户目标拆解任务自主选择调用哪些外部工具观察工具返回结果再决定下一步动作直到完成任务。需要区分的是LangChain 是一种框架实现Agent 是一种应用模式。你可以用 LangChain 写 Agent也可以用 Spring AI 写 Agent甚至可以不依赖任何框架手写 Agent 逻辑。核心不是工具本身而是对 Agent 运行机制的理解。1.5 一张表理清技术定位与学习路线技术/概念生态归属核心作用Java 开发者的定位Spring AIJava / Spring统一大模型接入提供 ChatClient 等编程模型主学框架日常开发直接使用Spring AI AlibabaJava / 阿里云通义千问接入企业级增强国内落地优先选择LangChainPython大模型应用框架提出 Chain、Agent、Memory 等抽象理解设计思想作为对照LangGraphPython有状态的 Agent 工作流编排理解有状态编排思路Agent应用模式让模型具备规划、工具调用、记忆能力面试和实战重点学习路线建议是先通过 Spring AI 跑通一个对话接口再掌握 RAG 检索增强然后基于 Function Calling 做一个 Agent最后根据业务需要研究 Spring AI Alibaba 的企业级扩展。2. 环境准备与项目初始化在写代码之前先把环境和工程搭建好。Spring AI 目前迭代速度比较快不同版本的 API 会有差异本文示例以 Spring AI 1.x 版本为主具体版本号请以官方文档和 Maven 仓库实际发布为准。2.1 环境要求建议使用以下环境组合软件建议版本说明JDK17 及以上Spring Boot 3.x 要求 JDK 17 起步Maven3.8 及以上也可以用 Gradle本文用 MavenIDEIntelliJ IDEA社区版即可Spring Boot3.3.x 或更高以 Spring AI 官方兼容版本为准模型服务通义千问 / Ollama 本地二选一即可如果你没有云厂商的 API Key也可以使用 Ollama 在本地运行开源模型Spring AI 对 Ollama 有很好的支持适合本地开发和功能验证。2.2 创建 Spring Boot 项目最简单的方式是直接在 IDEA 中通过 Spring Initializr 创建项目勾选 Web 依赖。手动创建时pom.xml 的核心依赖如下parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.5/version relativePath/ /parent properties java.version17/java.version spring-ai.version1.0.0/spring-ai.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies这里引入spring-ai-bom是为了统一管理 Spring AI 相关依赖的版本避免手动指定多个版本导致冲突。2.3 模型接入准备模型接入有几种常见路径你可以根据实际情况选择。第一种是接入通义千问推荐国内开发者使用。首先需要去阿里云百炼平台申请 DashScope API Key然后在配置文件中填写spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} chat: options: model: qwen-plus第二种是接入 Ollama 本地模型。先在本地安装并启动 Ollama然后拉取一个模型例如qwen2.5:7bollama pull qwen2.5:7b配置文件spring: ai: ollama: base-url: http://localhost:11434 chat: options: model: qwen2.5:7b第三种是使用 OpenAI 兼容接口。很多模型服务商都提供 OpenAI 兼容的 HTTP 接口Spring AI 也支持配置 base-url 指向任意兼容地址。不过国内访问外部模型服务的网络条件不稳定生产环境建议优先选择国内可正常访问的模型服务商。3. Spring AI 基础实战从“Hello AI”到结构化输出这一章我们写一个最简单的 Spring AI 应用通过一个 HTTP 接口调用大模型。3.1 编写第一个聊天接口在 Spring Boot 项目中创建一个 Controller注入ChatClient.Builder。ChatClient是 Spring AI 提供的流式 API 客户端使用方式和 Spring 的RestClient、WebClient有些相似通过链式调用组装请求。// 文件路径src/main/java/com/example/ai/controller/ChatController.java package com.example.ai.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/api/ai) public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam(defaultValue 用一句话介绍Java) String message) { return chatClient.prompt() .user(message) .call() .content(); } }代码逻辑很简单.prompt()创建 Prompt 构建器.user(message)设置用户消息.call()发起同步调用.content()获取模型返回的文本内容。启动项目后访问curl http://localhost:8080/api/ai/chat?message你好可以看到模型返回一段文本说明你的第一个大模型接口已经跑通了。此时整个调用链路是HTTP 请求 - Spring MVC Controller - ChatClient - 模型服务 - 返回文本给前端。3.2 流式输出实战在实际项目中大模型生成内容需要一定时间如果使用同步等待用户会一直处于等待状态体验很差。更好的做法是使用流式输出让模型生成一个 token 就推送一个 token前端可以通过 SSEServer-Sent Events实时接收。GetMapping(value /chat/stream, produces text/event-stream;charsetUTF-8) public FluxString chatStream(RequestParam String message) { return chatClient.prompt() .user(message) .stream() .content(); }这里返回类型是FluxString属于 Project Reactor。需要说明的是如果你的项目只引入了spring-boot-starter-web建议额外确认 reactor-core 是否在依赖中如果希望完全以响应式编程方式开发接口也可以改用spring-boot-starter-webflux。流式输出的好处是首字延迟更低用户感受到的响应速度更快也更符合大模型聊天的体验习惯。生产环境中聊天类接口建议一律使用流式输出。3.3 结构化输出实战大模型返回的是自然语言文本但业务系统往往需要 JSON 格式的数据。虽然可以在 Prompt 中要求“返回 JSON”但解析时依然容易失败。Spring AI 提供了结构化输出能力可以直接将模型返回内容映射到 Java 对象。先定义一个 ProductInfo 实体// 文件路径src/main/java/com/example/ai/entity/ProductInfo.java package com.example.ai.entity; import java.math.BigDecimal; public record ProductInfo(String name, String brand, String category, BigDecimal price) { }然后在 Controller 中添加一个接口GetMapping(/product) public ProductInfo parseProduct(RequestParam String text) { return chatClient.prompt() .user(从下面文本中提取商品信息 text) .call() .entity(ProductInfo.class); }访问接口时模型会自动返回符合ProductInfo结构的数据Spring AI 在内部完成了格式约束和解析。结构化输出的核心价值在于打破了大模型和传统程序之间的类型壁垒。你可以让模型返回一个 List、一个 Map、一个嵌套对象甚至可以返回一个由你自己定义的复杂业务结构。这样大模型就可以作为业务系统中的“语义理解组件”存在而不是只能用来聊天。3.4 多轮对话与记忆管理如果一个接口只是把用户当前问题时发送给模型模型并不能记住之前的对话。要实现多轮对话需要把历史消息一起传给模型。Spring AI 提供了ChatMemory和 Advisor 机制。核心思路如下将内存型聊天记忆实例和顾问器注册到 ChatClient 中顾问器会自动把历史消息追加到每次请求中。var chatMemory new InMemoryChatMemory(); ChatClient chatClient ChatClient.builder(chatModel) .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory)) .build();以上只是最简单的例子。实现多轮对话时要注意会话历史会持续累积如果对话轮数比较多很容易超出模型上下文窗口。因此工程化落地时要考虑历史消息裁剪、摘要压缩、按会话维度隔离记忆等策略。4. Spring AI Alibaba 实战通义千问在企业场景中的落地4.1 Spring AI Alibaba 解决了什么问题Spring AI Alibaba 解决的问题非常明确国内 Java 团队想要快速、稳定、合规地接入大模型能力。首先它把通义千问的接入成本降到了最低。只要引入一个 starter配置 API Key就能使用 qwen 系列模型。其次它针对企业场景做了一些扩展比如支持更详细的调用参数配置、模型路由、Graph 工作流编排等。最后它和阿里云百炼平台深度集成模型管理、配额控制、监控报表都可以在阿里云控制台查看。对于大多数国内业务系统来说选择 Spring AI Alibaba 往往比直接对接海外模型服务更省心也更容易过合规审查。4.2 快速接入通义千问在 pom.xml 中引入 Spring AI Alibaba 的 starter。版本号建议访问官方 GitHub Releases 页面获取最新稳定版本因为 1.x 阶段发版比较频繁dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter/artifactId version${spring-ai-alibaba.version}/version /dependency配置文件spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} chat: options: model: qwen-plus通义千问系列常见模型包括模型特点适用场景qwen-turbo速度快、成本低简单问答、信息抽取qwen-plus综合能力强通用对话、内容生成qwen-max效果最强复杂推理、专业问答企业环境中可以根据业务场景配置不同模型比如简单分类任务用 qwen-turbo复杂分析任务用 qwen-max这样可以在效果和成本之间取得平衡。4.3 代码示例接入后的代码和 Spring AI 基础用法完全一致RestController RequestMapping(/api/qwen) public class QwenController { private final ChatClient chatClient; public QwenController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam String message) { return chatClient.prompt() .user(message) .call() .content(); } }这就是 Spring AI 统一抽象的优势底层模型换了业务代码不需要改变。之前接 Ollama 的代码和现在接通义千问的代码几乎完全一样变的只是依赖和配置。4.4 模型路由与 Graph 工作流扩展Spring AI Alibaba 的另一个亮点是对复杂流程编排的支持。简单的对话接口只能处理单轮问答但真实业务往往需要多步骤编排比如先判断用户意图再决定调用哪个模型然后检索知识库最后生成回答。这类流程可以用 Graph 方式建模把每个步骤抽象成节点节点之间有明确的数据流向。这种设计和 LangGraph 的思路是一致的不过对于 Spring AI Alibaba 的 Graph 扩展建议大家直接参考官方示例源码去跑一遍因为这部分 API 还处于快速演进状态直接贴代码很容易因为版本变化而不可用。核心要理解的是复杂 Agent 流程的本质是“有状态的图遍历”而不是一长串写死的 if-else。5. Agent 智能体实战从 Function Calling 到多工具协作5.1 Agent 到底是什么普通的大模型接口是“输入问题 - 输出回答”模型没有能力查询实时数据也不能操作外部系统。Agent 要解决的就是这个问题让模型具备使用工具的能力。举个例子如果用户问“北京今天适合穿什么衣服”模型本身并不知道实时天气。但如果模型可以生成一个“查询北京天气”的调用指令你的程序收到指令后去调用天气 API再把结果返回给模型模型基于真实的天气数据组织文字回答这就形成了一个完整的 Agent 闭环。Agent 的典型工作流程可以用下面的列表描述接收用户目标。大模型分析目标决定调用哪个工具并生成工具参数。程序执行工具返回结构化结果。大模型结合工具结果生成最终回答。如果一次调用不够模型可以多次迭代直到任务完成。5.2 Function Calling 原理Function Calling 是 Agent 最核心的底层能力。它并不是让模型真正执行代码而是让模型“输出一段调用函数的指令”。具体流程是开发者提前向模型声明可用的函数列表包括函数名、参数说明、功能描述。模型根据用户问题决定是否调用某个函数并输出结构化的调用参数。程序侧收到调用请求后真正执行函数把执行结果返回给模型。模型继续生成最终回答。5.3 完整实现一个天气问答 Agent下面在 Spring AI 中实现一个最简单的 Agent让模型可以调用“天气查询”工具。首先定义一个服务方法用于根据城市查询天气// 文件路径src/main/java/com/example/ai/agent/WeatherService.java package com.example.ai.agent; import org.springframework.stereotype.Service; import java.util.Map; Service public class WeatherService { private static final MapString, String WEATHER_MAP Map.of( 北京, 晴26 度, 上海, 小雨22 度, 广州, 多云30 度 ); public String getWeatherByCity(String city) { return WEATHER_MAP.getOrDefault(city, 暂时没有该城市的数据); } }然后定义一个请求参数和函数 Bean。Spring AI 支持将配置好的FunctionBean 注册给模型调用// 文件路径src/main/java/com/example/ai/agent/WeatherAgentConfig.java package com.example.ai.agent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.function.Function; Configuration public class WeatherAgentConfig { Bean public FunctionWeatherRequest, WeatherResponse currentWeather(WeatherService weatherService) { return request - new WeatherResponse( request.city(), weatherService.getWeatherByCity(request.city()) ); } public record WeatherRequest(String city) { } public record WeatherResponse(String city, String weather) { } }最后在 Controller 中通过functions(currentWeather)把工具注册到当前请求// 文件路径src/main/java/com/example/ai/controller/AgentController.java package com.example.ai.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/api/agent) public class AgentController { private final ChatClient chatClient; public AgentController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/weather) public String weatherAgent(RequestParam String question) { return chatClient.prompt() .user(question) .functions(currentWeather) .call() .content(); } }访问测试curl http://localhost:8080/api/agent/weather?question北京今天天气怎么样模型会生成调用currentWeather的指令程序执行后拿到“晴26 度”再由模型组织成自然语言回答。这就是一个完整的最小 Agent。5.4 多工具协作 Agent实际业务中一个 Agent 往往需要注册多个工具。比如一个企业客服 Agent可能需要同时具备订单查询、售后处理、物流跟踪三种能力。实现方式并不复杂先分别定义三个工具函数然后在调用时一次声明多个函数return chatClient.prompt() .user(question) .functions(queryOrder, queryLogistics, applyAfterSale) .call() .content();模型会根据用户问题的意图自动选择一个最合适的工具调用。如果判断用户想退货它不会去查物流而是直接调用售后申请工具。这说明工具描述质量直接影响模型选路效果。工具描述要尽量写清楚“这个工具是干什么用的、什么情况下应该调用”。5.5 Agent 的三大难点第一个难点是规划可靠性。模型自主规划有可能出错的如果设计不当Agent 可能在错误的工具之间反复横跳。解决思路是缩小工具粒度给模型足够清晰的选择条件并增加人工确认环节。第二个难点是记忆管理。Agent 执行过程会产生大量中间结果这些内容都要占用上下文窗口。超长任务需要引入摘要压缩机制把历史执行记录提炼成短文本后继续推理。第三个难点是安全边界。Agent 有能力调用外部工具这意味着用户可能通过 Prompt 注入诱导模型执行未授权操作。生产环境必须对所有工具调用做权限校验关键操作需要人工审批。6. LangChain 与 LangGraphJava 开发者需要吸收的设计思想6.1 LangChain 的核心抽象LangChain 是 Python 生态的大模型应用框架但是它的设计思想已经成了整个行业的通用语言。Java 开发者去学习 LangChain重点不是背 API而是理解它抽象出的概念。LangChain 核心包括Models各种大模型接入的统一抽象。Prompts提示词模板负责把用户输入和固定指令拼接。Chains把模型调用和中间处理步骤串联成管道。Agents让模型自主选择工具并循环执行。Memory对话历史记忆。Retrievers从向量数据库中检索相关内容。这些概念在 Spring AI 中都有对应物。LangChain 的 Chain 对应 Spring AI 的 Advisor 机制Agent 对应 Function Calling 加执行逻辑Memory 对应 ChatMemoryRetrievers 对应 VectorStore。6.2 LangGraph从 Chain 到 Stateful AgentLangChain 早期版本中Chain 是线性执行的无法处理复杂的条件分支和循环。LangGraph 的出现解决了这个问题它把 Agent 执行过程建模成一张有向图节点是处理步骤边是状态转移条件。在一个多步骤 Agent 中每个节点都会读取共享状态对象处理完后更新状态然后根据条件决定下一个进入哪个节点。这种模式非常灵活适合构建复杂的客服机器人、审批助手、自动化编排系统。Java 生态中虽然没有 LangGraph 的完整对应物但 Spring AI Alibaba 的 Graph 能力正是朝着这个方向走的。核心思想是共通的复杂 Agent 不是“一条链走到底”而是一张可以根据中间结果动态跳转的图。6.3 把 LangChain 思想映射到 Spring AI如果你已经有一定的 Spring AI 基础可以参考下面的映射关系来构建自己的技术体系LangChain 概念Spring AI 对应能力用途