ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

十年Java程序员转型AI Agent:Spring AI实战教程,收藏学习必备!

2026/8/9 8:05:16 拓冰建站 浏览量
十年Java程序员转型AI Agent:Spring AI实战教程,收藏学习必备! 本文以Spring AI为基础通过实际代码演示了如何构建AI Agent。核心在于Function Calling即大模型决策调用工具执行而非直接执行。文章详细介绍了工具定义、Agent组装、生产级改造死循环保护、记忆分层、动态工具加载等关键步骤并提供了优化效果数据适合希望了解大模型实践的小白和程序员学习参考。我做了十年Java后端最近三个月一直在搞AI Agent。今天不聊概念直接上代码。全部基于Spring AI可运行。先说结论Agent的核心就是Function Calling。大模型本身只能输出文字但通过Function Calling它能告诉你的程序去调用哪个工具。你的程序执行完工具把结果返回给大模型大模型再生成最终回答。整个过程大模型做的是决策不是执行。一、定义工具一个注解搞定Spring AI的工具定义非常直观。Tool注解标记方法description写清楚工具做什么。注意description要写得像API文档一样精确。大模型靠这段话决定要不要调用你的工具。描述模糊调用就出错。这是我踩的第一个坑。package com.example.agent.tool; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.util.List; import java.util.Map; Component public class SalesTools { private final SalesRepository salesRepo; public SalesTools(SalesRepository salesRepo) { this.salesRepo salesRepo; } Tool(description 查询指定日期范围内某个产品的销售数据返回销售额和订单数) public Map querySales( ToolParam(description 产品名称如智能手环Pro) String productName, ToolParam(description 开始日期格式yyyy-MM-dd) String startDate, ToolParam(description 结束日期格式yyyy-MM-dd) String endDate ) { List orders salesRepo.findByProductAndDateRange( productName, LocalDate.parse(startDate), LocalDate.parse(endDate) ); // 返回结构化数据大模型能直接理解 return Map.of( product, productName, totalRevenue, orders.stream().mapToDouble(o - o.getAmount()).sum(), orderCount, orders.size() ); } Tool(description 根据销售额和订单数生成简短的分析结论) public String analyzeSales( ToolParam(description 总销售额) double revenue, ToolParam(description 订单数) int orderCount ) { double avg revenue / orderCount; return String.format( 共%d笔订单总销售额%.2f元客单价%.2f元。%s, orderCount, revenue, avg, avg 200 ? 客单价较高属于中高端消费。 : 客单价偏低可考虑组合销售策略。 ); } }二、组装Agent三步调用链有了工具接下来是Agent的核心编排。本质上就是一个循环发请求给大模型 → 大模型决定调工具 → 执行工具 → 把结果返回给大模型 → 重复直到大模型给出最终回答。package com.example.agent; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.stereotype.Service; Service public class AgentService { private final ChatClient chatClient; public AgentService(ChatClient.Builder builder, ToolCallbackProvider tools) { // 把注册的工具全部挂载到ChatClient this.chatClient builder .defaultTools(toolCallbacks) .build(); } public String chat(String userMessage) { // 一行代码搞定大模型自动判断要不要调工具、调哪个、传什么参数 return chatClient.prompt() .user(userMessage) .call() .content(); } }就这么简单对Spring AI帮你处理了工具注册、参数解析、结果回传。但生产环境不能这么裸跑。往下看。三、生产级改造一死循环保护这是我最惨的教训。大模型调用工具失败后不会停下来告诉你工具挂了。它会换个参数重试。还是失败再试。无限循环。我有一次上线第一天一个用户的问题触发了工具报错Agent循环调用了300多次Token费直接烧了80块。解决方案加重试计数器。package com.example.agent; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; Service public class SafeAgentService { private final ChatClient chatClient; // 最大重试次数超过就放弃 private static final int MAX_RETRIES 3; public SafeAgentService(ChatClient.Builder builder, ToolCallbackProvider tools) { this.chatClient builder.defaultTools(tools).build(); } public String chat(String userMessage) { ListMessage history new ArrayList(); for (int i 0; i MAX_RETRIES; i) { ChatResponse response chatClient.prompt() .user(userMessage) .messages(history) .call() .chatResponse(); AssistantMessage assistantMsg response.getResult().getOutput(); // 检查大模型是否还在请求工具调用 boolean hasToolCall assistantMsg.getToolCalls() ! null !assistantMsg.getToolCalls().isEmpty(); if (!hasToolCall) { // 没有工具调用了说明大模型已经给出最终答案 return assistantMsg.getText(); } // 记录历史继续循环 history.add(assistantMsg); } // 超过重试次数直接告诉用户 return 抱歉处理你的请求时遇到一些问题请稍后再试。; } }四、生产级改造二记忆分层Agent要记住上下文。用户说帮我查上个月的销售紧接着说跟去年同期比一下Agent得知道去年同期指的是什么。短期记忆用ChatMemory窗口策略只保留最近N轮package com.example.agent; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.memory.InMemoryChatMemory; import org.springframework.ai.chat.memory.MessageWindowChatMemory; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.stereotype.Service; Service public class MemoryAgentService { private final ChatClient chatClient; private final ChatMemory memory; public MemoryAgentService(ChatClient.Builder builder, ToolCallbackProvider tools) { this.chatClient builder.defaultTools(tools).build(); // 只保留最近20轮对话防止上下文窗口爆掉 this.memory MessageWindowChatMemory.builder() .maxMessages(20) .build(); } public String chat(String sessionId, String userMessage) { // 加入历史对话记录 memory.add(sessionId, new org.springframework.ai.chat.messages.UserMessage(userMessage)); String response chatClient.prompt() .user(userMessage) .advisors(a - a.param( org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId )) .call() .content(); // 保存助手的回复到记忆 memory.add(sessionId, new org.springframework.ai.chat.messages.AssistantMessage(response)); return response; } }如果业务需要长期记忆比如跨天的对话就要上向量数据库。我把对话摘要存到Chroma里每次新对话时检索相关历史注入上下文。五、生产级改造三动态工具加载工具超过15个大模型选择准确率明显下降。我的做法是按场景分组用户问什么类型的问题就加载哪组工具package com.example.agent; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; Service public class DynamicToolAgent { private final ChatClient baseClient; // 工具按场景分组 private final MapString, ListToolCallback toolGroups; public DynamicToolAgent(ChatClient.Builder builder, SalesTools salesTools, InventoryTools inventoryTools, ReportTools reportTools) { this.baseClient builder.build(); this.toolGroups Map.of( sales, List.of(salesTools), inventory, List.of(inventoryTools), report, List.of(reportTools) ); } public String chat(String userMessage) { // 根据用户意图匹配工具组实际项目里可以用大模型做意图分类 String group detectIntent(userMessage); ListToolCallback tools toolGroups.getOrDefault(group, List.of()); // 只加载当前场景需要的工具 return baseClient.mutate() .defaultTools(tools.toArray()) .build() .prompt() .user(userMessage) .call() .content(); } private String detectIntent(String message) { // 简单版关键词匹配 // 生产环境建议用大模型做意图分类准确率更高 if (message.contains(销售) || message.contains(订单)) return sales; if (message.contains(库存) || message.contains(补货)) return inventory; if (message.contains(报告) || message.contains(分析)) return report; return sales; } }六、实际效果这套架构上线两个月处理了超过一万次对话请求。几个真实数据工具调用成功率从最初的百分之六十多优化到百分之九十五以上。关键优化就是工具描述重写 参数校验。平均响应时间带一次工具调用的对话端到端1.5到3秒。两次工具调用4到6秒。Token消耗加了死循环保护后平均每次对话消耗Token从2000多降到800左右成本降了百分之六十。最后说一句。Agent不是万能药。简单问答直接调大模型API就够了不需要Agent。Agent的价值在于让大模型从能说变成能做。但对Java程序员来说这套东西并不陌生。上游接大模型推理下游接业务工具中间做编排和状态管理。本质上就是一个新的编排层。你十年前写Service层的那些设计思路现在全用得上。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取