AI Tool Calling 实战——让 LLM 控制 Java 工具
目录
- 一、前言
- 二、什么是 Tool Calling?
- 三、項目示例
- 1. 创建工具 Bean
- 2. 启动配置
- 3. 注入并使用 ToolCallingChatClient
- 4. 发起调用
- 四、背后机制解析
- 1. 自动生成 Function Schema
- 2. 调用流程
- 五、进阶集成:
- 多轮示例
- 六、总结
- 七、参考
一、前言
LLM(大语言模型)不只是聊天工具,而是可以调用后端服务、控制系统行为的智能体核心。
Spring AI 借助 Tool Specification 机制与函数调用能力,让 Java Bean 中的函数变成 LLM 可调的“工具”。
本篇将带你掌握:
- 如何声明 Java 方法为可调用 Tool
- 如何注册工具并被 LLM 自动发现
- 如何结合上下文与多轮调用,构建智能任务执行系统
二、什么是 Tool Calling?
Tool Calling 是指:
LLM 在对话过程中,自动选择调用某些外部工具(函数、API、数据库查询等),辅助完成任务。
在 Spring AI 中,只需使用 Spring Boot 3.4+ 与 spring-ai-openai-spring-boot-starter
,就能快速构建支持 Tool Calling 的服务。
三、項目示例
这里我们实战构建 IT 助手 Agent
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>spring-ai-tool-calling-demo</artifactId><version>1.0.0</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.3</version></parent><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai</artifactId><version>1.0.0-SNAPSHOT</version></dependency></dependencies>
</project>
1. 创建工具 Bean
package com.example.toolai;import org.springframework.ai.function.annotation.AiFunction;
import org.springframework.ai.function.annotation.AiParam;
import org.springframework.stereotype.Component;@Component
public class ToolFunctions {@AiFunctionpublic Integer add(@AiParam("a") Integer a, @AiParam("b") Integer b) {return a + b;}@AiFunctionpublic String weather(@AiParam("city") String city) {return city + ": 30°C 晴天";}
}
2. 启动配置
在 application.yml
中加入配置:
spring:ai:openai:api-key: sk-xxxchat:options:model: gpt-4o
3. 注入并使用 ToolCallingChatClient
@Autowired
ToolFunctions tools;@Autowired
OpenAiChatClient baseClient;FunctionCallingChatClient chatClient = new FunctionCallingChatClient(baseClient, List.of(tools));
4. 发起调用
package com.example.toolai;import org.springframework.ai.chat.client.*;
import org.springframework.ai.chat.memory.*;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.util.List;@SpringBootApplication
public class ToolCallingApp {public static void main(String[] args) {SpringApplication.run(ToolCallingApp.class, args);}@Beanpublic CommandLineRunner run(OpenAiChatClient baseClient, ToolFunctions tool, ServerOps ops) {return args -> {ChatMemory memory = new InMemoryChatMemory("session-001");FunctionCallingChatClient chatClient = new FunctionCallingChatClient(baseClient, List.of(tool, ops), memory);String userInput = "请问北京的天气是多少度?";ChatResponse response = chatClient.call(userInput);System.out.println("🧠 Response: " + response.getResult().getOutput().getContent());userInput = "那我明天适合跑步吗?";response = chatClient.call(userInput);System.out.println("🧠 Response: " + response.getResult().getOutput().getContent());userInput = "重启一下 CRM 服务";response = chatClient.call(userInput);System.out.println("🧠 Response: " + response.getResult().getOutput().getContent());};}
}
LLM 会自动根据描述调用 weather(city="北京")
。
四、背后机制解析
1. 自动生成 Function Schema
每个 @AiFunction
都会自动转换为 JSON 格式的 OpenAI 工具定义:
{"type": "function","function": {"name": "add","parameters": {"type": "object","properties": {"a": {"type": "integer"},"b": {"type": "integer"}},"required": ["a", "b"]}}
}
2. 调用流程
五、进阶集成:
可以结合 Memory 实现上下文追踪
Spring AI 提供 ChatMemory
接口,可保存历史上下文,如下例所示。
ChatMemory memory = new InMemoryChatMemory("session-001");
FunctionCallingChatClient chatClient = new FunctionCallingChatClient(baseClient, List.of(tools), memory);
多轮示例
用户:北京天气如何?
用户:那我明天适合跑步吗?(使用上轮结果)
六、总结
通过 Tool Calling,Spring AI 让你只用一个注解,就能将本地方法暴露为 LLM 的智能工具。
企业可以基于此快速构建数据接口封装、流程驱动服务、自动化运维系统等。
七、参考
《Java驱动AI革命:Spring AI八篇进阶指南——从架构基础到企业级智能系统实战》