资讯动态

大模型应用开发教程09 | Function Calling 原理与实践(工具调用)

发布时间:2026/8/13 8:25:41 来源:尧图企业网站定制
理论部分前面我们做的事情本质上都是给模型一段输入让模型生成一段输出。但当我们希望模型“帮我们做事”时仅靠生成文本往往不够我们想要实时数据天气、股价、数据库查询结果模型本身拿不到我们想要模型触发动作发请求、查文件、执行计算文本并不能直接执行Function Calling工具调用就是把“模型输出”升级为“可执行的结构化意图”我们把可用工具函数及参数规则告诉模型模型根据用户问题决定要不要调用工具、调用哪个工具、传什么参数我们在代码里执行真实函数把函数结果回传给模型模型基于工具结果生成最终回答从工程视角看这里最关键的是模型只负责决定“调用什么 参数是什么”真正执行仍然由我们的程序掌控。这使得工具调用更可控、更可验证也更容易接入业务系统。一个完整的工具调用链路里会出现三类关键信息Tool Definition工具描述函数名、用途描述、参数 schema类型、枚举、必填字段Tool Call工具调用请求模型生成的结构化调用意图函数名 argumentsTool Result工具执行结果我们执行函数后的返回值通常是 JSON 字符串或可解析文本实践部分本案例做什么我们实现一个“智能天气助手”让模型在需要时自动调用get_current_weather工具用户提问比如“北京天气怎么样”模型决定调用工具并给出参数location、unit我们执行函数这里用模拟数据代替真实天气 API把工具返回结果喂回模型生成最终答复主要代码本篇使用项目脚本src/4.1_weather_agent.pyimportosimportjsonfromdotenvimportload_dotenvfromopenaiimportOpenAI# 加载环境变量load_dotenv()clientOpenAI(api_keyos.getenv(ZHIPUAI_API_KEY),base_urlos.getenv(ZHIPUAI_BASE_URL))# 1. 定义实际的工具函数 # 这里我们用模拟数据实际项目中可以调用真实的天气 APIdefget_current_weather(location,unitcelsius):获取指定城市的当前天气print(fDEBUG: 正在查询{location}的天气...)if北京inlocation:returnjson.dumps({location:北京,temperature:22,unit:unit,description:晴朗})elif上海inlocation:returnjson.dumps({location:上海,temperature:25,unit:unit,description:多云})elif广州inlocation:returnjson.dumps({location:广州,temperature:30,unit:unit,description:雷阵雨})else:returnjson.dumps({location:location,temperature:unknown})# 2. 定义工具描述 (Tool Definitions) # 告诉 LLM 有哪些工具可用以及参数格式tools[{type:function,function:{name:get_current_weather,description:获取指定城市的当前天气,parameters:{type:object,properties:{location:{type:string,description:城市名称如北京、上海,},unit:{type:string,enum:[celsius,fahrenheit],description:温度单位默认为摄氏度},},required:[location],},},}]# 3. 对话主循环 defrun_conversation():print( ️ 智能天气助手 (Function Calling Demo) )print(试着问我北京天气怎么样 或 上海和广州哪里更热 (输入 q 退出))messages[]# 维护上下文whileTrue:user_inputinput(\n 你: )ifuser_input.lower()in[q,quit]:break# 将用户消息加入历史messages.append({role:user,content:user_input})# 第一次调用模型查看是否需要调用工具responseclient.chat.completions.create(modelglm-4-flash,# 确保模型支持 Function Callingmessagesmessages,toolstools,tool_choiceauto,# 让模型自动决定是否调用工具)response_messageresponse.choices[0].message tool_callsresponse_message.tool_calls# 如果模型决定调用工具iftool_calls:# 必须先把模型的这条回复包含工具调用请求加入历史messages.append(response_message)print(f AI 决定调用工具:{len(tool_calls)}个请求)# 建立函数名到实际函数的映射available_functions{get_current_weather:get_current_weather,}# 遍历所有工具调用请求fortool_callintool_calls:function_nametool_call.function.name function_to_callavailable_functions[function_name]function_argsjson.loads(tool_call.function.arguments)# 执行真正的函数function_responsefunction_to_call(locationfunction_args.get(location),unitfunction_args.get(unit),)print(f -- 调用{function_name}({function_args}))print(f -- 返回{function_response})# 将工具执行结果作为 tool 类型的消息加入历史messages.append({tool_call_id:tool_call.id,role:tool,name:function_name,content:function_response,})# 第二次调用模型让模型根据工具结果生成最终回答print( AI 正在根据工具结果生成回答...)final_responseclient.chat.completions.create(modelglm-4-flash,messagesmessages,)ai_replyfinal_response.choices[0].message.contentprint(f AI:{ai_reply})# 把最终回答也加入历史messages.append({role:assistant,content:ai_reply})else:# 不需要调用工具直接回复ai_replyresponse_message.contentprint(f AI:{ai_reply})messages.append({role:assistant,content:ai_reply})if__name____main__:run_conversation()运行方式在项目根目录执行python3 src/4.1_weather_agent.py运行结果示例我们可以输入一个需要实时信息的问题例如“北京天气怎么样”“上海和广州哪里更热”运行时会看到类似输出模型的措辞可能不同但工具调用链路一致 ️ 智能天气助手 (Function Calling Demo) 试着问我北京天气怎么样 或 上海和广州哪里更热 (输入 q 退出) 你: 上海和广州哪里更热 AI 决定调用工具: 2 个请求 DEBUG: 正在查询 上海 的天气... -- 调用 get_current_weather({location: 上海, unit: celsius}) -- 返回 {location: 上海, temperature: 25, unit: celsius, description: 多云} DEBUG: 正在查询 广州 的天气... -- 调用 get_current_weather({location: 广州, unit: celsius}) -- 返回 {location: 广州, temperature: 30, unit: celsius, description: 雷阵雨} AI 正在根据工具结果生成回答... AI: ...总结这一篇我们跑通了 Function Calling 的完整闭环模型先决定是否调用工具以及工具参数我们负责执行真实函数并把结果回传最后再由模型整合工具结果生成最终回答。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价