AI 怎么调用工具的?一文讲透 Function Calling / Tool Use 机制 翠花让 AI 帮忙发个周报邮件。AI 回了一句邮件已发送邮箱里也确实多了一封。可有件事细想挺怪。AI 压根没有手键盘一次都没碰过。邮件明明发出去了它却没动手。难不成邮件自己长腿跑出去的往下看就明白了。AI 调用工具其实是点菜把 AI 想成饭馆里那个会点菜的人。用户张嘴说想吃红烧肉它扫一眼墙上的菜单——每道菜写着名字和用料。它琢磨一下开出一张点菜单红烧肉一份。单子递给后厨。后厨才真的开火。这三样东西对一下菜单就是工具清单每个工具标着我能干啥、要什么参数点菜单就是模型吐回来的那段 JSON名叫 tool_calls写着调哪个、传什么后厨是真正干活的代码发邮件、查库、调别人的接口全在它那儿。最要命的是点菜单不是菜。单子开出来不等于红烧肉已经在桌上了。AI 只说要这道菜后厨做不做、怎么做是后厨自己的事。AI 从头到尾没进过厨房半步。Function Calling 干的事其实就这个它不动手只动嘴。这机制名字起得也绕Function Calling、Tool Use说的是一回事别被词吓着。——AI 动嘴开单后厨动手做菜中间飘一张点菜单一眼看出来说和做是两拨人。拆开一次调用回合光比喻不够看真东西。一次工具调用本质就是一次普通对话只是多塞了一份菜单进去。发给模型的请求里除了一问一答还多出一个 tools 字段。这个字段把每个工具的能力写清楚叫什么、能干嘛、缺什么参数。模型根本看不见工具肚子里怎么实现它只知道有这些本事能用。模型吐回来的东西分两种情况 A直接给段人话用不着调工具情况 B甩一段 tool_calls 出来函数名加参数全是 JSON情况 B 只是模型说要调没真调。真动手是下一拍的事。翠花那个发邮件模型吐回来的差不多长这样{ tool_calls: [ { function: { name: send_email, arguments: {\to\:\bossx.com\,\body\:\本周周报见附件\} } } ] }翠花这辈子不会看见这段鬼画符。她只收到最后那句邮件发啦老板 15:32 收到的。程序拿到这段 JSON按名字捞到 send_email 这个函数真去敲邮件接口把信递出去。发完把回执——“发送成功15:32”——塞回对话。模型再拿它攒出一句人话。有时候不是一趟是好几趟一道菜偶尔不够。翠花来一句把本周周报整理好发给老板再提醒我周五复盘。AI 可能先调工具把本周文件拽过来翻两页发现还差点上月对照数据又调一次去查齐了才调发邮件的工具末了再调个设提醒的。这几步可能在模型和代码之间转好几个圈转到它觉得料够了才吐最终回答。模型不会一次把活干利索它是一边问后厨、一边拼盘。跟 Skill 那篇啥关系前阵写过一篇 Skill讲给 AI 塞本操作手册同类任务它自己按步骤走不用回回重教。那篇站在能力定义这头给 AI 一本手册它知道发周报这类活该按啥流程走。手册里通常写着第一步调发邮件的工具。可手册写了调工具这步怎么从一句话变成邮件真飞出去中间那一下——模型开单、后厨照做、菜端回来。拼起来看Skill 是菜单加手册管有什么能力、按啥顺序用Function Calling 是开单加做菜管能力怎么真落地。一个管有啥、咋排一个管咋真干。两篇连着读AI 用工具的整条线才接上。干安全的为啥得盯这块顺带说个干安全的都该绷根弦的事。模型就是个传声筒。真去执行的是代码而且是以这份代码所在进程的身份去执行的。后厨手里攥着邮箱、数据库、服务器的权限这些权限都是运行环境开给它的。一旦模型读到的东西里混进旁人的话——比如它去抓了个网页网页里藏着把通讯录发到某邮箱——它就可能在那张点菜单上写出危险调用。后厨不分真假照单全做。提示词注入最阴就阴在这它不直接砸你系统是骗那个会点菜的人开一张害人的单子。工具给多大权、参数要不要验、抓来的内容能不能直接进单子全得在代码层兜住别指望模型自觉。干安全的看到这后背发凉正常。一次完整回路用户说需求 → 模型看菜单开单(JSON) → 代码后厨执行 → 结果端回来 → 模型攒回答。一圈把说和做的分界标清楚。关注小虾一起成长一起进化