1.4 面试:Function Calling(函数调用)

📅 2026/6/24 2:02:19
1.4 面试:Function Calling(函数调用)
Function Calling函数调用在最新技术语境下特指大语言模型LLM与外部世界交互的一种标准化机制。通俗地说它让AI从“只会聊天的话痨”变成了“能动手办事的助理”。为了让你彻底搞懂我从三个维度拆解1. 核心逻辑它到底在干什么传统的AI收到提问只能根据训练数据“猜”答案。而Function Calling的流程是第一步定义你提前把外部工具如查天气API、发邮件接口、数据库查询的“使用说明书”告诉AI。第二步识别用户提问时AI不是直接回答而是先“思考”——判断是否需要调用工具。如果需要它不直接执行操作而是输出一个结构化的JSON数据包含应该调用哪个函数、参数是什么。第三步执行你开发者拿到这个JSON在自己的服务器上真正去执行函数比如真的调天气接口拿到结果。第四步回复你把执行结果再喂给AIAI结合真实数据生成最终自然语言回复给用户。2. 通俗类比帮你秒懂想象你是一位大老板用户AI是您的高级助理外面有财务查账、司机导航、秘书发邮件等专员外部函数。没有函数调用你问“我银行卡还剩多少钱”助理只能瞎编一个数因为他不负责管账。有函数调用助理听完后写了一张标准工单结构化JSON递给财务部“请查账户X余额”。财务部查完把数字执行结果拿回来助理再把数字念给你听。助理本身不查账但他知道“何时”以及“如何”指挥别人。3. 核心价值为什么它是AI应用爆发的基石突破数据时效模型训练数据截止于过去但它可以通过调用实时API获取今天的天气、股价或新闻。获得“行动”能力AI不再只输出文字它可以帮你订机票、创建日程、发送消息真正实现自动化执行任务。保证输出格式它强制AI输出固定的JSON格式这对程序员非常友好可以直接映射为前端页面的数据避免AI“胡说八道”的格式错乱。4. 实际应用场景智能客服用户问“我的订单到哪了” - AI调用订单查询函数 - 返回物流信息。数据分析用户说“帮我拉一下上个月销售额报表” - AI调用SQL生成函数 - 自动查库并生成图表。物联网用户说“太冷了” - AI调用“设定温度”函数 - 智能家居温度上调。特别提醒避坑指南AI本身并不执行代码它只负责“推荐”该调用哪个函数。真正的代码执行必须发生在你受控的后端服务器上。如果不做这一步直接把AI生成的函数调用拿去执行会有巨大的安全风险比如AI被诱导调用“删除数据库”函数。如果你正在考虑接入某个大模型的Function Calling我可以给你看看具体的代码示例比如OpenAI或DeepSeek的调用格式需要我展开讲讲吗 好的既然你想“展开说一下”那我们就不再停留在概念层面直接钻进代码底层把Function Calling的完整数据流转、高级玩法以及最容易翻车的坑全部摊开来讲。为了让你看得更过瘾我把技术细节拆解为四个深度维度1. 底层数据流转AI到底在“看”什么很多人误以为AI能“直接调用”代码其实完全不是。本质上这是两次独立的HTTP请求第一次请求带“说明书”你在调用API时在tools参数里传入一堆JSON格式的函数定义包括函数名、参数类型、必填项。AI收到后并不执行而是根据用户问题做逻辑推理。AI的“特殊回复”AI返回的choices[0].message里content通常是空的但会多出一个tool_calls数组。里面包含id本次调用的唯一追踪IDfunction.name它选中的函数名function.arguments它是一个字符串里面是AI填好的参数JSON比如{city: 西安}关键认知直到这一步AI的工作就结束了。真正查天气、调数据库的动作必须由你开发者在后端用代码去解析这个JSON并执行。2. 硬核代码实战Python伪代码全流程如果不用任何第三方框架如LangChain裸调OpenAI/DeepSeek的代码逻辑是这样的# 第一步定义工具说明书tools[{type:function,function:{name:get_weather,description:查询指定城市的实时天气,parameters:{type:object,properties:{city:{type:string,description:城市名称如北京},unit:{type:string,enum:[celsius,fahrenheit]}},required:[city]}}}]# 第二步发起第一次请求responseclient.chat.completions.create(modelgpt-4,messages[{role:user,content:西安今天热吗}],toolstools,tool_choiceauto# 让AI自己决定是否调用)# 第三步解析AI返回的调用指令tool_callresponse.choices[0].message.tool_calls[0]function_nametool_call.function.name# 结果是 get_weatherargumentsjson.loads(tool_call.function.arguments)# 结果是 {city: 西安}# 第四步【关键】你在本地真正执行函数iffunction_nameget_weather:resultrequests.get(fhttps://api.weather.com?city{arguments[city]}).json()# 第五步第二次请求把结果喂给AImessages.append(response.choices[0].message)# 保存AI的调用指令messages.append({role:tool,# 注意这里是 tool 角色tool_call_id:tool_call.id,# 必须绑定IDcontent:json.dumps(result)# 把查到的28℃传回去})final_responseclient.chat.completions.create(modelgpt-4,messagesmessages)# 最终AI输出西安今天28℃比较热建议穿短袖。3. 进阶高级玩法不止是“一问一答”并行函数调用Parallel Function Calling用户问“北京和上海明天哪个会下雨”AI会一次性返回两个tool_calls分别查北京和上海。你可以并发请求两个天气API大幅降低响应延迟。强制调用tool_choice将tool_choice设为{type: function, function: {name: get_weather}}。这时AI不会回答任何文字只会乖乖返回函数参数。这种模式常用于结构化数据提取比如把用户的闲聊强制转成JSON表单。链式反应ReAct模式第一次调用的结果返回后AI根据结果决定再次调用下一个函数。比如查天气发现下雨 - 自动调用“查询附近室内场馆”函数 - 最后推荐咖啡馆。这需要你在代码里写while循环处理多次请求。4. 程序员最常踩的三大“深坑”务必注意陷阱一参数类型幻觉AI给日期参数填成明天但你的API只认YYYY-MM-DD。解决方案在parameters的description里必须写死格式比如格式必须为2026-06-23。陷阱二Token计费暴涨每次函数调用的tools定义都很长动辄几百个Token。如果每次对话都传完整的函数列表成本会很高。优化方案使用/v1/assistants助手API预存工具或者只给本轮对话可能用到的Top-3函数。陷阱三安全越权最致命AI可能被提示词注入攻击诱导调用delete_user函数。铁律永远不要在Function里直接放执行SQL或删除文件的代码。必须在你的后端加一层鉴权中间件校验当前用户的身份是否有权操作AI请求过来的参数。5. 各家大模型的“方言”差异虽然逻辑相同但字段名略有不同接入时要注意OpenAI / DeepSeek使用tools字段消息角色用tool。Anthropic Claude使用tools字段但函数定义放在input_schema里返回结果放在content的tool_use块中。Google Gemini使用functionDeclarations返回的是functionCall对象回复结果要用functionResponse。讲到这里基本上已经把Function Calling的“骨架”和“血肉”都拆干净了。如果你正准备上手写代码你是想看看某个特定语言比如Java或Node.js的完整接入Demo还是想知道如何在流式输出Streaming中处理函数调用可以告诉我我继续给你精准拆解。