在 Java 后端领域,Spring AI 2.0 正在改变 AI Agent 的落地方式。过去要在一个 Spring Boot 项目中接入大模型,需要自己处理 HTTP 客户端、消息历史、函数调用解析和上下文管理;而 Spring AI 把这些能力统一成了可配置、可测试的组件。本文用一个智能航空项目作为主线,从零搭建一套可运行的 AI Agent 系统,包含机票查询、智能客服和行程助手三个典型场景。
这套项目适合已经熟悉 Spring Boot、但还没有完整做过 AI Agent 工程化的 Java 开发者。阅读过程中可以重点观察一件事:Agent 不是把用户消息直接丢给大模型就结束,而是由模型决定调用哪些工具、如何利用多轮记忆、如何把最终结果按业务要求返回。下面先分析智能航空项目中 Agent 的定位,再逐步完成工程搭建、工具开发、客服对话、行程助手和验证排错。所有示例代码用于说明实现思路,实际落地前需要根据 Spring AI 当前版本、模型供应商和项目包名做调整。
1. AI Agent 在智能航空项目中的定位
1.1 从关键词匹配到大模型调度
传统航空客服系统通常依赖关键词匹配或规则引擎。用户输入“北京到上海明天的航班”,系统从 Elasticsearch 或数据库里按“出发地、到达地、日期”三个字段做精确查询。这种方式在问题边界明确时很可靠,但一旦用户换一种说法,比如“明天从首都机场去虹桥”或者“帮我看看后天有没有早班机去上海”,匹配规则的维护成本就开始快速上升。
AI Agent 则把“理解意图”和“执行操作”分开。大语言模型负责理解用户自然语言,决定需要调用什么业务接口,Spring AI 负责执行这些接口调用,并把结果交回给模型继续推理。在智能航空项目中,模型并不知道实时航班价格和余票,它必须通过 FlightQueryTool 这类工具去访问业务系统。工具调用让 Agent 从“会聊天的机器人”变成“能办业务的数字员工”。
1.2 智能航空系统需要解决的三个问题
设计这个系统时,可以先回到业务本质。航空场景下面临三个核心问题:
第一,实时数据必须来自业务系统。航班时刻、舱位价格、剩余座位、退改签规则都不能由模型凭记忆生成,否则会出现严重服务事故。第二,用户对话是多轮的。用户先问“北京到上海”,再补充“要上午的”,系统必须记住前文的出发地、到达地和日期。第三,客服结果不能只停留在聊天窗口。系统需要把用户意图、关键槽位、是否需要人工接管记录下来,转入订单系统或工单系统继续处理。
这三个问题正好对应三个模块:航班查询工具负责数据接入,智能客服负责多轮对话和结构化输出,行程助手负责把查询、推荐、确认和下单一整套流程串起来。理解了业务边界,后续代码才不会写成“把大模型 API 包一层”。
1.3 为什么选择 Spring AI 2.0 来落地
市面上接入大模型的方式有很多,可以直接调用 REST API,也可以选择 LangChain4j 或 Spring AI。直接调用 API 的问题在于,Agent 需要的工具调用、会话记忆、结构化输出、向量检索都要自己实现,且每个模型供应商的协议细节不同。LangChain4j 在 Java 生态中也很活跃,但如果团队已经重度使用 Spring Boot,Spring AI 和 Spring 配置体系、Starter、自动装配的结合会更自然。
| 对比维度 | 直接调模型 API | LangChain4j | Spring AI |
|---|---|---|---|
| 工程集成成本 | 高,需自研 | 中,独立框架 | 低,Spring Boot 原生 |
| 工具调用支持 | 需要自己解析 | 支持 | 支持 |
| 对话记忆管理 | 需要自己组装 | 支持 | Advisor 机制 |
| 向量存储抽象 | 无 | 部分 | 抽象较完整 |
| 与 Spring 配置中心、监控集成 | 弱 | 较弱 | 强 |
Spring AI 2.0 的编程模型核心是 ChatClient。它把 Prompt、System Message、Tool、Advisor、Memory 组合成一条可执行的对话链路。开发者不需要关心每个模型供应商的底层 HTTP 细节,只需要写清楚“给模型什么角色、让它用什么工具、结果按什么结构返回”。
注意:Spring AI 版本迭代比较快,不同版本的 API 和配置前缀可能存在差异。本文的代码基于 2.0 常见形态,落地前务必以当前项目使用版本的官方文档和依赖源码为准。
2. 工程骨架与基础配置
2.1 前置环境清单
在开始写代码前,先确认本地环境是否满足条件。推荐使用 JDK 17 或更高版本,因为 Spring Boot 3.x 和 Spring AI 2.0 都已经转向 Jakarta EE 和现代 Java 特性。Maven 建议使用 3.8 以上,IDE 使用 IntelliJ IDEA 或 Eclipse 均可。
| 环境项 | 推荐值 | 说明 |
|---|---|---|
| JDK | 17 或 21 | 决定 Maven 编译器目标和 Lombok 兼容性 |
| Maven | 3.8+ | 依赖解析和构建 |
| Spring Boot | 3.x | 与 Spring AI 2.0 配合使用 |
| Spring AI | 2.0.x | 以当前仓库可用版本为准 |
| 模型 API | OpenAI 兼容接口 | 也可以使用本地模型,如 Ollama 适配器 |
| Elasticsearch | 8.x | 企业知识库检索使用,学习环境可暂缓 |
这里不绑定某一个云厂商。示例配置会使用 OpenAI 兼容协议,这样无论是国内还是海外模型服务,只要能兼容该协议,都可以通过调整 base-url 和 api-key 接入。如果使用本地模型,需要把 base-url 指向本机,只适合开发验证。
2.2 初始化 Spring Boot 工程并引入依赖
可以通过 Spring Initializr 创建工程,也可以手工建立 Maven 项目。核心依赖包括 Spring Boot Web、Spring AI Starter、测试依赖等。在 pom.xml 中,Spring AI 依赖需要放到独立的 dependencyManagement 中管理,因为 Spring AI 的 BOM 和 Spring Boot 的 BOM 是两套版本体系。
<properties>
<java.version>17</java.version>
<spring-ai.version>2.0.0</spring-ai.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<grou
315




被折叠的 条评论
为什么被折叠?



