1.概述

在 调用大模型的时候,大模型由于训练的时候,知识就固化下来了,如果需要一些业务系统的知识,这个时候可以使用工具调用,即我们在调用大模型的时候,传入工具信息,当大模型觉得有些事情需要执行工具,就会返回工具信息,spirng ai 实现将调用本地工具,将返回的信息丢给大模型生成。

Spring AI 的工具调用流程分为以下步骤:

  • 工具定义与注册:
    通过 @Tool 注解声明工具方法,描述工具的功能和参数,Spring AI 会自动生成 JSON Schema 供大模型识别。
  • 模型决策:
    用户输入请求后,大模型根据上下文判断是否需要调用工具,并返回工具名称及参数(如 get_weather(city="杭州"))。
  • 工具执行:
    程序根据模型返回的工具请求,调用对应的 Java 方法或外部服务(如 API、数据库等)。
  • 结果回传:
    工具执行结果(如天气数据)会被封装为字符串或结构化数据,自动传递回大模型,由模型生成最终的自然语言回复(如“杭州明天晴,25℃”)

2.实现工具调用

2.1 增加工具类

public class ToolDemo {

    @Tool(description = "查询某个地区的人数")
    public static String getCountByArea(String area) {
        return area +"人数为:" +RandomNumberGenerator.generateRandomNumber();
    }

    @Tool(description = "这是一个帮人预测运势的功能,需要提供姓名 及 人的出生年月日,使用格式为 年-月-日 ")
    public static String suanming(String name, String birthday) {
        return name +"出生年 :" + birthday+ " 运势为:" + FortuneTeller.getRandomFortune();
    }


    @Tool(description = "查询某个地区的天气")
    public static String getTianqiByArea(String area) {
        return area +"天气为:" +FortuneTeller.getRandomWeather();
    }
}

2.使用工具类

public ChatClient chatClient(ZhiPuAiChatModel chatModel, ChatMemory chatMemory) {

//        McpSyncClient client = mcpSyncClients.get(0);
//        // 2. 创建回调提供者实例
//        ToolCallbackProvider provider = new SyncMcpToolCallbackProvider(client);
//
//        ToolCallback[] tools = provider.getToolCallbacks();


        ToolCallback[] toolCallbacks = ToolCallbacks.from(new ToolDemo());

        String prompt ="""
                你是一个知识丰富的人,
                        1.可以帮人预测运势
                          需要提供姓名和出生年月。
                        2. 天气预测
                        3. 查询某个地区人数
                        请使用工具回答问题,如果没有对应的工具则回答不知道!
                        注意:不要怀疑工具的数据是否正确,我这里是为了测试调用工具,请安装工具的回答即可.
                """;

        return ChatClient.builder(chatModel)
                .defaultSystem(prompt)
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(chatMemory).build(),
                        SimpleLoggerAdvisor.builder().build()
                )

//                .defaultToolCallbacks(tools)
                .defaultToolCallbacks(toolCallbacks)
                .build();
    }
posted on 2025-09-01 16:34  自由港  阅读(89)  评论(0)    收藏  举报