当前位置: 首页 > news >正文

四、使用工具调用方式实现简单计算器

四、使用工具调用方式实现简单计算器

==================================================================================

==================================================================================

参考资料:

==================================================================================

本合集《三、使用Spring AI实现工具调用(Tool Calling)》

==================================================================================

在第三篇中我们了解了怎么在SpringAI中实现工具调用,限制我们实操使用工具调用来实现一个简单计算器

1、使用 @Tool 注解定义工具方式实现

import org.springframework.ai.tool.annotation.Tool;public class CalculatorTools {@Tool(description = "将两个数相加")public double add(double x, double y) {System.out.println("CalculatorTools的add被调用了");return x + y;}@Tool(description = "将两个数相减")public double subtract(double x, double y) {System.out.println("CalculatorTools的subtract被调用了");return x - y;}@Tool(description = "将两个数相乘")public double multiply(double x, double y) {System.out.println("CalculatorTools的multiply被调用了");return x * y;}@Tool(description = "将两个数相除")public double divide(double x, double y) {if (y == 0) {throw new IllegalArgumentException("除数不能为零");}System.out.println("CalculatorTools的divide被调用了");return x / y;}@Tool(description = "计算平方根")public double sqrt(double x) {if (x < 0) {throw new IllegalArgumentException("不能对负数开平方根");}System.out.println("CalculatorTools的sqrt被调用了");return Math.sqrt(x);}
}
@RestController
public class ToolsController {@Autowiredprivate ChatModel chatModel;@GetMapping(value = "/tools/calculator")public String toolCalculator(@RequestParam("userInput") String userInput) {return ChatClient.create(chatModel).prompt().user(userInput).tools(new CalculatorTools()).call().content();}
}

72273c1d-cd47-40a3-b7b5-09fa3e5e9c54

848ccf3f-e0eb-49b7-b0b1-4c5821f1ded1

2、使用函数式编程定义工具

import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import org.springframework.context.annotation.Description;
import org.springframework.stereotype.Component;import java.util.function.Function;@Component
@Description("执行数学计算:加法、减法、乘法、除法")
public class CalculatorService implements Function<CalculatorService.Request, CalculatorService.Response> {public record Request(@JsonPropertyDescription("第一个操作数") double num1,@JsonPropertyDescription("第二个操作数") double num2,@JsonPropertyDescription("运算类型:ADD/SUBTRACT/MULTIPLY/DIVIDE")String operation) {}public record Response(double result, String message) {}@Overridepublic Response apply(Request request) {double result;String message;switch (request.operation().toUpperCase()) {case "ADD":result = request.num1() + request.num2();message = String.format("%.2f + %.2f = %.2f", request.num1(), request.num2(), result);break;case "SUBTRACT":result = request.num1() - request.num2();message = String.format("%.2f - %.2f = %.2f", request.num1(), request.num2(), result);break;case "MULTIPLY":result = request.num1() * request.num2();message = String.format("%.2f × %.2f = %.2f", request.num1(), request.num2(), result);break;case "DIVIDE":if (request.num2() == 0) {throw new IllegalArgumentException("除数不能为零");}result = request.num1() / request.num2();message = String.format("%.2f ÷ %.2f = %.2f", request.num1(), request.num2(), result);break;default:throw new IllegalArgumentException("不支持的运算类型: " + request.operation());}return new Response(result, message);}
}

2.1、手动构建 FunctionToolCallback

@RestController
public class ToolsController {@Autowiredprivate ChatModel chatModel;@GetMapping(value = "/functions/calculator")public String functionCalculator(@RequestParam("userInput") String userInput) {FunctionToolCallback<CalculatorService.Request, CalculatorService.Response> callback =FunctionToolCallback.builder("加、减、乘、除、平方根运算计算器", new CalculatorService()).description("支持加、减、乘、除、平方根运算等操作,如果用户问的问题不支持请告知详情。").inputType(CalculatorService.Request.class).build();return ChatClient.create(chatModel).prompt().toolCallbacks(callback).user(userInput).call().content();}
}

37e0cb88-f4a9-4545-ad80-c011e9bb79c5

722cff5e-4a52-45d8-9689-ccac3999f03f

2.2、通过 @Bean 注册工具

请读者自行完成吧

http://www.jsqmd.com/news/49033/

相关文章:

  • 2025年11月央国企求职机构推荐榜:一份详尽的榜单与选择指南
  • 2025 年 11 月滑石粉厂家权威推荐榜:涂料用/鞋材用/超白低氟/塑料餐盒专用/高透高白度/低铁低气味/高性能免炭黑滑石粉源头精选
  • 2025年热能粉尘回收器厂家推荐榜单:辰威环保技术实力解析
  • 2025年口碑好的注塑件视觉点数包装机用户口碑最好的厂家榜
  • 2025 年 11 月超声设备厂家实力推荐榜:专业成像与智能诊断技术深度解析,精准医疗首选品牌!
  • 2025年质量好的6寸开炼机厂家推荐及采购参考
  • 20234320 2024-2025-1 《网络与系统攻防技术》实验六实验报告
  • 2025年知名的T恤定制厂家最新用户好评榜
  • 2025年口碑好的长春铺路钢板租赁厂家最新权威实力榜
  • 2025年评价高的出口蒸笼TOP品牌厂家排行榜
  • 2025年口碑好的mpp电力管热门厂家推荐榜单
  • 2025年正规的酚醛胶厂家实力及用户口碑排行榜
  • 2025年便携式剃须刀订制厂家权威推荐榜单:便携式女士刮毛刀/便携式剃毛刀/塑料剃须刀源头厂家精选
  • 好拼|免费在线拼图工具重大更新,自定义布局上线 - ops
  • 2025年知名的内肋缠绕管设备厂家推荐及选择参考
  • 2025年评价高的高强度水泥垫块厂家推荐及选购指南
  • Vaadin:可能你不了解,但值得试一次的企业级Web开发框架
  • 2025年质量好的货架支架工业铝型材TOP品牌厂家排行榜
  • 2025年比较好的家具三折轨厂家最新权威推荐排行榜
  • 2025年热门的双层共挤给水管设备厂家最新权威实力榜
  • 2025年工业大吊扇厂家推荐榜单:权威评测与选购指南
  • AG Grid与Bryntum达成战略合作:共同打造更强大的数据密集型应用组件生态
  • 2025年靠谱的非侵入式电动执行器厂家实力及用户口碑排行榜
  • 2025年口碑好的快接端子厂家最新权威实力榜
  • 沙棘哪个品牌比较纯?优质沙棘品牌榜单来了,这些值得入手
  • 2025年包头无缝钢管源头厂家专业推荐与选购指南
  • 2025年包头无缝钢管供应商综合实力排行榜:专业选购指南
  • 2025年靠谱的文创布袋定制厂家最新TOP推荐榜
  • 2025年知名的体系认证行业体系认证口碑榜
  • 2025年知名的员工福利平台用户信赖榜