Spring AI 工具调用:工具解析

向模型传递工具的主要方法是在调用 ChatClient 或 ChatModel 时提供 ToolCallback 实例。

然而,Spring AI 还支持通过 ToolCallbackResolver 接口在运行时动态解析工具。

Spring AI 提供了三个 ToolCallbackResolver 实现类,如下图:

Spring AI 工具调用:工具解析

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 工具调用:工具解析

到这里,Spring AI 关于工具调用的话题就介绍完了,更多信息请持续关注 Spring AI 官方文档。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号