当前位置: 首页 > news >正文

Spring AI--工具调用

目录

什么是工具调用?

工具调用的工作原理

为啥这么设计?

工具调用和功能调用

工具调用的技术选型

工具调用的流程

Spring AI 工具开发

1.定义工具

2.使用工具

3.工具生态


什么是工具调用?

        工具调用(ToolCalling)可以理解为让Al大模型借用外部工具来完成它自己做不到的事情。

        跟人类一样,如果只凭手脚完成不了工作,那么就可以利用工具箱来完成。

        工具可以是任何东西,比如网页搜索、对外部API的调用、访问外部数据、或执行特定的代码等。

        比如用户提问“帮我查询上海最新的天气",AI本身并没有这些知识,它就可以调用“查询天气工具",来完成任务。

        目前工具调用技术发展的已经比较成熟了,几乎所有主流的、新出的AI大模型和AI应用开发平台都支持工具调用。

工具调用的工作原理

        其实,工具调用的工作原理非常简单,并不是AI服务器自己调用这些工具、也不是把工具的代码发送给AI服务器让它执行,它只能提出要求,表示“我需要执行XX工具完成任务”。而真正执行工具的是我们自己的应用程序,执行后再把结果告诉AI,让它继续工作。

为啥这么设计?

        安全性,AI模型永远无法直接接触你的API或者系统资源,所有操作都必须通过你的程序来执行,这样你就可以完全控制AI能做什么、不能做什么。

工具调用和功能调用

        Function Calling(功能调用),和Tool Calling(工具调用)完全是同一个概念!只是不同平台或者每个人习惯的叫法不同而已。

工具调用的技术选型

工具调用的流程

        1.工具定义:程序告诉AI“你可以使用这些工具",并描述每个工具的功能和所需参数

        2.工具选择:AI在对话中判断需要使用某个工具,并准备好相应的参数

        3.返回意图:AI返回“我想用XX工具,参数是XXX"的信息

        4.工具执行:我们的程序接收请求,执行相应的工具操作

        5.结果返回:程序将工具执行的结果发回给AI

        6.继续对话:AI根据工具返回的结果,生成最终回答给用户

怎么实现呢?Spring AI、LangChain等开发框架!

Spring AI 工具开发

        1>工具定义与注册:Spring AI可以通过简洁的注解自动生成工具定义和JSONSchema,让Java方法轻松转变为 AI可调用的工具。

        2>工具调用请求:Spring AI自动处理与AI模型的通信并解析工具调用请求,并且支持多个工具链式调用。

        3>工具执行:SpringAI提供统一的工具管理接口,自动根据AI返回的工具调用请求找到对应的工具并解析参数进行调用,让开发者专注于业务逻辑实现。

        4>处理工具结果:Spring Al 内置结果转换和异常处理机制,支持各种复杂Java对象作为返回值并优雅处理错误情况。

        5>返回结果给模型:Spring Al 封装响应结果并管理上下文,确保工具执行结果正确传递给模型或直接返回给用户。

        6>生成最终响应:SpringAI自动整合工具调用结果到对话上下文,支持多轮复杂交互,确保AI回复的连贯性和准确性。

1.定义工具

        在 Spring Al 中,定义工具主要有两种模式:基于 Methods 方法或者 Functions 函数式编程。

        我们只用学习基于Methods方法来定义工具,另外一种了解即可。原因是Methods方式更容易编写、更容易理解、支持的参数和返回类型更多。

1>Methods 模式:通过@Tool注解定义工具,通过tools方法绑定工具

class WeatherTools {@Tool(description = "Get current weather for a location")public String getWeather(@ToolParam(description = "The city name") String city) {return "Current weather in " + city + ": Sunny, 25°C";}
}// 使用方式
ChatClient.create(chatModel).prompt("What's the weather in Beijing?").tools(new WeatherTools()).call();

2>Functions模式:通过@Bean注解定义工具,通过functions方法绑定工具

@Configuration
public class ToolConfig {@Bean@Description("Get current weather for a location")public Function<WeatherRequest, WeatherResponse> weatherFunction() {return request -> new WeatherResponse("Weather in " + request.getCity() + ": Sunny, 25°C");}
}// 使用方式
ChatClient.create(chatModel).prompt("What's the weather in Beijing?").functions("weatherFunction").call();

下面使用Methods模式

定义工具

        Spring Al提供了两种定义工具的方法一一注解式和编程式。

1>注解式:只需使用@Tool注解标记普通Java 方法,就可以定义工具了,简单直观。

        每个工具最好都添加详细清晰的描述,帮助AI理解何时应该调用这个工具。对于工具方法的参数,可以使用@ToolParam注解提供额外的描述信息和是否必填。

class WeatherTools {@Tool(description = "获取指定城市的当前天气情况")String getWeather(@ToolParam(description = "城市名称") String city) {// 获取天气的实现逻辑return "北京今天晴朗,气温25°C";}
}

2>编程式:如果想在运行时动态创建工具,可以选择编程式来定义工具,更灵活。

先定义工具类:

class WeatherTools {String getWeather(String city) {// 获取天气的实现逻辑return "北京今天晴朗,气温25°C";}
}

然后将工具类转换为ToolCallback工具定义类,之后就可以把这个类绑定给ChatClient,从而让AI使用工具了。

Method method = ReflectionUtils.findMethod(WeatherTools.class, "getWeather", String.class);
ToolCallback toolCallback = MethodToolCallback.builder().toolDefinition(ToolDefinition.builder(method).description("获取指定城市的当前天气情况").build()).toolMethod(method).toolObject(new WeatherTools()).build();

        编程式就是把注解式的哪些参数,改成通过调用方法来设置了而已。

        在定义工具时,需要注意方法参数和返回值类型的选择。Spring Al支持大多数常见的Java类型作为参数和返回值,包括基本类型、复杂对象、集合等。而且返回值需要是可序列化的,因为它将被发送给AI大模型。

2.使用工具

        定义好工具后,Spring Al提供了多种灵活的方式将工具提供给ChatClient,让Al能够在需要时调用这些工具。

1>按需使用:这是最简单的方式,直接在构建ChatClient请求时通过tools()方法附加工具。这种方式适合只在特定对话中使用某些工具的场景。

String response = ChatClient.create(chatModel).prompt("北京今天天气怎么样?").tools(new WeatherTools())  // 在这次对话中提供天气工具.call().content();

2>全局使用:如果某些工具需要在所有对话中都可用,可以在构建ChatClient时注册默认工具。这样,这些工具将对从同一个ChatClient发起的所有对话可用。

ChatClient chatClient = ChatClient.builder(chatModel).defaultTools(new WeatherTools(), new TimeTools())  // 注册默认工具.build();

3)更底层的使用方式:除了给ChatClient绑定工具外,也可以给更底层的ChatModel绑定工具(毕竟工具调用是AI大模型支持的能力),适合需要更精细控制的场景。

// 先得到工具对象
ToolCallback[] weatherTools = ToolCallbacks.from(new WeatherTools());
// 绑定工具到对话
ChatOptions chatOptions = ToolCallingChatOptions.builder().toolCallbacks(weatherTools).build();
// 构造 Prompt 时指定对话选项
Prompt prompt = new Prompt("北京今天天气怎么样?", chatOptions);
chatModel.call(prompt);

3.工具生态

        工具的本质就是一种插件。能不自己写的插件,就尽量不要自己写。我们可以直接在网上找一些优秀的工具实现,比如Spring Al Alibaba 官方文档中提到了社区插件。

http://www.dtcms.com/a/558736.html

相关文章:

  • 网站的分辨率是多少平面设计师招聘广告文案
  • x402支付协议:促AI资产从概念走向落地
  • 重庆永川网站建设苏州公司网站建设价格
  • 做网站的是什么职位wordpress 分类图片尺寸
  • LeetCode LCR 085 括号生成
  • 域名怎么建设网站中国建设招标网住建部网站
  • 龙岩网站建设哪里比较好平潭县建设局网站
  • PCB设计<囫囵吞枣学习法>: 21_PCB设计之调整丝印和添加文字
  • 可信赖的常州网站建设电影网站建设成本
  • 农药化肥网站建设seo应该如何做
  • 机械加工网站平台北京网站优化常识
  • 做网站时兼容分辨率郑州做网站和app的公司
  • 安徽元鼎建设公司网站深圳软件公司排行
  • 动手学强化学习 第5章时序差分算法
  • 网站 改版方案上海最大的外贸公司
  • 中国十大大型门户网站网站开发的时间流程
  • Cache 策略
  • 百度网站分析怎么上国外购物网站
  • 二级域名网站查询入口全球搜索引擎排行榜
  • 对比推理 概念
  • React Native第四章
  • 西安网站建设技术外包网站性能优化
  • 乐清网站的建设是在百度中建设网站?
  • 大连网站建设报价优质商家网络销售是什么工作内容
  • 鞋材加工东莞网站建设appstore下载免费软件
  • IOCP + 重叠I/O 实例代码
  • 东莞建设通网站免费百度seo引流
  • 网站建设专业英文WordPress分类登录可见
  • Jmeter压力测试详解:从入门到实战
  • 义乌建网站做任务的网站