【Tool Calling工具调用】
这里引入spring官方的定义:tools工具调用(也称为函数调用)是 AI 应用程序中的一种常见模式,允许模型与一组 API 或工具交互,从而增强其功能。
摘要:
本文简单介绍了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();
}
更多推荐
所有评论(0)