向模型传递工具的主要方法是在调用 ChatClient 或 ChatModel 时提供 ToolCallback 实例。
然而,Spring AI 还支持通过 ToolCallbackResolver 接口在运行时动态解析工具。
Spring AI 提供了三个 ToolCallbackResolver 实现类,如下图:
ToolCallbackResolver 接口定义:
package org.springframework.ai.tool.resolution; import org.springframework.ai.tool.ToolCallback; import org.springframework.lang.Nullable; /** * 工具回调解析器接口,用于根据工具名称解析对应的工具回调实例 * 在工具调用流程中,负责将AI模型指定的工具名称映射到实际的工具执行逻辑 */ public interface ToolCallbackResolver { /** * 根据工具名称解析对应的工具回调 * 当AI模型决定调用某个工具时,通过此方法找到该工具对应的执行回调,以便执行具体的工具逻辑 * * @param toolName 工具名称,用于唯一标识需要调用的工具 * @return 对应的工具回调实例,如果未找到则返回null */ @Nullable ToolCallback resolve(String toolName); }
当你向 ChatClient 或 ChatModel 提供工具名称而非 ToolCallback 实例时,Spring AI 内部将使用 ToolCallbackResolver 的实现将工具名称解析为对应的 ToolCallback 实例。
默认情况下,Spring AI 使用 DelegatingToolCallbackResolver,它将工具解析委托给一系列 ToolCallbackResolver 实例:
SpringBeanToolCallbackResolver 从类型为 Function、Supplier、Consumer 或 BiFunction 的 Spring Bean 中解析工具。
StaticToolCallbackResolver 从静态的 ToolCallback 实例列表中解析工具。使用 Spring Boot 自动配置时,该解析器会自动配置应用上下文中所有 ToolCallback 类型的 Bean。
若使用 Spring Boot 自动配置,您可通过提供自定义的 ToolCallbackResolver Bean 来定制解析逻辑。例如:
@Bean ToolCallbackResolver toolCallbackResolver(List<FunctionCallback> toolCallbacks) { StaticToolCallbackResolver staticToolCallbackResolver = new StaticToolCallbackResolver(toolCallbacks); return new DelegatingToolCallbackResolver(List.of(staticToolCallbackResolver)); }
注意,ToolCallbackResolver 由 ToolCallingManager 内部使用,用于在运行时动态解析工具,同时支持 “框架自动控制工具执行”和“用户手动控制工具执行”两种模式。
下面通过 ToolCallingChatOptions 构建 ChatOptions 对象,使用 toolNames() 方法传递要调用的工具名称,验证 Spring AI 会自动将工具名称转换为 ToolCallback 实例。如下:
package com.hxstrive.springai.springai_openai.tools.tools19.controller; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.tool.ToolCallingChatOptions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController class MyController { @Autowired private ChatModel chatModel; // 模型使用 gpt-4-turbo // GPT-4 全面支持工具调用功能,且在处理复杂度、准确性和灵活性上显著优于 GPT-3.5-turbo // http://localhost:8080/ai @GetMapping(value = "/ai",produces = "text/html; charset=UTF-8") public String ai() { ChatOptions chatOptions = ToolCallingChatOptions.builder() .toolNames("currentWeather") // 工具名称 .build(); Prompt prompt = new Prompt("哥本哈根的天气怎么样?", chatOptions); return chatModel.call(prompt).getResult().getOutput().getText(); } }
运行示例,Spring AI 自动调用 ToolCallbackResolver 实现类的 resolve() 方法进行解析,如下图:
运行结果如下图:
到这里,Spring AI 关于工具调用的话题就介绍完了,更多信息请持续关注 Spring AI 官方文档。