资讯动态

第3讲:工具调用(Function Calling)——Agent 的“手”

发布时间:2026/8/4 14:44:36 来源:尧图企业网站定制
在第一讲里我们让 Agent 学会了“动嘴”思考与对话第二讲让它学会了“发声”API 调用与流式输出。但这还不够真正的 Agent 必须能“动手”干活。这一讲我们将解锁大模型最强大的原生能力之一Function Calling工具调用。这是大模型从“聊天机器人”进化为“智能体”的分水岭。一、为什么需要 Function Calling如果没有 Function Calling大模型就像一个被关在玻璃罩里的超级大脑它能告诉你“北京现在天气是 25 度”因为它背过书。但它无法直接去查实时的天气 API也无法直接操作你的电脑、数据库或文件系统。Function Calling 就是打破玻璃罩的那只手。它允许大模型在对话过程中识别出用户的需求并主动返回一个“调用指令”告诉程序“我要用某个工具参数是 XXX”。二、Function Calling 的核心原理整个过程像一个“三幕剧”第一幕声明你告诉大模型“我这里有几个工具名字叫get_weather和calculator分别用来查天气和算数学题。”第二幕决策用户问“今天北京热吗顺便帮我算下 125 * 47”。大模型分析后决定调用get_weather和calculator。第三幕执行大模型返回结构化的 JSON 数据而非自然语言。你的代码拿到这个 JSON去真正执行对应的 Python 函数然后把结果再喂给大模型大模型最后组织成一句人话回答用户。三、实战打造一个带工具的 Agent我们将创建一个具备“天气查询”和“计算器”能力的 Agent。1. 定义工具集Tool Schema首先我们需要按照 OpenAI 兼容的格式定义我们的工具# 工具定义列表 tools [ { type: function, function: { name: get_weather, description: 获取指定城市的当前天气温度摄氏度。, parameters: { type: object, properties: { city: {type: string, description: 城市名称如北京、上海} }, required: [city] } } }, { type: function, function: { name: calculator, description: 执行数学计算支持加减乘除。, parameters: { type: object, properties: { expression: {type: string, description: 数学表达式如 125 * 47} }, required: [expression] } } } ] # 本地对应的 Python 函数实现 def get_weather(city: str): # 模拟天气数据 API mock_data {北京: 25, 上海: 28, 广州: 32} temp mock_data.get(city, 20) return f{city}当前温度是 {temp}°C def calculator(expression: str): # 安全计算只允许数字和基础运算符 try: allowed_chars set(0123456789-*/.() ) if not all(c in allowed_chars for c in expression): return 表达式包含非法字符 result eval(expression) # 注意生产环境慎用 eval这里仅为演示 return str(result) except: return 计算失败2. 构建 Agent 循环逻辑import json import requests API_KEY 你的API_KEY BASE_URL https://api.deepseek.com/v1/chat/completions def call_llm_with_tools(messages, tools): headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } payload { model: deepseek-chat, messages: messages, tools: tools, tool_choice: auto, # 让模型自动决定是否调用工具 temperature: 0.0 } response requests.post(BASE_URL, headersheaders, jsonpayload) response.raise_for_status() return response.json() def agent_run_with_tools(user_input): messages [ {role: system, content: 你是一个有帮助的助手可以调用工具获取天气或进行计算。}, {role: user, content: user_input} ] # 第一步模型决策是否调用工具 response_data call_llm_with_tools(messages, tools) message response_data[choices][0][message] # 检查是否有工具调用 if tool_calls in message and message[tool_calls]: print([模型决策]: 需要调用工具...) tool_call message[tool_calls][0] func_name tool_call[function][name] args json.loads(tool_call[function][arguments]) print(f[调用工具]: {func_name}({args})) # 执行本地函数 if func_name get_weather: tool_result get_weather(**args) elif func_name calculator: tool_result calculator(**args) else: tool_result 工具不存在 print(f[工具返回]: {tool_result}) # 将工具结果返回给模型让模型总结回答 messages.append(message) # 添加模型的调用请求 messages.append({ role: tool, tool_call_id: tool_call[id], name: func_name, content: tool_result }) # 第二步模型根据工具结果生成最终回答 final_response call_llm_with_tools(messages, tools) # 注意第二次调用不需要传 tools或者传空视模型而定这里为了简单省略 final_content final_response[choices][0][message][content] return final_content else: # 如果没有调用工具直接返回内容 return message[content] # 运行测试 if __name__ __main__: user_input 今天北京热吗顺便帮我算下 125 乘以 47 是多少 output agent_run_with_tools(user_input) print(f\n[最终输出]: {output})3. 运行效果预览[模型决策]: 需要调用工具... [调用工具]: get_weather({city: 北京}) [工具返回]: 北京当前温度是 25°C [调用工具]: calculator({expression: 125 * 47}) [工具返回]: 5875 [最终输出]: 北京当前温度是 25°C不算太热。125 乘以 47 的结果是 5875。四、避坑指南排雷专区模型瞎编函数名Hallucination症状模型返回的tool_calls里的name并不是你定义的get_weather而是weather_api_v2。解法在system prompt中严格限定可用工具列表并且开启strict模式如果支持。同时代码中要有兜底判断如果func_name不在我们的字典里就返回错误不要继续执行。参数格式不对JSON 解析失败症状json.loads(tool_call[function][arguments])报错。解法大模型的参数生成有时不规范。务必在parameters定义中写清楚type和required。如果解析失败可以尝试让模型重新生成或者使用正则提取。无限递归调用症状Agent 陷入死循环一直调用同一个工具。解法在代码中加入max_iter最大迭代次数限制比如最多允许调用 3 次工具超过就强制结束并提示用户。五、课后作业扩展工具集增加一个名为search_web的工具模拟返回一段文本让 Agent 能回答“今天是几号”这种需要实时知识的提问。人工确认机制修改代码如果调用的是“删除文件”这类危险工具Agent 不直接执行而是输出“即将执行删除操作请确认[Y/N]”只有在用户输入 Y 时才真正执行。观察日志在代码中打印出每一次messages的完整内容观察大模型是如何通过role: tool的消息把控制权交还给模型的。六、总结这一讲我们掌握了Function Calling 的运作机制声明 - 决策 - 执行 - 反馈。如何让大模型调用本地 Python 函数通过 JSON Schema 定义接口。构建了一个具备实际功能的 Agent能查天气、能计算。学会了处理工具调用中的常见异常。至此你的 Agent 已经拥有了“手脚”不再是只会动嘴的聊天机器人。下一讲我们将讲解ReAct 模式思考 行动让 Agent 学会像人类一样在复杂任务中进行多步骤的推理和规划。 开发之余处理 Base64、JWT 解析、JSON 格式化、Crontab 计算、PDF 合并压缩这些碎片需求我常用一个纯前端本地工具箱zz365.top子页 PDF 大师PDF 大师 - zz365工具箱。所有计算在浏览器完成文件不上传服务器关页即清。免费、无登录、无广告适合开发者当常驻标签页。

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

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

免费获取报价