Tool Calling 决策机制与执行流程
Function Calling 的输入输出格式、决策机制与执行流程详解
原题:请说明大模型实现工具调用(Tool Use / Function Calling)的常见架构与实现方式,包括输入输出格式设计、调用决策机制及执行流程。
Agent · 百度真题
回答与解析
核心架构:两种实现路径
1. 原生支持(Native)
- OpenAI/Claude等模型内置,训练阶段注入工具使用能力
- 通过
tools参数传入工具描述,模型学习生成特定格式的调用请求
2. 提示工程(Prompt-based)
- 通用模型通过精心设计的System Prompt模拟
- 关键:在Prompt中明确定义工具描述、输出格式、执行流程
输入输出格式设计
工具描述(Tool Schema)
{
"name": "weather_query",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"},
"date": {"type": "string", "description": "日期,格式YYYY-MM-DD"}
},
"required": ["city"]
}
}
模型输出格式
- 需调用时:
{"tool": "weather_query", "arguments": {"city": "北京"}} - 无需调用:直接返回最终答案
调用决策机制
| 机制 | 说明 |
|---|---|
| 隐式决策 | 模型自主判断,通过训练内化"何时调用" |
| 显式决策 | 输出中包含action字段,如"action": "call_tool" |
关键约束:结构化输出(JSON Mode/Constrained Decoding),确保参数可解析
执行流程(ReAct简化版)
用户输入 → 模型决策 → [需工具?] → 生成调用参数 → 执行工具
↓
返回观察结果 → 拼接上下文 → 模型再决策 → 最终输出
循环终止条件:模型输出不含工具调用标记,或达到最大迭代次数
工程要点
- 工具描述质量:直接影响调用准确率,需清晰说明功能边界和参数含义
- 错误处理:工具执行失败时,将错误信息反馈给模型,支持自我修正
- 并行调用:支持一次生成多个独立工具调用,提升效率
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 本质是模型与外界的交互能力
- 两种实现路径及其适用边界
- 输入输出格式与决策机制
- 执行流程与落地风险
- 工程师的取舍与延伸点
这道题问的是工具调用,其实本质就是问大模型怎么跟外界交互。模型本身是静态的,它不知道实时天气、不会查数据库、不能操作API,所以需要一种机制让模型能说“我需要用某个工具”,然后我们把结果喂回去让它继续推理。
实现路径主要有两种。一种是原生支持,像OpenAI、Claude这些模型在训练时就注入了工具调用能力,你只需要按格式传tools参数,它就会输出结构化的调用请求。另一种是提示工程,对通用模型在System Prompt里把工具描述、输出格式、流程都写清楚,让模型通过In-Context Learning模拟出来。两者的边界很清晰:原生支持准确率高、输出稳定,适合对可靠性要求高的场景,比如金融交易、自动化客服;提示工程灵活、不依赖特定模型,适合快速原型或模型不固定的情况。但真正落地时,我通常两种一起用,用原生支持的输出格式,但同时在System Prompt里写清楚边界条件和错误处理,相当于双保险。
具体说一下输入输出格式。工具描述一般用JSON Schema,包括名称、描述、参数类型和必填项,比如天气查询工具就需要城市名称和可选日期。模型输出分两种情况:要调用工具时,输出一个包含工具名和参数的结构化对象;不需要就直接返回答案。这个格式设计的关键是结构化输出,必须用Function Calling或JSON Mode约束解码,否则参数格式乱掉后续没法解析。
调用决策机制有两种。隐式决策是模型自己判断,通过训练内化了“什么时候该调工具”;显式决策是在输出里加一个action字段,比如"action": "call tool"。我倾向于显式决策,因为可解释性强,调试时能清楚看到模型每一步的意图。
执行流程可以看成简化版的ReAct:用户输入后模型先决策,如果需要工具就生成调用参数,执行工具后把观察结果拼回上下文,模型再决策,直到不需要调用工具或达到最大迭代次数。举个例子,一个企业客服系统处理退款请求:用户说“我订单号12345,要退款”,模型先调用订单查询工具获取订单状态,发现已发货,再调用退款规则工具判断是否可退,最后生成最终答案。这个循环里有个常见失败场景:工具执行失败或返回空结果,模型可能陷入死循环或胡乱猜测。所以上线前我会特别关注错误处理,把工具返回的错误信息原样喂给模型,让它尝试修正参数重试,同时设置最大迭代次数防止无限循环。
还有一个有意思的点是并行调用,模型可以一次生成多个独立的工具调用,比如同时查天气和航班。这能提升效率,但前提是这些调用之间没有依赖关系,否则需要顺序执行。
所以我会把工具调用看成模型能力的延伸,而不是模型本身的功能。前提是工具描述要足够清晰,参数边界要严格,否则模型会乱调。如果工具描述模糊,比如只说“查询用户信息”但不说明需要什么权限,模型可能生成不合法的参数。更倾向的做法是:先做小范围压测,统计调用准确率和失败重试次数,再逐步开放。
关键一句:并行调用可以提升效率,但前提是调用之间没有依赖关系,否则需要顺序执行。
面试官还可能这样问
- 问法 1 · 场景切入
假设你正在做一个智能客服,用户说'帮我查下订单',然后模型要调用订单查询API。你怎么让模型知道它能用哪些工具、什么时候该调用、以及怎么输出调用参数?
- 问法 2 · 层层追问
大模型是怎么跟外部工具配合的?……那它怎么决定要不要调用?……如果调用了,返回的结果怎么再喂给模型?整体的执行流程你画一下?
- 问法 3 · 直球架构
请你讲讲大模型工具调用的常见架构,包括输入输出格式怎么设计、调用决策是隐式还是显式的,以及整个执行流程是怎样的。