工具调用
工具调用(也称为函数调用)是 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 = "[email protected]"; // 邮箱账号
String password = "授权码"; // 邮箱授权码(非登录密码!)
String toAddress = "[email protected]"; // 收件人
// 邮件属性配置
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;
}
