初识Function Calling:让AI学会“调用工具”

发布时间:2026/9/9 7:10:39

初识Function Calling:让AI学会“调用工具” 引言从“回答问题”到“执行任务”你是否曾幻想过只需对AI说一句“帮我订一张下周五从北京飞往上海的机票要下午的航班”它就能像真人助理一样自动完成查询、比价、下单的全过程这背后依赖的关键技术就是Function Calling函数调用。Function Calling 是大型语言模型LLM的一项核心能力它让AI不再仅仅是“文本生成器”而是进化为能够理解用户意图、并调用外部工具API、函数、服务来执行具体操作的“智能体”。简单来说它教会了AI如何“使用工具”。本文将带你从零开始深入理解Function Calling的原理、工作流程、应用场景并通过具体示例展示如何实现它。什么是Function Calling核心定义Function Calling是一种机制允许大型语言模型如GPT-4、Claude、文心一言等在生成回复时识别出用户请求中需要调用外部工具或API来完成的部分。模型不会直接执行操作而是输出一个结构化的“调用请求”其中包含要调用的函数名和所需的参数。然后由外部系统你的程序来实际执行这个函数并将结果返回给模型由模型整合成最终的自然语言回复给用户。一个简单的比喻想象一下你是一个项目经理LLM你接到一个任务用户请求。你虽然知识渊博但不会亲自去写代码、查数据库或调用第三方服务。于是你分析任务后写下一张清晰的“工作指令单”结构化函数调用请求上面写明需要谁来做函数名例如get_weather需要什么信息参数例如{“location”: “上海”, “date”: “2024-07-15”}然后你把指令单交给对应的工程师外部系统去执行。工程师执行完毕把结果例如{“temperature”: 28, “condition”: “晴”}反馈给你。最后你根据这个结果向客户用户生成一份完整的、易于理解的报告自然语言回复。Function Calling就是这个“写指令单”的过程。Function Calling 的核心价值与优势突破模型的“知识”与“能力”边界LLM的训练数据有截止日期且无法知晓私有数据或实时信息。通过Function Calling模型可以查询最新的天气、股价、新闻或访问企业内部数据库。执行具体操作模型可以触发真实世界的动作如发送邮件、控制智能家居、创建日历事件、进行支付等。提升可靠性与准确性对于数学计算、代码执行、复杂查询等任务让专门的工具来处理比依赖模型的内部推理更加准确和可靠。输出结构化数据模型返回的调用请求是标准的JSON格式便于程序解析和后续处理实现了从非结构化自然语言到结构化指令的转换。Function Calling 是如何工作的一个完整的流程让我们通过一个“查询天气并建议着装”的例子拆解整个工作流程。参与者用户提出自然语言请求。LLM如GPT理解意图决定是否需要以及如何调用函数。开发者/应用程序定义可用的函数执行函数调用管理对话。外部工具/API提供实际能力如天气API。流程详解外部工具/API大语言模型应用程序用户外部工具/API大语言模型应用程序用户第一步准备阶段第二步对话轮次用户发起3. 模型分析5. 执行函数7. 模型整合1. 定义可用函数列表名称、描述、参数schema“上海明天天气怎么样”2. 发送用户消息 函数定义a. 理解用户意图b. 判断需调用get_weatherc. 提取参数location上海4. 返回结构化调用请求(非最终回复)调用天气API(上海)返回JSON天气数据6. 将函数结果作为上下文再次发送给LLM结合对话历史、函数结果生成最终自然语言回复8. 返回最终回复“上海明天晴转多云气温25-32度建议穿短袖。”步骤解析准备工具函数定义开发者预先向模型“介绍”可用的工具。这通过一个JSON Schema列表完成详细描述每个函数的名称、功能描述以及参数格式。用户提问用户提出自然语言请求。模型决策LLM结合用户请求和已有的函数定义判断是否需要调用函数。如果需要它会选择最匹配的函数并从用户请求中提取出符合参数schema的值。返回调用请求LLM停止生成常规的对话回复转而输出一个特定的JSON对象例如{“name”: “get_weather”, “arguments”: {“location”: “上海”}}。这明确告诉程序“请调用get_weather函数并传入location参数为‘上海’。”执行函数应用程序你的代码解析这个JSON调用对应的本地函数或外部API并获取真实结果如{“temp”: 28, “condition”: “Sunny”}。将结果反馈给模型应用程序将函数执行的结果以特定格式通常是新增一条tool或function角色的消息重新发送给LLM。模型生成最终回复LLM将函数执行结果视为新的上下文结合最初的用户问题生成一个包含真实数据的、流畅的自然语言回复。回复用户应用程序将最终回复展示给用户。关键概念与技术细节1. 函数定义Function Definition这是你告诉模型“你有什么工具”的方式。一个标准的定义包括name: 函数唯一标识。description: 对函数功能的清晰描述。这个描述至关重要模型主要靠它来判断是否调用该函数。parameters: 遵循JSON Schema格式定义参数的类型、属性、是否必需等。示例定义一个获取天气的函数{name:get_weather,description:获取指定城市在指定日期的天气信息,parameters:{type:object,properties:{location:{type:string,description:城市名称例如北京、上海},date:{type:string,description:日期格式为YYYY-MM-DD}},required:[location]}}2. 模型的输出Tool Calls当模型决定调用函数时它不会在对话流中输出普通文本而是输出一个或多个tool_calls对象。每个tool_call包含id: 本次调用的唯一ID用于后续匹配结果。type: 通常是function。function: 包含name函数名和arguments参数字符串是合法的JSON。3. 并行调用与流式响应高级的Function Calling支持并行调用模型可以一次性决定调用多个函数。例如用户问“对比一下北京和上海的天气”模型可能同时输出两个get_weather的调用请求。流式响应在模型思考是否调用函数时就可以开始向用户传输“思考中”的提示提升体验。实战示例用OpenAI API实现一个简单的Function Calling以下是一个使用Python和OpenAI API的完整示例。importjsonimportopenaifromdatetimeimportdatetime# 1. 定义可用的函数工具defget_current_time(timezone:strAsia/Shanghai)-str:获取指定时区的当前时间。# 简化处理实际应使用pytz等库nowdatetime.now()returnnow.strftime(%Y-%m-%d %H:%M:%S)defget_weather(location:str)-str:模拟获取天气信息。实际应调用天气API。weather_data{北京:晴15-25°C,上海:多云20-28°C,深圳:阵雨25-32°C}returnweather_data.get(location,抱歉未找到该城市天气信息。)# 将函数信息封装为模型可识别的格式tools[{type:function,function:{name:get_current_time,description:获取当前时间,parameters:{type:object,properties:{timezone:{type:string,description:时区例如 Asia/Shanghai, America/New_York}},required:[]}}},{type:function,function:{name:get_weather,description:获取指定城市的天气情况,parameters:{type:object,properties:{location:{type:string,description:城市名称}},required:[location]}}}]# 2. 初始化对话clientopenai.OpenAI(api_keyyour-api-key)messages[{role:user,content:请问现在上海天气怎么样}]# 3. 第一次调用模型期待它决定调用函数print(用户,messages[-1][content])responseclient.chat.completions.create(modelgpt-4o,# 或 gpt-3.5-turbomessagesmessages,toolstools,tool_choiceauto,# 让模型自动决定是否调用工具)response_messageresponse.choices[0].message messages.append(response_message)# 将模型的响应包含tool_calls加入历史# 4. 检查模型是否要求调用函数tool_callsresponse_message.tool_callsiftool_calls:print(f模型决定调用{len(tool_calls)}个函数。)# 5. 执行每个被请求的函数fortool_callintool_calls:function_nametool_call.function.name function_argsjson.loads(tool_call.function.arguments)# 根据函数名调用对应的本地函数iffunction_nameget_current_time:function_responseget_current_time(**function_args)eliffunction_nameget_weather:function_responseget_weather(**function_args)else:function_responsef错误未知函数{function_name}print(f执行函数:{function_name}({function_args}) -{function_response})# 6. 将函数执行结果作为新的消息追加到对话历史messages.append({role:tool,tool_call_id:tool_call.id,content:function_response,})# 7. 第二次调用模型让它基于函数结果生成最终回复second_responseclient.chat.completions.create(modelgpt-4o,messagesmessages,)final_messagesecond_response.choices[0].message messages.append(final_message)print(AI助手,final_message.content)else:# 模型没有调用函数直接回复print(AI助手,response_message.content)运行结果可能如下用户 请问现在上海天气怎么样 模型决定调用 1 个函数。 执行函数: get_weather({location: 上海}) - 多云20-28°C AI助手 上海现在的天气是多云气温在20到28摄氏度之间。进阶应用与模式1. ReActReason Act模式Function Calling 是实现 ReAct 模式的基础。模型通过“思考链”Reasoning分析问题决定需要采取什么“行动”Action即调用函数根据行动结果再进一步思考直到问题解决。2. 智能体Agent框架的核心LangChain、AutoGen、CrewAI 等AI智能体框架其底层核心就是基于Function Calling来让LLM协调使用各种工具搜索引擎、计算器、文件系统等。3. 复杂工作流编排通过串联多个Function Calling可以构建复杂的工作流。例如调用search_web函数查找信息。调用analyze_sentiment函数分析情感。调用generate_report函数生成总结。调用send_email函数发送报告。总结与展望Function Calling 是连接LLM“智能”与外部世界“能力”的桥梁。它将LLM从“百科全书”转变为“实干家”开启了构建真正实用AI应用的大门。未来趋势更精准的意图识别模型能理解更模糊、更复杂的用户指令。工具生态标准化出现通用的工具描述和发现协议。自主智能体模型不仅能调用工具还能自主规划、拆解任务并串联多个工具调用以完成复杂目标。现在当你再使用ChatGPT插件、Copilot的“/”命令或是与一个能帮你订餐的AI聊天机器人交互时你就会知道这神奇的体验背后正是Function Calling在默默工作。下一步尝试为你自己的应用定义几个函数比如“查询数据库订单”、“生成数据图表”、“发送Slack通知”体验一下让AI为你“调用工具”的强大之处吧
延伸阅读

更多相关文章

2026/9/2 10:08:32

2026-07-13 GitHub 热点项目精选

/* 全局样式 */* { margin: 0; padding: 0; box-sizing: border-box; }body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;max-width: 900px; margin: 0 auto; padding: 30px 20px; line-height: 1.7; color: #2d3748;backgro…

2026/9/9 7:06:29

从上海汽车测试展看车载传感器标定与智能感知评测新趋势

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/9 7:06:29

2026低代码平台实测:免费私有化与AI搭建深度对比

2026年聊低代码,话题早就不是“要不要用”,而是“免费怎么选、能不能私有化、AI到底搭了什么”。我最近正好集中实测了一批平台,从纯SaaS免费版到开源私有化部署,从传统表单流程到AI生成页面,跑完一圈最大的感受是&…

2026/9/9 7:06:29

Web数据可视化库全评测:从ECharts到D3.js的选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/9 7:06:29

2026低代码选型:私有化部署与AI搭建实测解析

先说结论:2026年做低代码选型,光看“免费”两个字已经不够了,得同时盯住私有化部署能力和AI搭建能力。我在过去大半年里把市面上主流的免费低代码平台基本都过了一遍,从Dify这种AI应用开发平台,到NocoBase这类数据模型…

2026/9/9 7:06:29

工业级MLCC选型实战指南:温度、纹波与寿命的硬性契约

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/9 7:01:29

数据仓库建模实战:从维度建模到数仓分层的完整方法论

数据仓库建模这件事,表面上看是在设计表结构,实际上是在设计整个团队对业务的统一认识方式。我刚开始做数仓的时候,接到的第一个任务就是把业务系统里的几十张表整理成能直接支撑报表分析的数据模型。当时最真实的感受就是:业务方…

2026/9/8 7:15:10

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/8 7:15:10

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/7 22:45:59

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码