OpenAI API Tool Call:模型如何调用你的函数
OpenAI API Tool Call模型如何调用你的函数一句话理解 Tool Call模型负责判断“该调用什么、参数是什么”应用负责真正执行函数再把结果交还给模型组织答案。它不是让大模型直接运行你的代码而是一套连接大模型与外部能力的协议。数据库查询、天气接口、订单系统都可以通过同一套模式接入。核心流程以weather_call.py中的天气查询为例一次完整调用分为 5 步应用把用户问题和工具定义一起发给模型。模型返回tool_calls给出函数名和 JSON 参数。应用解析参数执行本地的get_weather()。应用通过tool_call_id把执行结果回传给模型。模型结合上下文和工具结果生成最终自然语言回答。关键点是第 3 步发生在应用侧不在模型内部。因此鉴权、参数校验和函数执行仍由开发者控制。Python 核心代码先安装依赖python-mpipinstallopenai python-dotenv在同级目录创建.envOPENAI_API_KEY你的_API_Key OPENAI_BASE_URL你的_API_地址 OPENAI_MODEL服务方支持的模型名下面是tools/tool_calls完整流程importjsonimportosfromdotenvimportfind_dotenv,load_dotenvfromopenaiimportOpenAI load_dotenv(find_dotenv(),overrideTrue)MODELos.environ[OPENAI_MODEL]WEATHER_DATA{北京:{condition:晴,temperature:26},上海:{condition:多云,temperature:24},杭州:{condition:小雨,temperature:22},}WEATHER_TOOL{type:function,function:{name:get_weather,description:查询指定城市的当前天气。,parameters:{type:object,properties:{location:{type:string,description:城市名称},unit:{type:string,enum:[celsius,fahrenheit],},},required:[location,unit],additionalProperties:False,},},}defcreate_client():returnOpenAI(api_keyos.environ[OPENAI_API_KEY],base_urlos.environ[OPENAI_BASE_URL],)defget_weather(location,unitcelsius):本地模拟天气数据真实项目可替换为 HTTP API 或数据库。citynext((namefornameinWEATHER_DATAifnameinlocation),None)ifcityisNone:return{status:not_found,location:location}weatherWEATHER_DATA[city]temperatureweather[temperature]ifunitfahrenheit:temperatureround(temperature*9/532,1)return{status:ok,location:city,condition:weather[condition],temperature:temperature,unit:unit,}defdispatch_function(name,arguments):解析模型参数只调用白名单内的函数。try:paramsjson.loads(arguments)ifname!get_weather:return{error:f未知函数:{name}}returnget_weather(**params)except(json.JSONDecodeError,TypeError)asexc:return{error:str(exc)}defrun_tool_call(client,question):messages[{role:user,content:question}]# 第一次请求让模型决定是否调用工具。responseclient.chat.completions.create(modelMODEL,messagesmessages,tools[WEATHER_TOOL],tool_choiceauto,)assistant_messageresponse.choices[0].message tool_callsassistant_message.tool_callsifnottool_calls:returnassistant_message.content# 保留模型返回的 tool_calls。messages.append({role:assistant,content:assistant_message.content,tool_calls:[{id:call.id,type:call.type,function:{name:call.function.name,arguments:call.function.arguments,},}forcallintool_calls],})# 应用执行函数并通过 tool_call_id 回传结果。forcallintool_calls:resultdispatch_function(call.function.name,call.function.arguments,)messages.append({role:tool,tool_call_id:call.id,content:json.dumps(result,ensure_asciiFalse),})# 第二次请求模型根据工具结果生成最终回答。final_responseclient.chat.completions.create(modelMODEL,messagesmessages,)returnfinal_response.choices[0].message.contentif__name____main__:clientcreate_client()print(run_tool_call(client,上海现在天气怎么样))运行python weather_call.py代码中必须理解的 4 个点WEATHER_TOOL是给模型看的接口说明使用 JSON Schema 约束参数。tool_choiceauto不会强制调用工具因此tool_calls可能为空。模型返回的函数名和参数不可信应用必须使用函数白名单和参数校验。tool_call_id用来关联调用与结果不能省略一次响应也可能包含多个调用。真实项目中通常只需要把get_weather()替换为实际 HTTP API、数据库查询或业务方法其他调用流程基本不变。工程注意点支付、删除、发布等有副作用的工具需要鉴权、幂等和人工确认。外部接口应设置超时和重试并记录函数名、参数、耗时与结果。复杂任务可能连续产生tool_calls生产代码应增加循环次数上限。结论Tool Call 的本质不是“模型执行函数”而是一个受控闭环模型生成调用意图 → 应用执行真实能力 → 模型解释执行结果参考资料OpenAI 官方 Function Calling 指南