跳到正文

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. 问法 1 · 场景切入

    假设你在做一个电商客服agent,用户问“帮我查一下上周的订单”,然后又说“退款吧”。这时候你需要让模型调用查订单和退款两个工具,通常你会怎么设计这个流程?

  2. 问法 2 · 层层追问

    模型怎么知道该调用哪个工具?……如果模型输出格式不对,比如参数写错了,你怎么办?……那如果模型连续调用失败,你会考虑换一种实现方式吗?比如微调一个专用模型?

  3. 问法 3 · 直球架构

    请列举当前大模型实现工具调用的主流方法,包括实现机制、适用场景和优缺点,比如原生Function Calling、ReAct Prompt、微调方案等,你倾向于哪种?

同模块相关题目