发布时间:2026/7/14 21:22:23
初识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/7/14 21:22:23

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/7/14 22:22:53

Unity WebGL平台下AssetBundle加载的三大核心要点与实战避坑

1. WebGL平台下AssetBundle的特殊性WebGL作为Unity支持的跨平台方案,其运行环境和资源加载机制与其他平台存在显著差异。最核心的区别在于WebGL采用浏览器沙箱环境,所有资源加载必须遵循同源策略和异步加载原则。这意味着:无本地文件系统访问…

2026/7/14 22:22:53

STM32与MCP3551构建高精度数据采集系统

1. 项目概述:高精度数据采集系统设计在工业测量、医疗设备和科研仪器等领域,高精度模拟信号采集一直是嵌入式系统设计的核心挑战。MCP3551作为Microchip公司推出的22位Δ-Σ型ADC,以其优异的噪声性能和线性度成为精密测量应用的理想选择。当它…

2026/7/14 22:22:53

机器人质量控制技术:从传统检测到智能化的跨越

1. 机器人质量控制技术发展概述过去十年间,机器人质量控制技术经历了从传统人工检测到智能化、自动化检测的跨越式发展。作为工业自动化领域的核心环节,质量控制技术的进步直接决定了机器人产品的可靠性和市场竞争力。2010年代初,大多数制造企…

2026/7/14 22:17:53

终极指南:3步免费解锁WeMod完整高级功能

终极指南:3步免费解锁WeMod完整高级功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 想要完全免费地使用WeMod的所有专业功能吗&…

2026/7/14 12:47:32

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/14 19:23:19

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/14 0:04:21

5分钟掌握足球PBR材质制作:Photoshop与Unity高效工作流

1. 项目概述:为什么是足球PBR材质?在游戏开发,尤其是体育竞技类游戏的制作中,一个看起来“对味”的足球,往往比我们想象中更重要。它不仅是赛场上的核心道具,更是玩家视觉焦点和沉浸感的重要来源。一个塑料…

2026/7/14 0:04:21

ChatGPT联网搜索失败,92%开发者误判为网络问题——真实根因竟是LLM推理会话上下文污染导致Search Agent进程静默退出(含strace复现脚本)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT 联网搜索失败 当 ChatGPT 的联网搜索功能无法正常工作时,用户常遇到“搜索不可用”“未连接到互联网”或空白响应等现象。该问题并非模型本身缺陷,而是由权限配置、网络…

2026/7/14 12:47:31

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…