Tool Use 实现方法有哪些?
Function Calling 机制、适用场景及优缺点详解
原题:请列举并解释当前大模型实现工具调用(Tool Use/Function Calling)的主要方法,包括其实现机制、适用场景及优缺点。
Agent · 百度真题
回答与解析
主流实现方法对比
1. 原生Function Calling(OpenAI/Claude/文心等)
机制:模型在预训练/SFT阶段专门学习识别工具场景,输出结构化JSON
- 推理时传入
tools参数,模型自主决定何时调用 - 输出格式固定:
{"name": "tool_name", "arguments": {...}}
适用:生产环境首选,可靠性高 优缺点:✓ 准确率高、多轮友好;✗ 闭源依赖、黑盒决策
2. Prompt工程方案(ReAct模式)
机制:通过Few-shot Prompt引导模型按"Thought→Action→Observation"格式输出
Thought: 我需要查询天气
Action: get_weather({"city": "北京"})
Observation: ...
适用:开源模型无原生能力时快速验证 优缺点:✓ 零成本、通用性强;✗ 格式不稳定、需正则解析、多轮易出错
3. 微调专用方案(ToolLLM/Gorilla)
机制:用大量<指令,工具描述,参数>三元组数据微调,学习工具选择+参数填充
适用:垂直领域需大量工具、或需完全私有化部署 优缺点:✓ 可定制工具集、脱离Prompt长度限制;✗ 数据构造成本高、泛化性依赖训练质量
4. 混合路由方案(实际生产常用)
用户Query → 意图分类模型 → 决策分支
↓
┌──────────┼──────────┐
直接回答 工具调用 需要澄清
↓ ↓ ↓
通用模型 Function模型 追问生成
关键工程点:
- 参数校验:JSON Schema校验 + 类型转换兜底
- 错误重试:调用失败时把错误信息回传模型,让其自我修正
- 并发控制:多个独立工具可并行,有依赖需拓扑排序
选型建议
| 场景 | 推荐方案 |
|---|---|
| 快速验证/MVP | ReAct Prompt |
| 生产级Agent | 原生Function Calling |
| 100+工具/垂直领域 | 微调专用模型 |
| 高可用要求 | 原生+校验层+降级策略 |
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 本质是模型决策与外部系统的接口
- 原生Function Calling是主流,但依赖平台
- Prompt工程方案适合快速验证,但稳定性差
- 微调方案适合垂直领域,但成本高
- 混合路由是生产落地常态
这道题其实是在问,怎么让大模型不光能聊天,还能实际操作外部系统,比如查数据库、调API。我拆开说一下几种主流做法,以及我实际落地时怎么选。
先说最成熟的,原生Function Calling。像OpenAI、Claude这些平台直接内置了,模型在训练阶段就学过输出结构化JSON,推理时你传个tools参数,它能自主决定什么时候调用,返回格式固定。这个方案的优点是准确率高,多轮对话里也能记住上下文。但前提是你得依赖平台,模型决策是个黑盒,你不知道它为什么选这个工具。所以它适合生产环境,特别是对可靠性要求高的场景,比如客服系统里查订单状态。
再一个是用ReAct模式的Prompt工程。说白了就是给模型写Few-shot样例,让它按Thought、Action、Observation的格式输出。比如用户问天气,模型先想一下,再调get weather函数。这个方案零成本,开源模型也能用,适合快速验证MVP。但坑也很明显,格式不稳定,模型可能多输出几句废话,你得用正则硬解析。多轮对话里更容易出错,上下文一长,格式就崩。所以它只适合原型阶段,上线我不太放心。
第三种是微调专用模型,像ToolLLM、Gorilla那套思路。用大量指令、工具描述、参数三元组数据做SFT,让模型学会选工具和填参数。这适合垂直领域,比如金融风控里要调几十个内部API,或者需要完全私有化部署。优点是工具集可定制,不受Prompt长度限制。但前提是你要有高质量的训练数据,构建成本很高,而且泛化性依赖训练质量,换一个领域可能就不行了。
实际生产里,我倾向于混合路由。用户query进来,先过一个意图分类模型,决定是直接回答、调用工具还是追问澄清。调用工具时,我会加一层参数校验,比如JSON Schema校验加类型转换兜底。如果调用失败,把错误信息回传模型,让它自我修正。多个独立工具可以并发,有依赖的按拓扑排序。这样既保证可靠性,又灵活。
不过有个细节值得注意,工具调用失败后让模型自我修正,这个重试机制其实依赖模型的In-Context Learning能力,如果模型本身不强,重试几轮可能还是错的,这时候就需要引入兜底策略,比如转人工或者预设回复。
所以我会把原生Function Calling作为首选,但一定配上校验层和降级策略。Prompt方案只用来快速试错,微调只在工具集稳定且规模大时考虑。整体上,我更看重可靠性和可观测性,而不是一味追求模型自主决策。
关键一句:工具调用失败后模型自我修正的机制依赖In-Context Learning能力,如果模型不强需要兜底策略。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商客服agent,用户问“帮我查一下上周的订单”,然后又说“退款吧”。这时候你需要让模型调用查订单和退款两个工具,通常你会怎么设计这个流程?
- 问法 2 · 层层追问
模型怎么知道该调用哪个工具?……如果模型输出格式不对,比如参数写错了,你怎么办?……那如果模型连续调用失败,你会考虑换一种实现方式吗?比如微调一个专用模型?
- 问法 3 · 直球架构
请列举当前大模型实现工具调用的主流方法,包括实现机制、适用场景和优缺点,比如原生Function Calling、ReAct Prompt、微调方案等,你倾向于哪种?