Spring AI 工具(Function Calling)
Spring AI中的工具(Function Calling)是一种强大的功能,它允许大型语言模型在生成文本的过程中调用外部函数或服务。以下是对Spring AI工具(Function Calling)的详细解释:
一、Function Calling的定义与作用
Function Calling是一种技术,它允许大型语言模型(如GPT)在生成文本的过程中调用外部函数或服务。这种功能的核心在于,模型本身不直接执行函数,而是生成包含函数名称和执行函数所需参数的JSON,然后由外部系统执行这些函数,并将结果返回给模型以完成对话或生成任务。
Function Calling主要解决了大型语言模型在处理任务时的局限性,尤其是模型自身无法获取实时信息或执行复杂计算的问题。通过Function Calling,模型可以利用外部工具或服务来扩展其能力,从而能够处理更广泛的任务,如实时数据查询、复杂计算等。
Spring AI 使这一过程变得简单,只需定义一个返回 java.util.Function 的 @Bean 定义,并在调用 ChatModel 时将 bean 名称作为选项进行注册。在底层,Spring 会用适当的适配器代码包装你的 POJO(即函数),以便与 AI 模型进行交互,免去了编写繁琐的样板代码。FunctionCallback.java 接口和配套的 FunctionCallbackWrapper.java 工具类包含了底层实现代码,它们是简化 Java 回调函数的实现和注册的关键。
二、Spring AI如何实现Function Calling
Spring AI提供了一种机制,允许开发者向大型语言模型(LLM)注册自定义函数,并使模型能够在适当的时候调用这些函数。以下是实现步骤:
- 定义函数接口:开发者需要定义一个遵循java.util.function.Function接口的类,该类定义了函数的签名,即函数的输入和输出类型。
- 注册函数为Spring Bean:通过在Spring配置类中声明一个@Bean方法,将函数实现作为Spring Bean注册。可以使用@Description注解来提供函数的描述,这有助于模型理解何时调用该函数。
- 创建FunctionCallbackWrapper:Spring AI提供了FunctionCallbackWrapper类,它封装了函数的调用逻辑,并将其注册为FunctionCallback。这是因为LLM模型本身并不直接调用函数,而是生成一个包含函数调用详细信息的JSON对象,由客户端处理并执行函数。
- 配置ChatOptions:在创建支持Function Calling的聊天客户端时,需要配置ChatOptions,并通过withFunction方法启用注册的函数。
- **调用函数:**在与模型的交互过程中,当模型决定需要调用一个函数时,它会生成一个JSON对象。客户端收到这个对象后,会调用注册的函数,并将结果返回给模型。
- 处理函数调用结果:函数执行后,需要处理返回的结果,并根据需要将结果转换为模型可以理解的格式。
三、Spring AI Function Calling的应用场景
Spring AI的Function Calling功能可以应用于多个场景,例如:
- 实时数据查询:模型可以通过调用外部API来获取实时数据,如股票价格、天气预报等,并将这些数据整合到生成的文本中。
- 复杂计算:模型可以调用外部函数来执行复杂的计算任务,如数学运算、统计分析等。
- 业务逻辑处理:在业务场景中,模型可以调用自定义的函数来处理特定的业务逻辑,如订单处理、用户验证等。
四、Spring AI的优势
- 简化集成:Spring AI提供了一套简化的API,使得开发者能够更容易地在Java应用程序中集成和使用AI功能。
- 跨平台兼容性:支持多种AI模型和数据库提供商,提供了良好的兼容性和可移植性。
- 抽象化:通过提供抽象层,Spring AI允许开发者在不深入了解底层AI模型细节的情况下,实现复杂的AI功能。
- 自动配置:Spring Boot的自动配置特性减少了配置工作,使得开发者可以快速启动和部署AI功能。
五、代码样例: 样例
让创建一个聊天机器人,通过调用自己的函数来回答问题。 为了支持聊天机器人的响应,将注册自己的函数,该函数获取一个位置并返回该位置的当前天气。
当模型需要回答诸如 AI 模型之类的问题时,AI 模型将调用客户端,提供 location 值作为要传递给函数的参数。这种类似 RPC 的数据以 JSON 形式传递。
- 服务 API 如下:MockWeatherService.java
public class MockWeatherService implements Function<Request, Response> {
public enum Unit { C, F }
public record Request(String location, Unit unit) {}
public record Response(double temp, Unit unit) {}
public Response apply(Request request) {
return new Response(30.0, Unit.C);
}
}
- 将函数注册为 Bean
使用 OpenAiChatModel 自动配置,可以通过多种方式在 Spring 上下文中将自定义函数注册为 bean。
普通 Java 函数
@Configuration
static class Config {
@Bean
@Description("Get the weather in location") // function description
public Function<MockWeatherService.Request, MockWeatherService.Response> currentWeather() {
return new MockWeatherService();
}
}
FunctionCallback 包装器
@Configuration
static class Config {
@Bean
public FunctionCallback weatherFunctionInfo() {
return FunctionCallback.builder()
.function("CurrentWeather", new MockWeatherService()) // (1) function name and instance
.description("Get the weather in location") // (2) function description
.inputType(MockWeatherService.Request.class) // (3) function input type
.build();
}
}
- 在 Chat Options 中指定函数
要让模型知道并调用您的函数,您需要在提示请求中启用它:CurrentWeather
OpenAiChatModel chatModel = ...
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");
ChatResponse response = this.chatModel.call(new Prompt(this.userMessage,
OpenAiChatOptions.builder().function("CurrentWeather").build())); // Enable the function
logger.info("Response: {}", response);
- 使用提示选项注册/调用函数
除了自动配置之外,还可以动态地为请求注册回调函数:Prompt
OpenAiChatModel chatModel = ...
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");
var promptOptions = OpenAiChatOptions.builder()
.functionCallbacks(List.of(FunctionCallback.builder()
.function("CurrentWeather", new MockWeatherService()) // (1) function name and instance
.description("Get the weather in location") // (2) function description
.inputType(MockWeatherService.Request.class) // (3) function input type
.build())) // function code
.build();
ChatResponse response = this.chatModel.call(new Prompt(this.userMessage, this.promptOptions));
综上所述,Spring AI的工具(Function Calling)为开发者提供了一种强大的机制来扩展大型语言模型的能力边界。通过调用外部函数或服务,模型可以处理更广泛的任务并生成更丰富的文本内容。
原文地址:https://blog.csdn.net/mqiqe/article/details/145152156
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!