这是系列的第 11 篇。整个系列写给零基础、想入行 AI 的朋友每天一篇30 天后你会做出 3 个能写进简历的项目。这篇解决什么问题昨天那个“第 11 轮忘掉第 1 轮”的实验好多人做出来了结论都挺一致AI 的记忆确实是拼出来的不是天生的。今天往一个更刺激的方向走。到目前为止你的 AI 有个硬伤它只会说话。你问它今天天气它编一个你让它算个数它可能算错你让它读你的文件它做不到。不是它笨是它只有一张嘴没有手脚。今天要装的 Function Calling就是给它装上手和脚。这是通往 Agent 的第一道门也是项目三的地基。别被这个英文名吓住它一点都不复杂。一、先想清楚AI 为什么不能自己做事你可能会想我直接告诉它“你现在的身份是天气助手有人问天气你就回答”行不行不行。因为大模型的全部能力就是预测文字它没有办法去访问网站、读取文件。它所谓的“知道今天天气”只是根据训练数据猜一个像样的答案纯属编造。打个比方它是个博学但被困在房间里的人能跟你聊任何话题但打不开门。Function Calling 做的事情就是给它开一扇窗你替它去查、去读、去算把结果递进来它负责理解和使用。关键的一句话真正干活的是你的代码AI 只负责决定“该干什么”和“结果怎么用”。二、流程拆解五步走完一轮听起来玄拆开就是五步每一步你都能看懂你告诉 AI我这儿有几个工具工具清单AI 判断用户这个问题该用哪个工具需要什么参数你的代码照着 AI 的要求去执行真的去查天气你把执行结果递回给 AIAI 拿着真实结果组织成人话回答用户看到没AI 从头到尾没干过任何实事它只做了两次“判断”。真正的动作全是你的 Python 代码完成的。三、实战给 AI 装一个查天气的能力新建 tools.py跟着敲。先定义工具也就是告诉 AI 它有什么“手脚”importjsonfromopenaiimportOpenAI clientOpenAI(api_key你的密钥,base_urlhttps://api.deepseek.com)# 第一步描述工具清单。这是给 AI 看的“说明书”tools[{type:function,function:{name:get_weather,# 工具名要和后面的函数对应description:查询某个城市的实时天气,parameters:{# 告诉 AI 需要什么参数type:object,properties:{city:{type:string,description:城市名如北京}},required:[city]}}}]然后写出真正的函数也就是干活的代码defget_weather(city):# 教学演示用假数据真实项目里这里去调天气 APIdata{北京:晴25度,上海:小雨22度,济南:多云24度}returndata.get(city,查不到这个城市)接着是核心的调用循环messages[{role:user,content:济南今天天气怎么样}]# 第二次请求这次带上工具清单responseclient.chat.completions.create(modeldeepseek-chat,messagesmessages,toolstools# 关键把工具清单发给 AI)msgresponse.choices[0].message# AI 的判断结果# 如果 AI 决定要用工具就执行ifmsg.tool_calls:callmsg.tool_calls[0]# 取出它想调用的那个工具argsjson.loads(call.function.arguments)# 取出参数是个 JSON 字符串print(AI 决定调用,call.function.name,参数,args)resultget_weather(args[city])# 真的去执行# 把AI的请求和执行结果都追加进对话记录messages.append(msg)messages.append({role:tool,# 新角色tool专门装工具的执行结果tool_call_id:call.id,# 对号入座回应哪次调用content:result})# 第三次请求把结果给 AI让它组织语言finalclient.chat.completions.create(modeldeepseek-chat,messagesmessages)print(AI 回答,final.choices[0].message.content)跑一遍你会看到 AI 先说“我要调用 get_weather参数是济南”然后输出基于真实数据整理的回答。注意这里其实发生了两次 AI 调用第一次它判断该用什么工具第二次它根据结果生成回答。中间干活的是你自己的代码。这个结构理清了后面做 Agent 就是在这个循环上加东西。四、为什么这一招这么重要Function Calling 是分水岭技术。有它之后AI 能做的事从“聊天”扩展到“操作世界”查数据库、查天气、搜网页读你的文件、写入表格发邮件、下单、调用你公司内部的接口你以后面试时听到的“智能体”“Agent”本质就是“大模型 工具调用 自主循环”。今天你手写了一遍最小版本后面只是让它更聪明、能连着用好几个工具。常见报错排查报错一AI 不调用工具直接自己编了个答案。检查两点一是 tools 参数有没有真的传进去二是 description 写得够不够清楚。AI 是靠这段描述判断该不该用的。描述里写清楚“什么时候用”比如“当用户询问某地实时天气时使用”。报错二json.loads(call.function.arguments) 报错。arguments 的格式偶尔不规范加个 try 兜底。另外注意 AI 选错工具时参数可能对不上先 print 出来看看。报错三追加 tool 消息时漏了 tool_call_id。这个字段是“回执单号”必须和上面那次调用对上漏了 AI 会不知道这结果是谁的直接报错。报错四模型不支持工具调用。换个支持的模型。主流模型基本都支持如果报错说 model does not support tools去平台文档确认下具体模型名。今天的作业把上面的例子跑通然后加一个新工具比如 get_time报时或者 calculator做四则运算。写完在评论区说说你加的工具AI 有没有乖乖用跑通了你就正式摸到 Agent 的门槛了。明天预告Day 12《像产品一样稳流式输出、报错重试、花钱控制》。今天你已经能调工具了但代码还很脆网络抖一下报错等半天没反应账单什么样也不知道。明天把这三件事解决掉你的程序才算像个能交出去的东西。————————————————*系列目录30天从零开始学AI应用 开发