深度解析 Function Calling:大模型如何连接外部系统并执行动作
大模型仅仅是一个聊天机器人吗?当然不是。然而,它“干活”的方式与大多数人的直觉存在显著差异。当你要求模型查询最新订单或预订明天的会议室时,一个真正有用的系统绝不能让模型编造一段听起来合理但实则虚假的回答。它必须真正连接数据库、日历和搜索引擎。
这里的关键在于:真正执行动作的并不是模型本身。
在控制台层面,模型输出的并非最终答案,而是一张结构化的“卡片”。这张卡片以标准的 JSON 格式列出了需要调用的函数名称及具体参数。模型的核心任务是将用户的自然语言意图翻译成这张卡片。随后,这张卡片需要通过外层应用系统的“闸门”,由系统负责校验和执行,最后将结果返回。
这种分工必须清晰界定:模型负责提出调用哪个工具以及参数是什么,而系统决定能否执行以及如何执行。 本文将拆解这条链路,深入剖析工具调用(Function Calling)的机制、流程及安全边界。

开发者需要向模型提供什么?
在实现工具调用时,开发者需要向模型提供“工具声明”,主要包含以下三个核心要素:
-
工具名称(Tool Name) 例如
check_order(查订单)。名称必须明确且唯一,因为模型依靠名称来指认具体调用哪个工具。 -
工具描述(Tool Description) 用一句话清晰告知模型该工具的功能及适用场景。这一栏最容易被开发者敷衍,但它直接决定了模型选择的准确性。如果描述模糊,模型极易选错工具。
-
参数结构(Schema) 规定工具所需的字段及其类型。例如,订单号(Order ID)和用户 ID(User ID)的数据类型,以及哪些字段是必填项。

提交这三样定义后,模型并不会直接运行代码,它只做一件事:精准地生成参数卡片。例如,将 check_order 和具体的 order_id 填入 JSON 结构中。
因此,在这一环节中,模型的角色可以概括为高精度的填表员——将用户的自然语言翻译成系统可理解的结构化数据。
工具调用的六步闭环
一次典型的工具调用遵循一个严格的六步闭环流程:
-
系统声明工具 开发者预先将工具名称和参数结构明确地交给模型。注意,这是“预先”定义,而非临时告知模型“你可以查订单”。
-
用户提出任务 用户发出自然语言指令,例如:“帮我查一下尾号 1234 的订单到哪了?”
-
模型决策与参数生成 这是模型唯一真正“出力”的环节。模型首先判断这不是纯知识问答,需要调用工具;随后从用户话语中精准提取关键实体(如订单号 1234),并将其填入 JSON 参数中。
-
应用执行工具 外层系统接收到参数卡片后,先进行权限校验,再真正调用对应的 API。请注意,校验必须在执行之前,这是安全的关键所在。
-
结果回填给模型 API 返回真实数据(如物流状态),系统将这些真实数据送回模型的上下文(Context)中。
-
模型生成最终答案 模型基于回填的真实数据生成回答,而不是依靠记忆或猜测。
整条链路的本质是:自然语言意图先转化为结构化协议,最后才转化为最终回答。

安全边界:不能神话 Agent
工具调用不等于自动可靠的操作,必须警惕模型可能犯的三类错误:
- 选错工具:例如该查订单时,模型错误地选择了退款接口。如果两个工具的描述写得过于相似,模型确实容易混淆。
- 填错参数:实体识别出错,如日期、城市或订单号提取错误;或者将用户模棱两可的说法误判为确定指令。
- 幻觉调用(最危险):参数根本不在用户输入中,模型凭空捏造出格式规整、看似真实的参数。
因此,系统必须把控以下安全边界:
- 权限控制:将高风险操作直接拦截或限制。
- 参数校验:阻断非法输入。
- 人在回路(Human-in-the-loop):对于删除数据、转账、下单、发邮件等高风险操作,通常需要显式的人工确认。
- 审计与回滚:全程日志审计,确保操作可追溯,最好支持回滚机制。
核心结论:Function Calling 提供的是调用机制,它本身不是安全策略。安全边界必须由系统工程兜底,不能指望模型“自觉”。
面试实战:四层认知框架
为了在技术面试中清晰阐述 Function Calling,可以将其压缩为以下四层认知:
-
定义层 Function Calling 是让模型按接口规范生成结构化调用请求的机制。 关键词:生成请求,而非执行。
-
流程层 掌握五个核心步骤:声明 -> 选择 -> 参数 -> 执行 -> 回填。能顺畅描述这一链路,证明你真正理解了其工作原理。
-
价值层 它打破了信息孤岛,让大模型从“指挥说”转变为能接入外部系统、查询数据库、调用业务接口并获取实时数据的智能体。这是从聊天机器人走向可用应用的分水岭。
-
边界层 校验、权限、审计等安全策略统统由外部系统负责。
如果只能记住一句话,请记住: 模型负责意图和参数,系统负责执行和边界。
这两端像缆绳一样拧在一起,缺哪一头系统都立不住。工具调用的本质,是将自然语言意图翻译成结构化的接口请求,不是让模型直接动手,而是让它的意图变得系统可控。
