摘要:

        本文简单介绍了Spring Ai框架的工具调用(Tool Calling),它是AI应用中增强模型能力的关键技术,允许LLM实时调用外部API处理实时数据、计算和系统操作。

        Spring AI通过FunctionCallBack接口和@Tool注解实现工具定义与调用,支持权限配置和动态工具检索。实战中,通过ChatClient配置全局或会话级工具,如编写计算阶乘的Tool函数并集成到对话系统,使模型能智能判断并调用合适工具,显著扩展了AI应用场景和能力边界。

一,什么是工具调用

1,定义

        这里引入spring官方的定义:Tool calling (also known as function calling) is a common pattern in AI applications allowing a model to interact with a set of APIs, or tools, augmenting its capabilities.
        工具调用 (也称为函数调用 )是 AI 应用程序中的一种常见模式,允许模型与一组 API 或工具交互,从而增强其功能。

2,Tool Calling的意义和价值

传统的大语言模型 LLM 仅能基于训练数据生成回答,无法处理以下场景:

(1)需要实时数据(如查询当前天气、股票价格、新闻资讯)。

(2)需要复杂计算(如数学公式求解、数据分析)。

(3)需要操作外部系统(如调用支付接口、查询数据库、发送邮件)。

Tool Calling 让 LLM 具备了 “调用工具” 的能力:模型可以根据用户需求,自主决定是否调用工具、调用哪个工具,并基于工具返回的结果生成最终回答。

二,Spring Ai + Tool Calling

1,FunctionCallBack

        工具的抽象接口,所有可被调用的工具(函数、API 等)都需要实现此接口,定义工具的名称、参数和执行逻辑。核心方法:call(Parameters parameters):接收参数并执行工具逻辑,返回结果。

2,FunctionCallingOptions

        工具调用配置,用于指定模型在调用工具时的参数,如:允许调用的工具列表、工具调用的模式:auto(模型自主决定是否调用)、none(不调用)、"name":"工具名"(强制调用指定工具)。

3,@Tool注解

1,tool的权限配置:

(1)使用Spring Security设置权限

(2)将tools和权限资源一起存储(数据库维护一张权限表),动态设置tools

2,tools过多解决方案:

(1)通过向量数据库(用于相似性数据检索的数据库)存储所有的tools信息

(2)每次对话时通过当前对话信息检索到相似的tools

(3)然后根据返回的tools信息动态地设置tools

3,description注解

        description用于标记一个函数的作用,使AI大模型了解该函数的逻辑,保证模型能够在合适时机正确地调用该函数

@Tool(description = "累加求和并返回结果")
public add(){
    .....
}

三,Tool Calling 实战

1,编写 Tool 函数

@Component
public class CalculatorTools {

    private long result= 1;

    public long getResult() {
        return result;
    }

    @Tool(description = "求参数的阶乘并返回结果")
    public long factorial(int num){
        
        for(int i=2;i<=num;i++){
            result *= i;
        }
        return result;
}

2,添加函数到ChatClient实例

(1)通过在构造chatClient时在defaultTools()(全局)中添加Tools方法类实例(new 实例 / spring 注入 / toolName 字符串)。

    @Bean
    public ChatClient chatClient(
            DashScopeChatModel model
    ){
        return ChatClient.builder(model)
                .defaultSystem("你是智能导游客服”小航,请已友好亲和的语气和用户交流")
                //环绕增强,输出会话日志
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                .defaultTools(new CalculatorTools(),new...)
                .build();
    }

(2)通过.tools()传入函数调用方法所在类实例(new 实例 / spring 注入 / toolName 字符串)在请求模型的对话中,函数工具只在该会话中有效。

    public Flux<String> chat(String prompt) {
        //请求模型
        return chatClient.prompt()
                .user(prompt)
                .tools(new CalculatorTools(),new ...)
                .stream()
                .content();
    }

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐