一、基础定义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 version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent groupIdcom.example/groupId artifactIdfunction-call-demo/artifactId version0.0.1-SNAPSHOT/version properties java.version17/java.version langchain4j.version0.32.0/version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- LangChain4j 核心支持 Tool 自动函数调用 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-spring-boot-starter/artifactId version${langchain4j.version}/version /dependency !-- 对接 OpenAI / 豆包 / 通义 都行 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-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?question10.5加20.5等于多少控制台输出框架自动调用方法 AI 自动调用了加法函数接口返回10.5加20.5的结果是31.0再测试http://localhost:8080/ai/chat?question上海天气怎么样控制台 AI 自动调用了查天气函数核心结论 ✅Java 里写 Function-Call 真的只需要写工具方法加Tool注解不需要手动调用方法不需要反射、不需要解析 JSONAI 框架自动完成识别 → 调用 → 返回结果
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 version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent groupIdcom.example/groupId artifactIdfunction-call-demo/artifactId version0.0.1-SNAPSHOT/version properties java.version17/java.version langchain4j.version0.32.0/version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- LangChain4j 核心支持 Tool 自动函数调用 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-spring-boot-starter/artifactId version${langchain4j.version}/version /dependency !-- 对接 OpenAI / 豆包 / 通义 都行 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-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?question10.5加20.5等于多少控制台输出框架自动调用方法 AI 自动调用了加法函数接口返回10.5加20.5的结果是31.0再测试http://localhost:8080/ai/chat?question上海天气怎么样控制台 AI 自动调用了查天气函数核心结论 ✅Java 里写 Function-Call 真的只需要写工具方法加Tool注解不需要手动调用方法不需要反射、不需要解析 JSONAI 框架自动完成识别 → 调用 → 返回结果