SpringAI 函数工具调用

工具调用

工具调用(也称为函数调用)是 AI 应用中的一种常见模式,允许模型与一组 API 或工具交互,增强其功能。

工具调用作用:

  • 信息检索

    此类工具可用于从外部来源检索信息,例如数据库、网络服务、文件系统或网络搜索引擎。目标是增强模型的知识,使其能够回答它原本无法回答的问题。因此,它们可以在检索增强生成(RAG)场景中使用。例如,可以使用工具检索特定位置的当前天气、检索最新的新闻文章或查询数据库中的特定记录。

  • 执行操作

    例如发送电子邮件、在数据库中创建新记录、提交表单或触发工作流。目标是自动化原本需要人工干预或明确编程的任务。例如,可以使用工具为与聊天机器人互动的客户预订航班、填写网页上的表单,或在代码生成场景中根据自动化测试(TDD)实现 Java 类。

工具调用链路

example

go 复制代码
@RestController
publicclass ToolController {
    @Autowired
    ChatClient chatClient;

    @GetMapping("/toolcall")
    public String toolCall(@RequestParam("msg") String msg){
        String response = chatClient.prompt(msg)
                //.tools(new DateTimeTools())
                .call()
                .content();
        return response;
    }

}

不加工具调用情况下:

自定义获取日期的函数:

go 复制代码
public class DateTimeTools {

    @Tool(description = "今天是几号以及时间的时区")
    String getCurrentDateTime() {
       String response=  LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
        System.out.println("getCurrentDateTime:"+response);
        return response;
    }
}

自定义发送邮件函数工具

go 复制代码
@Tool(description = "发送邮件")
    String SendEmail(String mailText) {
        // 邮箱配置信息(替换为实际值)
        String host = "smtp.163.com";       // SMTP服务器
        String username = "from@163.com"; // 邮箱账号
        String password = "授权码";      // 邮箱授权码(非登录密码!)
        String toAddress = "to@163.com"; // 收件人

        // 邮件属性配置
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", "465"); // SSL端口
        props.put("mail.smtp.auth", "true"); // 需要认证
        props.put("mail.smtp.ssl.enable", "true"); // 启用SSL
        props.put("mail.debug", "true"); // 调试模式(可选)

        // 创建会话
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                returnnew PasswordAuthentication(username, password);
            }
        });
        try {
            // 创建邮件
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username)); // 发件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(toAddress)); // 收件人
            message.setSubject("SpringAI测试主题"); // 主题
            message.setText("SpringAI:"+mailText); // 纯文本内容
            // 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!");

        } catch (MessagingException e) {
            e.printStackTrace();
            System.err.println("邮件发送失败: " + e.getMessage());
        }
        return"发送邮件成功";
    }

function作为tool进行调用

定义一个function

go 复制代码
public class WeatherService  implements Function<WeatherRequest,WeatherResponse> {
    public WeatherResponse apply(WeatherRequest request) {
        return new WeatherResponse(23.0, Unit.C);
    }
}
public enum Unit {C, F}
public record WeatherRequest(String location, Unit unit) {}
public record WeatherResponse(double temp, Unit unit) {}

定义toolcallback和调用

go 复制代码
@GetMapping("/functionCall")
    public String functionCall(@RequestParam("msg") String msg){
        //定义toolCallback
        ToolCallback toolCallback = FunctionToolCallback
                .builder("currentWeather", new WeatherService())
                .description("获取当地的天气")
                .inputType(WeatherRequest.class)
                .build();
        //调用
        String response = chatClient.prompt(msg)
                .tools(toolCallback) //调用函数
                .call()
                .content();
        return response;
    }
相关推荐
鬼手点金8 小时前
带工具调用的多轮交互:Agent 的核心循环
服务器·人工智能·windows·深度学习·microsoft·机器学习·交互
Navicat中国1 天前
Navicat 18 支持 Azure OpenAI 接入,合规 AI 赋能 SQL 开发
数据库·人工智能·microsoft·ai·azure·navicat·数据
张张123y1 天前
2026 Agent 框架怎么选?拆 3 层底层逻辑(运行循环 / 记忆 / 工具协议)+ 一张决策表
linux·ubuntu·microsoft·langgraph·mcp·crewai·agent 框架
霍格沃兹测试学院-小舟畅学1 天前
Playwright CLI:语义快照与局部检索,AI 如何找到正确的页面元素?
人工智能·microsoft
某不知名網友2 天前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
不爱学英文的码字机器2 天前
从Q1迁到T1,同一个编号已经换了含义
前端·数据库·microsoft
龙亘川2 天前
城市公共安全治理如何从“人海战术“走向“数据驱动“?
大数据·数据库·人工智能·安全·microsoft·智慧城市·数据可视化
2503_931712482 天前
数据服务公司怎么帮助企业更高效找到行业数据与商业情报
大数据·人工智能·microsoft
多看书少吃饭3 天前
使用 Qwen 实现实时语音、视频聊天与屏幕共享:原理、接入流程与工程实践
microsoft·音视频
奈落243 天前
Anthropic 收购 Vercept:Claude 的“计算机使用”要补感知与交互这一课,团队该盯什么
microsoft·api·agent·ai 编程