第4章:SpringAI工具调用Function Call

部署运行你感兴趣的模型镜像

LLM大模型的局限性

大模型的原生局限性:

  1. 知识滞后:预训练模型的知识截止到特定时间,无法获取实时信息(如最新天气,股票行情)。
  2. 能力边界:无法直接执行系统命令,操作数据库,调用API(如查询用户订单, 生成PDF文件)。
  3. 计算短板:对复杂数学运输(如微积分,金融估值模型)的准确性远低于专用工具。
  4. 不能和公司业务系统打通:无法连接现有的人机系统(如CRM,各个系统API)。

什么是工具调用(Function Call):工具调用是LLM与外部世界交互的接口,让大模型能调用外部功能(如API,函数,数据库)。

为啥大模型需要工具调用:

  1. 能力扩展:让AI模型通过调用外部工具突破自身限制,如调用天气API获取实时数据。
  2. 流程自动化:实现端到端业务流程(如用户咨询订单->调用数据库查询->生成回复)。
  3. 安全可控:通过工具层隔离AI与敏感系统,避免直接暴露数据库,服务器权限。

工具调用应用场景:

  1. 实时数据查询:如天气,股票,新闻,调用第三方API获取数据。
  2. 数据库操作:查询用户订单,修改个人信息,使用JPA/MyBatis执行CRUD。
  3. 文件处理:解析PDF/EXCEL,生成报表,转换格式等。使用Apache POI处理excel文件。
  4. 系统命令执行:服务器监控(如查看CPU使用率),定时任务调度。
  5. 复杂计算:金融估值,科学计算,调用属性库或自定义算法。

SpringAI工具调用解决方案:

提供统一的Tool接口抽象,支持注解式/编程式工具定义。通过FunctionCallAdvisor自动拦截对话请求,判断是否需要调用工具。内置工具执行器(ToolExecutor)。处理参数解析,封装结果,异常捕获。

核心模块:

  1. Tool接口:定义工具的核心方法,包含name(工具名称),execute(执行逻辑)。
  2. @Tool注解:标记类或者方法为可调用工具,description属性用于模型立即工具功能。
  3. @ToolParam注解:描述工具参数的含义(如城市名称,格式中文等)。帮助模型生成正确参数。
  4. FunctionCallAdvisor:SpringAOP拦截器,负责解析用户请求,判断是否需要调用工具(基于模型返回function_call字段),调用ToolExecutor执行工具,并将结果回传给模型。
  5. ToolExcetor:工具执行引擎,处理参数类型转换,方法反射调用,异常处理。

链路流程

大模型+FunctionCall实战天气查询助手

需求:构建一个SpringAI工具调用(FunctionCall)的智能查询助手。支持通过自然语言获取指定日期的天气信息,需要自动关联日期计算与天气查询工具,实现多工具协调响应。

@RestController
@RequestMapping("/ai")
public class FunctionCallController {

    @Autowired
    private ChatClient chatClient;

    @GetMapping("/function")
    public String functionCall(){
        String res = this.chatClient
                .prompt("明天是几号,北京天气怎么样?")
                .tools(new DateTimeTools(),new WeatherTools())
                .call()
                .content();
        return res;
    }

    private class DateTimeTools {
        @Tool(description = "获取当前时间")
        String getTime() {
            System.out.printf("时间获取工具触发");
            return LocalDateTime.now().toString();
        }
    }

    private class WeatherTools {
        @Tool(description = "获取天气")
        String getWeather(@ToolParam(description = "城市名称")String  city,@ToolParam(description = "日期,格式YYYY-MM-DD")String date) {
            System.out.println("queryWeather查询指定城市天气情况"+city+","+date);
            return String.format("%s%s的天气为:晴,24-30℃,微风", city, date);
        }
    }
}

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值