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

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 步

  1. 意图识别:LLM 判断当前问题需要调用工具,不直接回答
  2. 生成结构化参数:输出 JSON 格式函数名 + 入参(不生成自然语言)
  3. 本地执行函数:业务代码 / 工具接口接收参数,请求外部服务(查数据库、联网、计算器、爬虫)
  4. 结果回灌 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不需要处理函数调用流程

你只需要做两件事:

  1. 给工具方法加@Tool
  2. 把工具类传给 AI 框架(tools(...)

剩下所有 Function-Call 流程,框架全自动完成!

2、流程示意图(超清晰)

你写的:@Tool 加法方法

AI 框架自动做:

  1. 扫描 → 2. 生成函数描述 → 3. 传给大模型→4、大模型返回调用指令 → 5.框架自动调用你的方法→6.把结果返回给大模型 → 7. 返回答案给用户

总结

  1. Java AI 框架的 @Tool 就是声明式 Function-Call
  2. 加了注解 = 自动可用,无需手动调用
  3. 你只写业务逻辑,框架包办所有调用流程

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 自动调用了:查天气函数

核心结论 ✅

  1. Java 里写 Function-Call 真的只需要:
    • 写工具方法
    • @Tool注解
  2. 不需要手动调用方法
  3. 不需要反射、不需要解析 JSON
  4. AI 框架自动完成:识别 → 调用 → 返回结果
http://www.jsqmd.com/news/945846/

相关文章:

  • Simulink打开模型报错?可能是字符编码在捣鬼(附slCharacterEncoding函数用法)
  • 如何区分真问题还是伪需求
  • 2026年武当好的太极培训机构深度解析:为何武当三丰会仙馆是 - 2026年企业资讯
  • 别再死记硬背了!用Python(NumPy/SciPy)可视化常数1的傅里叶变换,亲手“看到”那个冲激谱
  • 2026年年度自动化立体货架品牌排名,国德仓储实力上榜 - 工业品牌热点
  • 2026北京配眼镜推荐,哪家更合适,五家店的真实差异在哪 - 配眼镜新资讯
  • 第 37 篇 k8s之调度进阶:亲和性、污点与容忍
  • 鸿蒙生态日益完善:头部应用全适配,日常使用无忧
  • 小程序毕业设计-基于springboot+微信小程序的企业网络主机IP地址管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 智标宝深度评测:AI大模型在招投标场景的技术落地实践
  • 新手零压力:用快马生成交互式jupyter notebook轻松学python
  • 2026北京配眼镜推荐,到底怎么选,五家门店从验光到取镜全看 - 配眼镜新资讯
  • 零代码实战:用Coze打造“绝不瞎编”的课程客服智能体
  • 说明书公开不充分?你的专利可能白申请了
  • 2026年四向穿梭式货架生产厂排名,哪家性价比高? - 工业品牌热点
  • OA审批流开发避坑指南:从‘待我审批’查询到事务提交的五个实战细节
  • VoLTE通话失败别抓瞎:手把手教你用拆线原因代码定位问题(附常见场景排查)
  • 3分钟快速上手:通达信缠论可视化插件的终极指南
  • 从游戏AI到工业控制:深入浅出对比DQN、DDQN与Dueling DQN的实战选择
  • ai辅助开发:让kimi等模型在快马平台为你自动编写和解释matlab代码
  • GitHub加速插件:5分钟解决国内访问缓慢的完整方案
  • 从芯片手册到手上模块:手把手拆解SX1308升压电路,看懂每个元件的作用
  • 第 38 篇 k8s之RBAC 与 ServiceAccount 实战
  • 小程序毕业设计-基于微信小程序的旅游景点服务小程序基于springboot+微信小程序的旅游景点导览APP的设计与实现小程序(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 树莓派新手避坑指南:wpa_supplicant.conf文件配置详解与SSH连接全流程
  • 业内口碑不错的4J36低膨胀合金厂商有哪些?这份清单请收好 - 品牌2026
  • 别再死记硬背了!用Python+SciPy快速求解热传导与优化问题(以国赛A题为例)
  • 2026优选:浙江区域独立站定制服务商实力排行 - 奔跑123
  • 三步获取阿里云盘Refresh Token:轻松实现自动化管理的完整指南
  • 告别龟速下载!保姆级教程:为Windows上的MSYS2配置清华/阿里云镜像源