news 2026/10/1 18:29:53

大模型工具调用(Function Calling)深度解析:让 AI 突破限制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型工具调用(Function Calling)深度解析:让 AI 突破限制

本文深入剖析了大模型工具调用(Function Calling)的底层运作机制,从理论到实战,详细介绍了如何让 AI 突破赛博空间的限制,具备操作真实世界业务系统的能力。文章首先阐述了大模型在处理真实业务时存在的无法访问远程和无法操作本地的问题,提出了 Function Calling 作为解决方案。接着,详细描述了 Function Calling 的整体流程,包括定义工具、意图识别与参数提取、程序执行以及结果回传与回复生成等步骤。最后,通过一个手写 Function Calling 的实战案例,展示了如何将大模型与真实世界业务系统相结合。

最近 AI 圈最热的莫过于“养小龙虾(OpenClaw)”了,甚至不少人为了能够用上小龙虾,在腾讯大厦楼下排起了长队,等待腾讯工程师帮忙部署。

为什么一个开源项目能引发如此规模的线下活动?

因为大家发现,OpenClaw 并不是又一个只会『陪聊』的窗口,它是一个真正的『数字员工』。

当你对它说“分析一下本地销售数据并把总结发给主管”时,它能自主翻找你电脑里的文件、运行统计脚本、最后登录你的企业飞书发出消息。

这种从动口到动手的质变,源于它将原本封闭的大模型接入了现实世界。而支撑这种跨维度操作的核心技术,正是我们今天要介绍的Function Calling(工具调用)。


一. 为什么需要 Function Calling?

很多人在体验过各种神奇的智能体后,会产生一种技术错觉:以为大模型(LLM)真的具备了直接操作电脑、查询数据库或者调用接口的能力。

实际上,从底层逻辑看,LLM 本质上是一个运行在受限计算环境中的『概率预测引擎』 。无论它表现得多么像真人,其核心工作只有一个:根据已有的输入,预测下一个最可能的 Token(即『文字接龙』)。

这种生成式的本质,决定了它在处理真实业务时,存在以下问题:

  • 无法访问远程:大模型接龙的依据是训练阶段『背下来』的千亿级参数。它无法主动发起远程请求(如 HTTP、RPC等),对当下真实世界的股价、天气、新闻毫无感知。
  • 无法操作本地: 大模型可以接龙出一段完美的 SQL 语句或Python 自动化脚本,但它本身没有任何执行能力,并不能连接数据库执行查询操作或者运行代码。

那么,谁能解决这些问题呢?

答案是我们的程序代码!作为开发者,我们可以很容易地写一段程序去发起 HTTP 请求、执行 SQL 查询。

但传统的程序代码又存在一个致命短板:无法解析用户复杂的自然语言意图。

此时就存在一个核心痛点:

  1. 应用程序: 拥有完整的执行权限和数据访问能力,但无法解析非结构化的自然语言意图。

  2. 大模型: 具备极强的意图识别和文本解析能力,但无法发起任何真实世界的执行调用。

聪明的你可能已经想到了,可以将二者结合起来!大模型负责识别用户意图并输出结构化内容,由应用程序解析后发起真实调用。

这就诞生了Function Calling(工具调用),它本质上是在『自然语言』与『机器代码』之间,强行建立了一套结构化的通信协议。

当模型发现自己无法直接回答问题(如需查实时数据或执行写操作)时,能够生成一段符合预定义 Schema 的 JSON 指令。

这相当于模型发出了一个显式的调用请求,告诉后端程序:“我需要调用函数 A,参数是 B,请程序执行后将结果反馈给我”。之后由程序去真正调用工具。

需要注意的是,输出这种严谨的结构化指令,并非大模型天生就会的。这需要大模型厂商在预训练和微调阶段,专门针对 Function Calling 能力进行大量的数据训练。

只有经过专门训练的模型,才能在遇到能力边界时,准确输出符合规范的 Schema,而不是继续用自然语言“瞎编”。


二. Function Calling 的整体流程?

如果说 Prompt Engineering 是在教大模型『如何思考』,那么 Function Calling 就是在教大模型『如何求助』。

整个交互过程并不是大模型直接去调工具,而是由应用程序作为中间桥梁,完成信息的闭环流转。

🚗第一步:定义工具

在对话开始前,程序需要定义一份极其详细的『工具说明书』,这通常是一组符合 JSON Schema 规范的描述,包含:

  • 函数名称: 唯一标识符。
  • 功能描述: 告诉模型在什么场景下该使用此工具。
  • 参数规范: 定义函数所需的参数类型、格式及是否必填。

这一步是让为了让大模型建立对工具的基础认知,它不需要知道这些工具怎么实现的,只需要记住这些工具的使用方式。

举个例子,你告诉它:“我这里有两把工具。一把叫get_weather,可以查询天气,需要传入city参数;一把叫get_department,可以查询“一枫公司”某个员工所在的部门,需要传入name参数。”

🚗第二步:意图识别与参数提取

当用户输入请求(如:“帮我查查一枫公司中张三所在的部门”)后,程序将用户指令与工具定义发送给模型。模型会进行内部推理:

  1. 需求分析: 用户想知道员工所在部门。

  2. 匹配工具: 我的知识库里没有实时数据,开发者提供的工具说明书里有一个get_department可以使用。

  3. 参数对齐: 用户提到了“张三”,对应工具要求的name字段。

此时,大模型会输出一段标准的 JSON 数据块,告诉你的程序:“我申请调用get_department,参数是{"name": "张三"}。”

🚗第三步:程序执行

此时模型进入等待状态,后端程序解析返回的 JSON 指令,拿着参数{"name": "张三"},去真实地查询数据库,得到结果:{"department": "研发部"}。

🚗第四步:结果回传与回复生成

程序将执行结果包装成一条消息(大意是:“刚才那个工具我帮你调完了,结果是:研发部”),再次发送给大模型。

大模型拿到这个补充的事实数据后,结合最初的问题,最终接龙出一句自然回复:“张三所在的部门是研发部!”

最后,由程序将这个自然回复发送并展示给用户。整个 Function Calling 闭环完成。


三. 从零手写一个 Function Calling

讲完了理论,下面我们开始上代码实战。

假设业务场景:我们想要一个智能助理,当用户问起某个员工的所在部门时,它能自动去公司数据库里查出来并回答。

  1. 定义工具

在Python 代码里,准备一个真正能查数据库的函数(这里为了演示,使用假数据代替真实的数据库连接):

# 这是真正的业务代码,负责执行动作 def get_department(name): # 模拟查询数据库 database = { "张三": "研发部", "李四": "市场部" } return database.get(name,"查无此人")

将上面这个函数的信息,严格按照 JSON Schema 的格式描述出来,稍后连同用户的问题一起发给大模型。

# 工具说明书 tools = [ { "type": "function", "function": { "name": "get_department", "description": "当用户想要查询某个员工的所在部门时调用此函数。", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "员工的姓名,例如:张 **三、李四"** } }, "required": ["name"] # 声明必填参数 } } } ]
  1. 发起对话与解析意图

我们开始第一次调用大模型。

import json from volcenginesdkarkruntime import Ark # 示例使用方舟的豆包模型,大家也可以使用其他厂商的模型,代码都差不多 client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key="你的api key", ) # 第一次请求大模型,带上 tools 数组 messages = [{"role": "user", "content": "帮我查查一枫公司中张三所在的部门"}] model = "doubao-seed-1-8-251228" response = client.chat.completions.create( model=model, messages = messages, tools=tools, ) # 获取模型的回复 response_message = response.choices[0].message print("大模型的初步决策:", response_message)

此时,打印出来的response_message不会是“我帮你查查”,而是一个结构体!它大概长这样:

{ "role": "assistant", "content": "", "tool_calls": [ { "id": "call_abc123", "type": "function", "function": { "name": "get_department", "arguments": "{/"name/": /"张三/"}" } } ], "reasoning_content": "用户现在需要查询一枫公司中张三的部门,根据提供的工具,应该调用get_department函数,参数是name为张三。首先确认用户的需求是查询员工部门,工具正好对应,参数也明确,所以直接调用这个函数,按照要求的格式来写。" }

大模型返回的content为空,但它在tool_calls里明确告诉你:请去调用get_department,并且参数是{name": "张三"},它完美地理解了意图并提取了参数!

  1. 本地执行与第二次请求大模型

接下来,代码接管执行逻辑,并将结果喂回给模型:

# 检查模型是否要求调用工具 if response_message.tool_calls: # 必须把模型刚才的“调用意图”追加到对话历史中,否则模型会失忆 messages.append(response_message.model_dump()) for tool_call in response_message.tool_calls: # 函数名称 function_name = tool_call.function.name if function_name == "get_department": # 提取参数 function_args = json.loads(tool_call.function.arguments) name = function_args.get("name") # 核心:由你的本地代码,真正执行业务函数 print(f"执行本地代码:查询{function_args.get('name')}的所在部门") function_response = get_department(name) # 将执行结果打包成特定格式,角色(role)必须是 "tool" messages.append({ "tool_call_id": tool_call.id, "role": "tool", "content": function_response }) # 带着工具返回的结果,发起第二次请求 second_response = client.chat.completions.create( model=model, messages=messages ) print("大模型的最终回复:", second_response.choices[0].message.content)

运行结果打印:

  • 执行本地代码:查询张三的所在部门

  • 大模型的最终回复: 张三所在的部门是研发部。

基于以上代码,我们便实现了一次 Function Calling 操作。


四. 总结

Function Calling 完美地解决了大模型长期面临的两大核心瓶颈:

  1. 打破信息孤岛:通过工具调用,大模型得以访问实时数据,不再局限于训练时的静态知识。

  2. 获得执行能力:将自然语言意图转化为可执行的操作,实现了从"能说会道"到"能干实事"的跨越。

这使得大模型从一个封闭的文本生成器,进化成为能够与真实世界互动的智能体。

无论是查询实时信息、操作数据库、调用第三方 API,还是执行本地脚本,都成为了可能。


前几篇文章我们介绍了大模型(LLM)、提示词工程 (PE)、检索增强生成(RAG),今天则正式解锁了重要的工具调用(Function Calling)。

但这仅仅是开始。在接下来的实战系列中,我将继续带大家深度解锁更多 AI 核心知识点:MCP、工作流(Workflow)、智能体(Agent)、LangChain、Coze、Skill 等等。

让我们一起持续进化,成为真正能够驾驭“赛车”的 AI 工程师。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包:

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2026 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要《AI大模型入门+进阶学习资源包》,下方扫码获取~

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

以上资料如何领取?

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

以上全套大模型资料如何领取?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 18:29:14

Windows桌面Agent实战:OpenClaw与Claude Code本地化部署指南

1. 项目概述:当AI从对话框走向任务栏——桌面Agent的真实工作现场“AI 不再只陪你聊天,它开始替你上班了!”这句话最近在技术圈刷屏,不是营销话术,而是Windows用户真实截图里正在运行的进程:一个叫OpenClaw…

作者头像 李华
网站建设 2026/10/1 18:28:28

AI课堂常态化落地的全链路服务:从选型到运营迭代的关键方法

很多学校在引入AI课堂项目时,都走着一条相似的路:先采购一批智能设备,再部署一套教学平台,开一场全员培训,然后就等着老师们"自发地用起来"。结果往往是一学期过去,设备开机率不到两成&#xff0…

作者头像 李华
网站建设 2026/10/1 18:28:06

银行面试通关指南:高频问题、答题思路与避坑经验

先说个结论:银行面试问题没有网上传的那么玄乎,但也没有“学历够了就能进”那么简单。这几年我陆续参加过几家银行的校招和社招面试,也曾以内部员工身份旁听过面试官的复盘会,最大的感受是:大部分人的面试准备方向搞反…

作者头像 李华
网站建设 2026/10/1 18:27:49

基于Spring Boot的大学生房屋租赁系统全解析:从JavaWeb到Docker部署

Spring Boot 的大学生房屋租赁系统,前前后后我做过好几个版本,有给毕设做的,也有给实际业务改造的。这个“基于 JavaWeb 的大学生房屋租赁系统的设计与实现”,属于非常典型的 Java 全栈入门偏进阶项目。放到今天来看,它…

作者头像 李华
网站建设 2026/10/1 18:27:17

Linux远程挂载原理与NFS/CIFS/SSHFS实战指南

1. 这不是“远程桌面”,而是让远程存储变成你电脑里的一个真实文件夹很多人第一次听说“用 mount 命令远程挂载”,第一反应是:“这不就是远程桌面或者网盘同步吗?”——完全不是。mount 的本质,是让远端的文件系统&…

作者头像 李华