Function Calling 从零开始
1. 什么是 Function Calling【官方原文】OpenAI Function Calling 官方文档 Function calling provides a powerful and flexible way for OpenAI models to interface with external systems and access data outside their training data.一句话说透Function Calling是大语言模型的一项能力让模型在生成回复时根据用户意图主动输出一个结构化的函数调用请求函数名 JSON 参数{name:get_weather,arguments:{city:北京}}2. 核心流程【官方原文】Function Calling 是通过 OpenAI API 实现应用与模型之间的多步对话。流程包含五个高层步骤用模型可以调用的工具向模型提出请求从模型接收工具调用在应用端执行代码输入工具调用向模型发送第二个请求带着工具输出收到模型的最终响应或更多工具调用1. 用户询问模型巴黎的天气怎么样{tools:[获取天气、数字计算],message巴黎的天气怎么样呀}2. 模型返回结构化工具调用请求{name:get_weather,arguments:{city:巴黎}}3. 应用端执行函数代码functionget_weather(city){returnweatherData[city];}// 返回结果巴黎:多云28°C4. 应用端向模型回传工具执行结果{message:...之前的消息,output:巴黎:多云28°C,}5. 模型返回最终自然语言回答{message:巴黎当前的温度是28°C多云⛅}整个流程用户提问→模型判断需要调用 get_weather参数是巴黎→应用端执行函数拿到天气结果→应用端把结果整合用户的问题一起发给大模型→模型整合结果给出自然语言回答。3. 代码演示文件结构function_calling_demo/ ├── node_modules/ ├── .env # 环境变量配置API Key ├── index.js # 主程序入口 ├── tools.js # 工具定义 ├── package.json └── package-lock.json初始化项目npminit-ynpminstalldotenv openaitools工具函数tools.jsconsttools[{type:function,function:{name:get_weather,description:获取指定城市的天气,parameters:{type:object,properties:{city:{type:string,description:城市名如 北京、巴黎,},},required:[city],},},},];exportdefaulttools;环境变量.envapiKey...你的api_key主程序index.jsimportdotenv/config;importOpenAIfromopenai;// 1. 初始化 AI 客户端constopenainewOpenAI({apiKey:process.env.apiKey,baseURL:https://dashscope.aliyuncs.com/compatible-mode/v1,});// 2. 定义工具importtoolsfrom./tools.js;// 3. 工具函数functionget_weather(city){constdata{北京:晴26°C,巴黎:多云28°C,上海:小雨22°C,};returndata[city]||暂无天气;}// ---------- 控制台样式工具 ----------constC{reset:\x1b[0m,bold:\x1b[1m,dim:\x1b[2m,title:\x1b[36;1m,// 青色粗体step:\x1b[33;1m,// 黄色粗体user:\x1b[32m,// 绿色ai:\x1b[35m,// 紫色tool:\x1b[34m,// 蓝色result:\x1b[33m,// 黄色success:\x1b[32;1m,// 绿色粗体arrow:\x1b[90m,// 灰色};functionline(char─){console.log(${C.arrow}${char.repeat(50)}${C.reset});}functionstep(n,text){console.log(\n${C.step}Step${n}│${text}${C.reset});line();}functionlabel(tag,color,value){console.log(${color}●${tag}${C.reset}${value});}// // 主流程完整的 Function Calling 循环// asyncfunctionrun(){constmessages[{role:user,content:巴黎的天气怎么样},];console.log(\n${C.title}╔══════════════════════════════════════╗${C.reset});console.log(${C.title}║ Function Calling 流程演示 ║${C.reset});console.log(${C.title}╚══════════════════════════════════════╝${C.reset});step(1,用户发起请求);label(USER,C.user,${messages[0].content});step(2,发送至 LLM等待模型决策...);letresponseawaitopenai.chat.completions.create({model:qwen-plus-2025-07-28,tools:tools,messages:messages,});constchoiceresponse.choices[0];messages.push(choice.message);if(choice.finish_reason!tool_calls){label(RESPONSE,C.ai,choice.message.content||(空));console.log(\n${C.dim}模型未调用工具流程结束。${C.reset}\n);return;}label(DECISION,C.ai,finish_reason tool_calls → 模型决定调用工具);for(consttcofchoice.message.tool_calls){console.log(\n${C.tool}┌─ 函数调用 ─────────────────────────┐${C.reset});console.log(${C.tool}│ function :${tc.function.name}${C.reset});console.log(${C.tool}│ arguments:${tc.function.arguments}${C.reset});console.log(${C.tool}│ call_id :${tc.id}${C.reset});console.log(${C.tool}└─────────────────────────────────────┘${C.reset});}step(3,本地执行工具函数);for(consttcofchoice.message.tool_calls){if(tc.function.nameget_weather){const{city}JSON.parse(tc.function.arguments);label(EXECUTE,C.tool,get_weather(${city}));constresultget_weather(city);label(RESULT,C.result,result);messages.push({role:tool,tool_call_id:tc.id,content:result});}}step(4,将工具结果回传 LLM生成最终回答...);responseawaitopenai.chat.completions.create({model:qwen-plus-2025-07-28,tools:tools,messages:messages,});line(═);console.log(${C.success}✦ 最终回答${response.choices[0].message.content}${C.reset});line(═);console.log();}run();运行node index.js命令4. 和mcp的区别Function Calling 是模型内置的一项能力用于在对话中输出结构化的工具调用指令MCP是一个外部的、标准化的通信协议框架用于连接模型与各种外部工具或数据源。1Function Calling 流程Function Calling 的核心是一个以模型为中心的、相对简单的请求-响应循环。其典型流程如下用户请求应用将用户消息和可用的工具列表发送给模型。模型决策模型分析用户意图若判断需要调用工具则生成一个结构化的工具调用请求包含函数名和JSON格式的参数。本地执行应用端解析该请求在本地执行对应的函数代码。结果回传应用将函数执行结果作为消息附加到对话历史中再次发送给模型。最终响应模型整合工具返回的结果生成最终的自然语言回复给用户。整个流程的关键在于模型直接输出可执行的函数调用参数由应用端负责执行并完成闭环。2MCP 流程MCP 则定义了一个更解耦、更标准化的架构其流程涉及独立的组件工具发现与连接一个 MCP 客户端连接到一个或多个 MCP 服务器。服务器会声明其提供的工具、资源等能力。会话建立客户端与服务器之间建立一个有状态的会话。请求转发当模型需要调用工具时它不再直接生成函数参数而是生成一个意图例如“需要查询天气”。客户端将此意图按照 MCP 协议格式化为一个请求并转发给对应的 MCP 服务器服务器执行MCP 服务器接收请求在其环境中执行具体操作如调用API、查询数据库并将结果按照 MCP 协议格式化。结果返回服务器将结果返回给客户端客户端再将其整合后提供给模型以生成最终回复。MCP 的关键在于模型不直接处理具体的函数调用格式而是通过一个标准协议层与外部工具交互这使得工具可以作为独立服务存在并实现更复杂的上下文管理和能力发现。5. 总结Function Calling让大模型能够主动输出结构化调用请求由应用端执行函数并回传结果最终生成落地回答。它连接了语言与行动是 AI 从“理解”走向“执行”的关键一步。大模型的本质界定了它的能力边界却因此获得了无限的外延。真正的强大从不是全知全能而是清醒地知道何时该低头问路。每一个结构化的函数调用请求都是一次谦卑的求助也是一次优雅的借力——在承认局限中抵达更远的远方。