大模型工具调用的基本原理是什么?为什么需要函数调用格式?
简化版
工具调用是让模型在需要外部能力时输出结构化的函数名和参数,由程序执行工具,再把结果返回给模型继续推理。函数调用格式能减少自然语言解析歧义,让权限、参数校验、重试和审计都更容易落地。
详细版
- 模型本身不直接执行工具,它只生成调用意图和参数。
- 工具 schema 描述名称、参数类型、必填字段和含义。
- 执行层负责鉴权、参数校验、调用外部系统和处理错误。
- 工具结果再次进入上下文,模型基于结果组织最终回答。
- 高风险工具必须有人类确认或代码侧权限控制。
完整版教学
这道题考察候选人是否理解 LLM 应用从“聊天”走向“可执行系统”的关键接口。
一、这题真正考什么
这道题考察候选人是否理解 LLM 应用从“聊天”走向“可执行系统”的关键接口。
Tool Calling 的本质是模型生成结构化调用意图,应用验证后真正执行函数,再把结果送回模型组织答案。模型既不自动拥有函数,也不应直接获得底层凭证。
二、核心机制怎么工作
函数调用把开放文本生成约束成可解析的结构化动作。模型根据用户意图选择工具并填参数,编排器校验后执行,再把 observation 交回模型。这样可以让模型查询数据库、调用搜索、发起工单或计算结果,同时把危险动作关在明确边界内。
工具 schema 要写清名称、字段类型、必填项和枚举;编排层解析参数、做鉴权与幂等控制,执行层设置超时和审计。结果返回后模型可能继续调用或生成最终文本,因此必须限制最大步数并区分可重试与不可重试错误。
三、带数字的拆解
用户问“查一下订单 A123 的物流”,模型应输出 get_shipping_status({"order_id":"A123"}),而不是编造物流状态。若 1000 次工具意图识别中 930 次选对工具、20 次参数缺失、50 次不该调用却调用,应该分别优化 schema 描述、澄清问题和调用阈值。
工具成功率 = 成功完成工具链的请求数 / 需要工具的请求数
误调用率 = 不需要工具却调用的次数 / 不需要工具的请求数
一次工具调用 = tool_name + validated_arguments + execution_result
四、流程图和工程落点
可以把它拆成下面这条链路来讲:
用户请求
|
模型判断是否需要工具
|
输出函数名和 JSON 参数
|
执行层鉴权与调用
|
工具结果返回上下文
|
模型生成最终答复
五、和相近方案怎么区分
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 自然语言解析 | 灵活但不稳定 | 低风险原型 |
| 函数调用 | 结构化、可校验 | 生产级工具链 |
| 代码代理 | 可组合多步执行 | 数据分析、运维自动化 |
| 固定工作流 | 确定性强 | 合规和关键业务 |
六、上线或训练时最容易踩的坑
-
不要让模型自己声明工具调用成功,成功与否应由执行层返回。
-
参数 schema 太宽会导致模型塞入模糊文本,太窄又会频繁澄清。
-
写操作要用幂等键和二次确认,避免模型重试导致重复付款、发信或删除。
-
工具返回属于外部数据,也可能含恶意指令;应结构化读取所需字段,不把整段结果当高优先级提示。
七、常见误区与追问
- 误区:模型会调用工具就等于具备真实权限。 模型只生成名称和参数,真正权限由服务端依据用户身份、租户和资源范围校验。
- 误区:函数调用可以完全消除幻觉。 工具能提供确定数据,但模型仍可能选错工具、填错参数或误读返回值,因此每层都要验证。
- 误区:工具越多 Agent 越强。 大量相似工具会增加选择混淆和提示成本,应按任务动态暴露最小工具集合。
- 追问:工具结果和用户输入冲突时应该相信谁? 先依据数据权威级别和时间戳判断;订单状态等事实以受控系统为准,并向用户说明冲突。
- 追问:如何防止 prompt injection 诱导危险工具调用? 不向模型暴露秘密,执行端做白名单、参数校验与用户授权,高风险动作要求确认或人工审批。
- 追问:什么时候应该让模型澄清而不是调用工具? 必填参数缺失、用户意图有多种高代价解释,或操作不可逆时,应先提问确认。
八、加强记忆
把工具调用记成“模型写工单,程序办工单”。模型负责判断和填表,执行层负责权限、真实世界动作和结果回传。
把工具调用记成“模型提议—程序验证—受控执行—结果回传—模型解释”。真正的安全边界在程序和权限系统,不在模型是否看起来听话。