ARTICLE DETAIL

资讯详情

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

Spring AI神器!原生Tool Calling让AI自动调用Java方法,代码简洁10倍_spring ai tool call-CSDN博客

Spring AI神器!原生Tool Calling让AI自动调用Java方法,代码简洁10倍_spring ai tool call-CSDN博客 首屏导读 · 本教程配套付费专栏 大模型工程师修炼手记19.9 元AI 编程 / Agent 实战 本文同主题系统课程· AI时代程序员的自我提升49.9 元AI 时代成长方法论。单篇不过瘾订阅解锁全量源码、实战与答疑文末附资料包领取方式 ↓引言提示工程模拟的烦恼在上一篇中我们通过提示工程实现了工具调用但过程中我们遇到了不少麻烦必须精心设计提示词还要反复调试确保模型输出正确的JSON格式。需要编写复杂的JSON解析逻辑还要处理各种格式错误。无法一次调用多个工具限制了复杂场景。对话记忆需要手动维护增加了代码复杂度。有没有更优雅的方式答案是肯定的大模型原生支持的Tool Calling早期称为Function Calling正是为此而生。它让模型直接输出标准化的tool_calls请求服务端只需注册好工具方法剩下的都由框架自动完成。Spring AI从1.0.0.M6版本开始完美集成了这一特性并通过Tool注解让工具定义变得异常简单。本文将带你体验Spring AI原生Tool Calling的魅力看看如何用几行代码实现同样的功能代码量减少10倍一、什么是原生Tool Calling原生Tool Calling是大模型厂商如OpenAI、Anthropic在模型层面提供的功能。当开发者注册一组工具包含名称、描述、参数结构后模型会在需要时返回一个结构化的tool_calls对象而不是自然语言文本。这个对象明确指出了要调用的工具名和参数值由服务端执行后再将结果返回给模型生成最终回答。整个过程完全标准化开发者只需关注工具的实现无需操心格式解析。二、Spring AI中的Tool CallingSpring AI对Tool Calling的封装堪称优雅主要体现在注解驱动使用Tool和ToolParam注解直接在Java方法上声明工具。自动注册通过ChatClient.Builder的defaultTools()方法自动扫描并注册带有Tool注解的Bean中的方法。自动路由当模型返回tool_calls时Spring AI自动调用对应的方法并将结果合并到上下文中再次请求模型。对话记忆集成通过Advisor机制可以无缝添加记忆功能。三、实战用Tool注解实现天气查询和计算器3.1 定义工具类首先我们创建一个工具类用Tool注解标注方法ComponentpublicclassWeatherTools{Tool(description获取指定城市的实时天气)publicStringgetCurrentWeather(WeatherRequestrequest){MapString,StringweatherMapMap.of(北京,晴朗气温12-24℃,上海,多云气温15-23℃,广州,阵雨气温20-27℃);StringweatherweatherMap.get(request.city());returnweather!null?weather:request.city()天气数据暂时无法获取;}Tool(description计算数学表达式)publicStringcalculate(CalculateRequestrequest){try{ScriptEngineenginenewScriptEngineManager().getEngineByName(JavaScript);Objectresultengine.eval(request.expression());returnString.valueOf(result);}catch(Exceptione){return计算失败e.getMessage();}}// 工具参数定义使用record简化publicrecordWeatherRequest(Stringcity){}publicrecordCalculateRequest(Stringexpression){}}这里有两个关键点Tool(description ...)描述工具的作用模型会根据描述判断何时调用。参数使用Java record定义Spring AI会自动将模型传回的JSON映射到该对象。3.2 配置ChatClient并注册工具接下来在配置类或服务中构建ChatClient并注册工具ServicepublicclassToolCallingService{privatefinalChatClientchatClient;publicToolCallingService(ChatClient.Builderbuilder,WeatherToolsweatherTools){this.chatClientbuilder.defaultSystem(你是一个有用的助手可以调用工具获取实时信息。).defaultTools(weatherTools)// 关键注册工具.build();}publicStringchat(StringuserInput){returnchatClient.prompt().user(userInput).call().content();}}就这两步工具已经可用让我们写个测试看看。3.3 测试效果RestControllerpublicclassChatController{AutowiredprivateToolCallingServicetoolCallingService;GetMapping(/chat)publicStringchat(RequestParamStringmessage){returntoolCallingService.chat(message);}}启动应用测试GET /chat?message北京今天天气怎么样 响应北京今天晴朗气温12-24℃适合户外活动。GET /chat?message计算 123*456 响应123 × 456 56088完美我们没有写任何解析JSON的代码也没有手动处理工具执行结果一切都是自动完成的。四、深入理解Spring AI是如何工作的让我们揭开Spring AI Tool Calling的魔法面纱启动时扫描当调用defaultTools(weatherTools)时Spring AI会扫描该Bean中的所有方法找出带有Tool注解的方法并提取方法名、描述、参数类型等信息。构建请求在与模型交互时Spring AI将这些工具信息封装到API请求的tools字段中符合OpenAI等厂商的格式。模型决策模型根据用户问题判断是否需要调用工具。如果需要返回的响应中会包含tool_calls字段例如{tool_calls:[{id:call_123,type:function,function:{name:getCurrentWeather,arguments:{\city\:\北京\}}}]}自动路由Spring AI收到响应后检测到tool_calls会自动根据name找到对应的Java方法将arguments反序列化为方法参数对象并执行该方法。结果回传工具执行结果被包装成tool消息再次发送给模型模型据此生成最终回答。整个流程完全自动化开发者只需定义工具方法其余全部由框架处理。五、添加对话记忆让模型记住上下文现实中的对话往往是多轮的。用户可能先问北京天气接着问“那上海呢”模型应该理解“那”指的是天气。这就需要对话记忆。Spring AI提供了MessageChatMemoryAdvisor可以轻松实现基于session的记忆ServicepublicclassToolCallingWithMemoryService{privatefinalChatClientchatClient;privatefinalChatMemorychatMemorynewInMemoryChatMemory();// 内存存储生产可用RedispublicToolCallingWithMemoryService(ChatClient.Builderbuilder,WeatherToolsweatherTools){this.chatClientbuilder.defaultSystem(你是一个有用的助手可以调用工具获取实时信息。).defaultTools(weatherTools).defaultAdvisors(newMessageChatMemoryAdvisor(chatMemory))// 启用记忆.build();}publicStringchat(StringuserInput,StringsessionId){returnchatClient.prompt().user(userInput).advisors(spec-spec.param(MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,sessionId)).call().content();}}测试多轮对话第一轮chat(北京今天天气怎么样, session123) 响应北京今天晴朗气温12-24℃。 第二轮chat(那上海呢, session123) 响应上海今天多云气温15-23℃。模型通过sessionId记住了历史自动将“那”理解为“天气”完美六、高级特性多工具并行调用在某些场景下模型可能需要一次调用多个工具。例如用户问“北京天气怎么样顺便帮我算一下 25*410。” 模型可以同时请求getCurrentWeather和calculate两个工具。Spring AI天然支持并行工具调用。我们无需修改代码只需观察效果GET/chat?message北京天气怎么样顺便帮我算一下25*410响应北京今天晴朗气温12-24℃。另外25×410的结果是110。在后台模型可能返回了两个tool_callsSpring AI会依次执行两个方法并将结果合并返回给模型。整个过程自动处理开发者无感。七、对比提示工程模拟现在我们来做一个全面的对比特性提示工程模拟Spring AI Tool Calling代码量需要编写JSON解析、工具路由、异常处理等约200行只需定义工具方法约20行格式稳定性依赖模型遵循提示可能出错模型原生支持格式严格多工具并行需要自定义格式如数组解析复杂原生支持自动处理对话记忆需手动维护历史列表通过Advisor一行开启错误处理需要处理JSON解析失败、工具不存在等框架自动处理异常可配置开发效率低调试困难高声明式编程显然原生Tool Calling在开发效率和稳定性上完胜。八、注意事项模型版本要求只有支持Tool Calling的模型才能使用此功能。主流模型如gpt-3.5-turbo、gpt-4、Claude系列都支持。工具方法签名方法参数必须是单个对象如record且参数名要与JSON中的字段名一致Spring AI默认使用Jackson支持JsonProperty。工具描述要清晰Tool的description直接影响模型决策应写得清晰具体。性能考虑如果工具执行耗时较长建议异步处理。Spring AI支持响应式编程可结合WebFlux使用。九、小结通过本文的实战我们看到了Spring AI原生Tool Calling的强大与简洁。短短几行代码就实现了提示工程模拟需要大量代码才能完成的功能并且更稳定、更易维护。然而原生Tool Calling也有一个局限工具必须写在Java代码里无法跨应用复用也不能在运行时动态更新。如果有多个AI应用都需要同样的工具集或者需要支持多语言编写的工具该怎么办答案是MCP协议。在下一篇文章中我们将探索如何利用MCP实现跨语言、动态扩展的工具调用让Spring AI应用能够无缝接入任意语言编写的工具服务开启AI工具调用的新纪元hrefhttps://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-e1cc28b339.css relstylesheet hrefhttps://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-d1e89cace4.css relstylesheet内容来源csdn.net作者昵称Tom·Ge原文链接https://blog.csdn.net/gedonshen/article/details/158463800作者主页https://blog.csdn.net/gedonshen标签#人工智能 #java #spring确定要放弃本次机会福利倒计时::立减 ¥普通VIP年卡可用立即使用延伸阅读 · 我的付费专栏觉得这篇文章对你有帮助我把同类主题的系统化内容沉淀成了付费专栏欢迎订阅支持持续输出专栏定价内容大模型工程师修炼手记19.9 元AI 编程 / Agent 深度实战AI时代程序员的自我提升49.9 元AI 时代成长方法论本文配套代码 / 资料包欢迎在评论区留言「求代码」我会私信发送完整资源
返回列表