AI Agent 开发实战(六):用 Spring AI 搭建你的第一个 Agent
AI Agent 开发实战六用 Spring AI 搭建你的第一个 Agent这是「AI Agent 开发实战」系列的第 6 篇。前 5 篇我们聊了概念、LLM、记忆、工具和框架横评今天终于要动手了——用 Spring AI 从零搭建一个能调用工具的 Agent跑通 ReAct 循环。读完本文你会得到一个可运行的 Spring AI Agent 项目它能让 LLM 自主决定何时调用工具、何时直接回答。一、Spring AI 是什么不是什么先对齐预期维度Spring AILangChain4j定位Spring 官方 AI 抽象层Java 版 LangChain风格Spring Boot 自动配置 Bean 注入Builder 模式 链式调用上手成本Spring 开发者几乎零成本需要学一套新 API灵活性通过 Adapter 扩展内置组件丰富生态Spring 全家桶天然集成多框架适配Spring AI 的核心理念把 LLM 当作 Spring 生态的一等公民——像用JdbcTemplate访问数据库一样用ChatClient访问大模型。Spring AI 架构全景 │ ├── Model 层 │ ├── ChatModel对话模型抽象 │ ├── EmbeddingModel向量模型抽象 │ ├── ImageModel图像模型抽象 │ └── AudioModel语音模型抽象 │ ├── API 层各厂商适配器 │ ├── OpenAI / Azure OpenAI │ ├── Anthropic Claude │ ├── 阿里通义 / 百度文心 / 智谱 │ └── Ollama本地模型 │ ├── 功能层 │ ├── ChatClient统一调用入口 │ ├── Function Calling工具调用 │ ├── RAG检索增强 │ ├── Advisors拦截器链 │ └── Memory对话记忆 │ └── 集成层 ├── Vector Store向量存储 ├── Spring Boot AutoConfiguration └── ObservabilityMicrometer Zipkin二、项目搭建5 分钟跑起来2.1 创建项目使用 Spring Initializrhttps://start.spring.io选Java 17Spring Boot 3.3依赖Spring Web Spring AIpom.xml关键依赖dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.0.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependencies!-- Spring AI 核心 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies2.2 配置模型application.ymlspring:ai:openai:api-key:${OPENAI_API_KEY}base-url:https://api.openai.com# 或你的代理地址chat:options:model:gpt-4o-minitemperature:0.7如果用国内模型换对应的 starter。比如用智谱spring-ai-zhipuai-spring-boot-starter配置spring.ai.zhipuai.api-key。2.3 验证连通RestControllerRequestMapping(/api/agent)publicclassAgentController{privatefinalChatClientchatClient;publicAgentController(ChatClient.Builderbuilder){this.chatClientbuilder.build();}GetMapping(/chat)publicStringchat(RequestParamStringmessage){returnchatClient.prompt().user(message).call().content();}}启动后访问http://localhost:8080/api/agent/chat?message你好能返回回复就说明通了。三、给 Agent 加上手脚Function Calling没有工具的 Agent 只是个 Chatbot。Spring AI 通过Tool注解或函数式注册让 LLM 能调用你的 Java 方法。3.1 定义工具ComponentpublicclassWeatherTools{Tool(description查询指定城市的当前天气信息返回温度、天气状况和风力)publicStringgetWeather(ToolParam(description城市名称如北京、上海)Stringcity){// 实际项目中调用天气 API// 这里模拟返回MapString,StringmockDataMap.of(北京,晴天温度 28°C北风 3 级,上海,多云温度 31°C东南风 2 级,深圳,雷阵雨温度 33°C南风 4 级);returnmockData.getOrDefault(city,city暂无天气数据);}Tool(description计算两个城市之间的距离单位公里)publicStringgetDistance(ToolParam(description出发城市)StringfromCity,ToolParam(description目的城市)StringtoCity){// 模拟距离计算returnfromCity 到 toCity 约 1200 公里;}}3.2 注册工具并调用Spring AI 1.0 的方式——在 ChatClient 调用时指定工具RestControllerRequestMapping(/api/agent)publicclassAgentController{privatefinalChatClientchatClient;privatefinalWeatherToolsweatherTools;publicAgentController(ChatClient.Builderbuilder,WeatherToolsweatherTools){this.chatClientbuilder.build();this.weatherToolsweatherTools;}GetMapping(/chat)publicStringchat(RequestParamStringmessage){returnchatClient.prompt().user(message).tools(weatherTools)// 注册工具.call().content();}}3.3 测试用户北京今天天气怎么样适合出门吗 LLM 思考 → 需要查询天气 → 调用 getWeather(北京) → 拿到结果晴天温度 28°C北风 3 级 → 综合回答北京今天晴天28°C北风3级非常适合出门关键点你不需要写任何 if-else 来判断用户问的是不是天气。LLM 自己根据工具描述决定调不调、传什么参数。这就是 Agent 的自主。四、加记忆让 Agent 记住上下文上面的 Agent 每次对话都是失忆的。加上对话记忆4.1 对话记忆Chat MemoryConfigurationpublicclassAgentConfig{BeanpublicChatClientchatClient(ChatClient.Builderbuilder){returnbuilder.defaultAdvisors(MessageChatMemoryAdvisor.builder(newInMemoryChatMemory()).build()).build();}}4.2 区分会话多用户场景下需要按会话 ID 隔离记忆GetMapping(/chat)publicStringchat(RequestParamStringmessage,RequestParam(defaultValuedefault)StringsessionId){returnchatClient.prompt().user(message).advisors(a-a.param(CHAT_MEMORY_CONVERSATION_ID_KEY,sessionId)).tools(weatherTools).call().content();}记忆内部结构InMemoryChatMemory │ ├── session user-001 │ ├── [UserMessage] 北京天气怎么样 │ ├── [AssistantMessage] 北京今天晴天28°C... │ └── [UserMessage] 那上海呢 │ ├── session user-002 │ └── [UserMessage] 深圳到北京多远 │ └── ...五、完整 Agent 示例出行助手把工具、记忆、提示词模板组合起来搭一个出行助手 Agent5.1 Agent 服务层ServicepublicclassTravelAssistant{privatefinalChatClientchatClient;privatefinalWeatherToolsweatherTools;publicTravelAssistant(ChatClient.Builderbuilder,WeatherToolsweatherTools){this.weatherToolsweatherTools;this.chatClientbuilder.defaultSystem( 你是一个出行助手。用户会问你天气、距离等出行相关问题。 你需要根据问题自主决定调用哪些工具综合信息后给出建议。 回答时 1. 先给出事实数据天气、距离等 2. 再给出出行建议穿什么、带伞、交通方式等 3. 语气友好像一个懂行的朋友 ).defaultAdvisors(MessageChatMemoryAdvisor.builder(newInMemoryChatMemory()).build()).build();}publicStringchat(StringsessionId,StringuserMessage){returnchatClient.prompt().user(userMessage).advisors(a-a.param(MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,sessionId)).tools(weatherTools).call().content();}}5.2 多轮对话效果第 1 轮 用户我明天要从北京去上海出差帮我看看两边的天气 Agent → 调用 getWeather(北京) getWeather(北京) Agent北京明天晴天28°C上海多云31°C。建议北京穿薄外套上海比较闷热穿短袖即可不用带伞。 第 2 轮 用户北京到上海多远 Agent → 调用 getDistance(北京, 上海) Agent北京到上海约1200公里。高铁大约4.5小时飞机约2小时。出差的话高铁更稳当不受天气影响。 第 3 轮 用户那我还是坐高铁吧 Agent好选择高铁准点率高而且市中心到市中心比飞机省了机场往返时间。记得提前买票热门时段容易售罄。注意第 3 轮——Agent 没有调用任何工具纯靠记忆上下文就给出了合理建议。这就是 LLM 的自主决策它知道什么时候需要工具、什么时候不需要。六、Advisor 机制Agent 的中间件Spring AI 的 Advisor 机制类似 Servlet Filter可以在 LLM 调用的前后插入逻辑用户请求 │ ▼ Advisor 链 │ ├── 1. MessageChatMemoryAdvisor注入对话记忆 ├── 2. 你的自定义 Advisor日志/限流/兜底 ├── ... │ ▼ ChatModel.call() → LLM API │ ▼ Advisor 链逆向 │ ├── 2. 你的自定义 Advisor处理响应 ├── 1. MessageChatMemoryAdvisor保存本轮对话到记忆 │ ▼ 返回给用户自定义 Advisor 示例调用日志publicclassLoggingAdvisorimplementsCallAroundAdvisor{OverridepublicStringgetName(){returnLoggingAdvisor;}OverridepublicAdvisedResponsearoundCall(AdvisedRequestrequest,CallAroundAdvisorChainchain){longstartSystem.currentTimeMillis();// 打印用户输入log.info(用户输入: {},request.userText());// 继续调用链AdvisedResponseresponsechain.nextAroundCall(request);// 打印 LLM 输出和耗时longcostSystem.currentTimeMillis()-start;log.info(LLM 输出: {}, 耗时: {}ms,response.response().getResult().getOutput().getText(),cost);returnresponse;}}注册BeanpublicChatClientchatClient(ChatClient.Builderbuilder){returnbuilder.defaultAdvisors(newLoggingAdvisor(),MessageChatMemoryAdvisor.builder(newInMemoryChatMemory()).build()).build();}七、生产环境的注意事项7.1 超时与重试BeanpublicChatClientchatClient(ChatClient.Builderbuilder,WeatherToolsweatherTools){returnbuilder.defaultOptions(ChatOptionsBuilder.builder().withMaxTokens(2048).build()).build();}// 外层用 Spring Retry 包裹Retryable(maxAttempts3,backoffBackoff(delay1000))publicStringchat(StringsessionId,Stringmessage){// ...}7.2 工具调用的安全边界ComponentpublicclassSafeWeatherTools{privatestaticfinalSetStringALLOWED_CITIESSet.of(北京,上海,深圳,广州);Tool(description查询指定城市的当前天气)publicStringgetWeather(ToolParam(description城市名称)Stringcity){// 防止 LLM 幻觉出非法城市名if(!ALLOWED_CITIES.contains(city)){return不支持查询该城市的天气;}returndoQueryWeather(city);}privateStringdoQueryWeather(Stringcity){// 调用真实 APIreturn...;}}7.3 记忆持久化InMemoryChatMemory重启就丢。生产环境用持久化实现// 基于 Redis 的记忆存储publicclassRedisChatMemoryimplementsChatMemory{privatefinalRedisTemplateString,StringredisTemplate;Overridepublicvoidadd(StringconversationId,ListMessagemessages){Stringkeychat:memory:conversationId;// 序列化并存储设置过期时间messages.forEach(msg-redisTemplate.opsForList().rightPush(key,serialize(msg)));redisTemplate.expire(key,Duration.ofHours(24));}OverridepublicListMessageget(StringconversationId,intlastN){Stringkeychat:memory:conversationId;// 取最近 N 条ListStringrawredisTemplate.opsForList().range(key,-lastN,-1);returnraw.stream().map(this::deserialize).toList();}// ... 序列化/反序列化省略}八、Spring AI vs 手写 Agent什么时候用框架场景推荐理由快速验证 Agent 概念手写 MiniAgent理解原理没有黑盒Spring 技术栈团队Spring AI零学习成本Bean 注入需要丰富的内置组件LangChain4jRAG 管道、文档加载等开箱即用生产级 Agent 服务Spring AI 自定义 Advisor既有框架支撑又能灵活扩展需要精细控制 Agent 行为手写 框架混合核心循环自己写工具调用用框架我的建议先用 Spring AI 跑通一个 Agent就是本文的做法理解ChatClient Tool Advisor Memory这四件套怎么协作。遇到框架限制再手写核心部分不要一上来就造轮子。九、小结Spring AI Agent 四件套 │ ├── ChatClient → 统一调用入口替代手写 HTTP │ ├── Tool → 声明式工具注册LLM 自主选择调用 │ ├── Advisor → 拦截器链记忆/日志/限流/兜底 │ └── ChatMemory → 对话记忆支持按会话隔离要点说明工具注册ToolToolParam声明式零配置LLM 自主决策不需要写 if-elseLLM 根据 Tool 描述自动选择记忆隔离通过 sessionId 区分不同用户的对话上下文Advisor 机制类似 Filter 的中间件可组合扩展安全边界工具方法内部做参数校验防止 LLM 幻觉注入下一篇我们聊Harness Engineering 与约束管理怎么用 Plan 模板、工具注册约束、输出 Schema 让 Agent 的行为更可控——毕竟自由和可控之间需要找到一个平衡。这是「AI Agent 开发实战」系列第 6 篇系列目录别再把 LLM 当聊天机器人了这才是 Agent 的正确打开方式三大基石之 LLM 调用与 Prompt 工程三大基石之记忆系统三大基石之工具调用Java 生态 Agent 框架横评本文用 Spring AI 搭建你的第一个 Agent

相关新闻

Tanel Poder的TPT-Oracle高级技巧:DBA必备的性能调优秘籍

Tanel Poder的TPT-Oracle高级技巧:DBA必备的性能调优秘籍

Tanel Poder的TPT-Oracle高级技巧:DBA必备的性能调优秘籍 【免费下载链接】tpt-oracle Tanel Poders Performance & Troubleshooting Tools for Oracle Databases 项目地址: https://gitcode.com/gh_mirrors/tp/tpt-oracle Tanel Poder的TPT-Oracle&…

2026/7/29 21:13:46阅读更多 →
iDRAC-Redfish-Scripting与SCP功能结合:服务器配置文件导入导出全流程

iDRAC-Redfish-Scripting与SCP功能结合:服务器配置文件导入导出全流程

iDRAC-Redfish-Scripting与SCP功能结合:服务器配置文件导入导出全流程 【免费下载链接】iDRAC-Redfish-Scripting Python and PowerShell scripting for Dell EMC PowerEdge iDRAC REST API with DMTF Redfish 项目地址: https://gitcode.com/gh_mirrors/id/iDRAC…

2026/7/29 21:13:46阅读更多 →
【单片机课程设计/毕业设计】基于单片机的光照强度采集与台灯亮度调节系统 基于光敏传感的多档位智能台灯控制程序设计(011901)

【单片机课程设计/毕业设计】基于单片机的光照强度采集与台灯亮度调节系统 基于光敏传感的多档位智能台灯控制程序设计(011901)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/29 21:11:45阅读更多 →
WarcraftHelper实战手册:魔兽争霸III玩家必备的现代游戏体验增强方案

WarcraftHelper实战手册:魔兽争霸III玩家必备的现代游戏体验增强方案

WarcraftHelper实战手册:魔兽争霸III玩家必备的现代游戏体验增强方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸I…

2026/7/29 22:16:20阅读更多 →
Bulk Crap Uninstaller:Windows软件彻底卸载的专业解决方案

Bulk Crap Uninstaller:Windows软件彻底卸载的专业解决方案

Bulk Crap Uninstaller:Windows软件彻底卸载的专业解决方案 【免费下载链接】Bulk-Crap-Uninstaller Remove large amounts of unwanted applications quickly. 项目地址: https://gitcode.com/gh_mirrors/bu/Bulk-Crap-Uninstaller 你是否曾经为Windows系统…

2026/7/29 22:16:20阅读更多 →
电商AI生图高频踩坑复盘:90%新手都会遇到的出图失真问题根治方案

电商AI生图高频踩坑复盘:90%新手都会遇到的出图失真问题根治方案

电商AI作图普遍存在变形、货不对板、细节错乱、风格跑偏等问题,多数团队将问题归咎于模型能力,实则是工作流与参数控制不规范。本文基于栖影AI电商生产实测,系统梳理新手最高发的失真问题,给出可标准化的参数、参考图、提示词、质…

2026/7/29 22:16:20阅读更多 →
电脑加密软件有哪些?强烈推荐六款电脑加密软件,快试试!

电脑加密软件有哪些?强烈推荐六款电脑加密软件,快试试!

很多人电脑文件乱泄露、隐私资料被偷看,踩过不少坑!大家经常好奇电脑加密软件有哪些今天真心给大家强烈推荐六款电脑加密软件,亲测好用、防护靠谱这几款电脑加密软件日常办公、私人存档都能轻松拿捏!一、安秉文件加密软件✅ 透明无…

2026/7/29 22:16:20阅读更多 →
便携式Linux应用新体验:用Soar打造随身USB软件库的完整教程

便携式Linux应用新体验:用Soar打造随身USB软件库的完整教程

便携式Linux应用新体验:用Soar打造随身USB软件库的完整教程 【免费下载链接】soar A fast, modern package manager for Static Binaries, Portable Formats (AppImage|AppBundle|FlatImage|Runimage) & More [maintainerQaidVoid] 项目地址: https://gitcode…

2026/7/29 22:16:20阅读更多 →
从零开始:用vasp_raman.py计算材料拉曼光谱的5个关键步骤

从零开始:用vasp_raman.py计算材料拉曼光谱的5个关键步骤

从零开始:用vasp_raman.py计算材料拉曼光谱的5个关键步骤 【免费下载链接】VASP Python program to evaluate off-resonance Raman activity using VASP code as the backend. 项目地址: https://gitcode.com/gh_mirrors/va/VASP 还在为计算材料拉曼活性而头…

2026/7/29 22:14:20阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →