AI - Function-Call函数调用
一、基础定义
Function Call = 函数调用,是大模型按照用户指令,识别意图后主动调用外部工具 / 自定义函数、传参执行,再把工具返回结果丢给大模型二次总结输出。
主流:OpenAI Function Calling、字节豆包 Function Call、LangChain 工具调用。
- 本质:让 LLM 从“纯文本生成”进化为“可行动的智能体”,突破训练数据静态限制,实现实时交互、私有数据访问与真实世界操作(如查天气、订票、查数据库)。
- 核心流程:开发者声明可用函数(名称、描述、JSON Schema 参数)→ 模型决定是否调用并输出
{name, arguments}→ 应用执行真实函数/API → 将结果返给模型 → 模型生成自然语言回复。 - 关键点:模型不执行函数,只生成调用指令;实际调用、安全校验、错误处理均由开发者系统完成;需用
functions(或tools)参数注册函数,并处理function_call(或tool_calls)响应。 - 典型用途:RAG(检索增强)、AI Agent 多步推理、自然语言转 API 调用、结构化数据提取、闭环业务操作(如下单、发邮件)。
- 起源:OpenAI 于 2023 年 6 月 在 GPT-3.5-turbo-0613 首推,现为 OpenAI、Anthropic、Minimax、Claude 等主流模型支持的标准能力(协议略有差异,但核心一致)。
二、核心流程 4 步
- 意图识别:LLM 判断当前问题需要调用工具,不直接回答
- 生成结构化参数:输出 JSON 格式函数名 + 入参(不生成自然语言)
- 本地执行函数:业务代码 / 工具接口接收参数,请求外部服务(查数据库、联网、计算器、爬虫)
- 结果回灌 LLM:工具返回数据送入大模型,整理成答案回复用户
三、常见应用场景
- 实时联网搜索(查新闻、行情)
- 数值计算、代码运行
- 数据库 SQL 查询、接口拉取业务数据
- 智能体 Agent、RAG 知识库检索
在Spring AI / LangChain4j / 豆包 Java SDK / 通义千问 Java SDK这些主流 AI 框架里:只要给方法加上 @Tool 注解,框架会自动发现、自动调用,不需要你手动写反射、手动调用方法!
这就是声明式 Function-Call—— 你只定义工具,AI 框架自动完成:
- 自动扫描 @Tool 方法
- 自动生成函数描述(JSON Schema)
- 自动解析模型返回的调用指令
- 自动执行方法
- 自动把结果返回给大模型
四、Java应用
1、Java @Tool 极简示例(无需手动调用)
1. 核心代码(只写工具 + 加注解)
import dev.langchain4j.agent.tool.Tool; import org.springframework.stereotype.Component; /** * 工具类:加 @Component 让框架扫描 * 方法加 @Tool = 自动成为可调用函数 */ @Component public class MathTools { /** * 加法工具 * AI会自动调用这个方法,不需要你手动调用! */ @Tool("计算两个数的和 a + b") public double add(double a, double b) { System.out.println("✅ AI 自动调用了 add 方法"); return a + b; } /** * 减法工具 */ @Tool("计算两个数的差 a - b") public double subtract(double a, double b) { System.out.println("✅ AI 自动调用了 subtract 方法"); return a - b; } }2. 使用(完全不用手动调用工具方法)
import dev.langchain4j.service.AiServices; import dev.langchain4j.service.UserMessage; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ChatController { // AI服务接口 interface AiAssistant { String chat(@UserMessage String question); } @GetMapping("/ask") public String ask(String question) { // 框架会**自动注入所有 @Tool 工具** AiAssistant assistant = AiServices.builder(AiAssistant.class) .chatLanguageModel(你的大模型) .tools(new MathTools()) // ✅ 只需要传入工具类 .build(); // 提问:AI自动判断是否调用工具、自动执行 return assistant.chat(question); } }结论
✅不需要手动调用方法✅不需要写反射✅不需要解析 JSON✅不需要处理函数调用流程
你只需要做两件事:
- 给工具方法加@Tool
- 把工具类传给 AI 框架(
tools(...))
剩下所有 Function-Call 流程,框架全自动完成!
2、流程示意图(超清晰)
你写的:@Tool 加法方法
AI 框架自动做:
- 扫描 → 2. 生成函数描述 → 3. 传给大模型→4、大模型返回调用指令 → 5.框架自动调用你的方法→6.把结果返回给大模型 → 7. 返回答案给用户
总结
- Java AI 框架的 @Tool 就是声明式 Function-Call
- 加了注解 = 自动可用,无需手动调用
- 你只写业务逻辑,框架包办所有调用流程
3、完整可运行:SpringBoot + @Tool 自动 Function-Call 项目
零手写调用、零反射、零解析只需要写工具类 + 加@Tool,框架自动完成函数调用。
【1】pom.xml 依赖
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>function-call-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>17</java.version> <langchain4j.version>0.32.0</version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- LangChain4j 核心:支持 @Tool 自动函数调用 --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-spring-boot-starter</artifactId> <version>${langchain4j.version}</version> </dependency> <!-- 对接 OpenAI / 豆包 / 通义 都行 --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> <version>${langchain4j.version}</version> </dependency> </dependencies> </project>【2】application.yml 配置
spring: application: name: function-call-demo # 大模型配置(这里用 OpenAI,换成豆包/通义也一样) openai: api-key: 你的API_KEY model: gpt-3.5-turbo【3】工具类(只加 @Tool,不写调用)
写好 Function 类 + 加 @Tool 就完事框架自动扫描、自动调用。
import dev.langchain4j.agent.tool.Tool; import org.springframework.stereotype.Component; /** * 函数调用工具类 * 只需要:加 @Tool 注解,写业务逻辑 * 不需要任何手动调用代码! */ @Component public class AITools { /** * 函数1:加法计算 * @Tool 内写函数描述,给大模型看 */ @Tool("计算两个数字的和,参数 a + b") public double add(double a, double b) { System.out.println("🤖 AI 自动调用了:加法函数"); return a + b; } /** * 函数2:减法计算 */ @Tool("计算两个数字的差,参数 a - b") public double subtract(double a, double b) { System.out.println("🤖 AI 自动调用了:减法函数"); return a - b; } /** * 函数3:模拟查天气(真实场景可调接口) */ @Tool("查询指定城市的天气,参数:城市名") public String getWeather(String city) { System.out.println("🤖 AI 自动调用了:查天气函数"); return city + ":晴天,25℃,空气质量优"; } }【4】AI 对话接口(自动使用工具)
import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.service.AiServices; import dev.langchain4j.service.UserMessage; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class AIChatController { @Resource private AITools aiTools; // 注入你的工具类 // AI 对话接口(自动支持函数调用) interface Assistant { // 自动判断是否调用 @Tool 函数 String chat(@UserMessage String question); } @GetMapping("/ai/chat") public String chat(@RequestParam String question) { // 1. 创建大模型 OpenAiChatModel model = OpenAiChatModel.withApiKey("你的API_KEY"); // 2. 绑定工具:只需要传入工具类 Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(model) .tools(aiTools) // ✅ 核心:传入 @Tool 工具 .build(); // 3. 提问:AI 自动判断是否调用函数 return assistant.chat(question); } }运行效果(完全自动调用)
启动项目后访问接口:
http://localhost:8080/ai/chat?question=10.5加20.5等于多少控制台输出(框架自动调用方法)
🤖 AI 自动调用了:加法函数接口返回
10.5加20.5的结果是31.0再测试:
http://localhost:8080/ai/chat?question=上海天气怎么样控制台:
🤖 AI 自动调用了:查天气函数核心结论 ✅
- Java 里写 Function-Call 真的只需要:
- 写工具方法
- 加
@Tool注解- 不需要手动调用方法
- 不需要反射、不需要解析 JSON
- AI 框架自动完成:识别 → 调用 → 返回结果
