Function Call 真没你想的那么简单
很多人第一次接触 这玩意不就是“让大模型调个工具”吗? 给模型塞几个工具描述,再让它返回一段 JSON,程序照着执行,不就完事了? Demo 阶段,确实差不多。 但只要你真的把它往生产里推,很快就会发现,事情根本没这么简单。 因为 说白了, 跨过去了,才叫系统。 跨不过去,项目基本就会卡在“演示很好看,线上很难用”这个尴尬阶段。 今天不聊空概念,我们就聊点更真实的: 为什么很多 AI 项目看起来已经接上了 Function Call,最后还是做废了? 因为他们往往都死在下面这 5 步。 这是最常见、也最致命的误解。 很多人说: 这句话听起来顺,实际上很容易把整个系统设计带歪。 更准确一点的说法应该是: 比如模型返回: 这说明了什么? 说明模型在说: 注意,是“建议”。 真正干活的,不是模型,而是你的宿主系统。 这两者的区别为什么这么重要? 因为一旦你脑子里默认“模型能直接执行函数”,你就很容易漏掉下面这些关键环节: 最后就会出现一种很典型的系统幻觉: 所以 模型负责出主意,系统负责拍板和执行。 这条边界不划清,后面全是坑。 很多 AI Demo 看起来很丝滑,是因为它的工具参数极其简单。 比如: 参数通常就一两个字段,模型乱来也乱不到哪去。 但只要你把场景稍微做真实一点,问题马上就出来了。 比如一个企业内部 Agent,要支持: 这时候一个工具参数可能长成这样: 到了这里,模型就不再只是“会不会选工具”的问题了,而是: 这也是为什么真正做过线上系统的人,很少会把注意力放在“模型选没选对工具”上。 他们更警惕的是: 这比完全不调用更麻烦。 因为它特别像真的,最容易骗过开发者。 所以成熟一点的系统,通常都会在参数层加一整套防线: 如果业务更敏感,还会加: 很多项目不是死在“模型不够聪明”,而是死在“大家太相信模型生成的参数”。 这是第二个特别容易被忽略的点。 很多团队第一次做 Agent,都会很兴奋地展示: 但问题是,会调一次工具 和 能稳定完成任务,根本不是一回事。 一个真正可用的 Agent,往往不是一步结束,而是这样一个闭环: 也就是说,真正难的地方不在第一跳,而在后面那几跳。 因为只要进入多步调用,系统就会立刻暴露出一堆新问题: 这就是为什么很多“看上去很聪明”的 Agent,到了线上体验特别差。 不是因为模型不会思考,而是因为系统没有给它设边界。 真正做生产的人,通常会给 Agent 加很多“刹车片”: 这些东西看起来一点都不性感,但它们往往才是 AI 系统能不能上线的关键。 说到底,Agent 的上限取决于模型,但下限取决于治理。 这又是一个特别像细节、实际上特别核心的点。 很多人以为 Function Call 的主要工作在“前半段”: 但真正决定回答质量的,往往是“后半段”: 很多系统之所以看起来越做越乱,根本原因不是模型不会调工具,而是工具返回结果太脏。 常见问题包括: 举个很真实的例子。 你调了一个订单接口,原始返回长这样: 这东西你直接喂回模型,模型未必能抓到重点。 更合理的做法通常是先整理成它更容易消费的结构,比如: 别小看这一步。 它本质上是在做一件非常重要的事: 如果这层做不好,后面再好的模型也会被喂歪。 所以真正成熟的 Function Call 系统,通常都会单独做一层结果治理: 很多时候,项目效果差,不是 Prompt 不行,而是喂回去的东西本来就是垃圾。 这是最扎心的一点。 很多团队做 Function Call,到最后判断效果的方式非常朴素: 这在普通功能开发里都算危险,在 AI 系统里更是高风险操作。 因为 Function Call 最麻烦的地方就在于: 它不是“对”或者“错”这么简单。 它会出现大量灰度失败: 如果没有评测体系,这些问题你几乎看不出来。 所以真正靠谱的团队,通常会盯这些指标: 更进一步,还会专门构造测试集: 你会发现,做到这里之后,Function Call 就已经完全不是“接个工具”这么简单了。 它开始越来越像一个完整的工程系统: 这也是为什么很多人觉得 AI 项目“落地难”。 不是难在模型本身,而是难在你要把一堆高不确定性的环节,硬生生做成一个稳定系统。 回头看你就会发现,Function Call 最容易骗人的地方就在这里: 它太容易做出一个“看起来已经成功”的 Demo 了。 模型能返回工具名。 参数也像模像样。 接口也调通了。 屏幕上甚至已经出现结果了。 于是很多人会下意识觉得: 恰恰相反。 大多数项目到了这里,其实才刚刚开始。 真正决定成败的,是后面这些更脏、更难、也更像工程的问题: 如果这些问题没处理好, 只有把这些都补齐,它才会真正变成 AI 系统里的基础设施。 这也是为什么,真正做过生产 AI 系统的人,聊起 Function Call 时,几乎从来不会只聊 Prompt。 他们更关心的,永远是边界、失败、治理和闭环。 写在最后: 最近私信问我面试题的小伙伴实在太多了,一个个回有点回不过来。 我大家公认最容易挂的 AI/Go/Java 面试坑点 整理成了一份 PDF 文档。里面不光有题,还有解题思路和避坑指南。 想要的同学,直接加我微信wangzhongyang1993,或者关注并私信我 【面试】,我统一发给大家。Function Call,都会有一种错觉:Function Call 一旦离开 PPT,真正要面对的问题就不再是“模型会不会调工具”,而是:Function Call 不是一个“锦上添花的小特性”,而是 AI 应用从“能聊天”走向“能做事”的那道坎。1. 第一步就理解错了:模型并没有“调用函数”
Function Call 就是模型调用函数。
模型从来没有真正“执行函数”,它只是输出了一个结构化的动作建议。
{
"tool_name": "search_docs",
"arguments": {
"query": "MCP 和 Function Call 的区别",
"top_k": 5
}
}“我建议你现在去调一下
search_docs,参数大概这么填。”你以为自己把执行能力交给了模型,实际上你只是把风险交给了线上。
Function Call 最核心的一层,不是“调用”,而是结构化决策表达。2. 真正麻烦的,不是选工具,而是“参数终于出错了”
{
"customer_id": "C1024",
"priority": "high",
"assignee": "sales_ops",
"due_time": "2026-04-22 18:00:00",
"notify_users": ["u1001", "u1002"],
"tenant_id": "t_shanghai",
"reason": "客户要求加急处理"
}模型给出了一个看起来很合理、实际上根本不能执行的参数集合。
3. 能跑通一次,不代表它能稳定地“做完一件事”
“你看,它已经会调工具了!”
理解问题
-> 判断信息是否足够
-> 选择工具
-> 生成参数
-> 执行工具
-> 读取结果
-> 判断下一步
-> 再次调用工具或结束4. 大家都在聊工具调用,真正决定体验的却是“结果怎么喂回去”
工具执行完之后,你到底把什么结果喂回给模型?
{
"code": 0,
"message": "success",
"trace_id": "8f97c1...",
"data": {
"order_id": "A12345",
"status": "shipped",
"warehouse_code": "WH_09",
"sync_version": 17,
"operator_id": "sys_1029",
"updated_at": "2026-04-22 10:30:00"
}
}{
"order_id": "A12345",
"current_status": "已发货",
"last_updated_at": "2026-04-22 10:30:00"
}把“系统返回结果”翻译成“模型可继续推理的证据”。
5. 最后一个坑,也是最大的坑:没有评测,你根本不知道自己做得到底好不好
真正难的,从来不是让模型调一次工具
这事差不多做完了。
Function Call 就很容易沦为一个华丽但脆弱的功能展示。很多人以为 Function Call 解决的是“模型怎么调工具”,其实它真正解决的问题是:模型如何以一种可控、可验证、可治理的方式,开始接管现实世界里的动作。
END