游乐游手机版
首页/AI热点日报/热点详情

揭秘大模型Function calling原理 四大优化方案提升Agent性能

类型:热点整理2026-07-06
Functioncalling使大模型通过外部工具完成任务,其执行流程包括函数说明、意图识别和调用响应。底层机制依赖特殊标记符和指令微调训练。优化方案包括使用Agents-SDK、MCP技术实现自动化,或通过微调提升特定工具调用准确率。

随着智能体技术的全面爆发,你一定频繁听到一个热门概念——Function calling。但凡涉及智能体开发,几乎都绕不开让大模型通过Function calling来调用外部工具。模型Agent能力的评估标准,很大程度上就取决于它的Function calling准确率。近期备受关注的MCP技术,本质上也可以视为Function calling的另一种实现形态。那么,这个无处不在的Function calling到底是什么?它的执行流程和底层运行机制是怎样的?大模型如何判断该调用哪个工具?为什么有的模型天生具备这种能力,而有的却没有?Function calling又和普通的API调用有何不同?本文将从零开始,带你彻底弄懂它。

需要提醒的是,这篇文章相当硬核——不仅会讲清大模型调用外部工具的基本流程,还会深入模型训练层面,剖析Function calling的底层运行机制,并给出提升模型Agent能力的优化策略。

Function calling,也叫外部函数调用或工具调用,其核心用途是让大模型通过调用外部工具来完成特定任务。这项技术由OpenAI于2023年6月13日正式提出。而大模型能调用外部工具,正是它从聊天机器人进化为智能体的最关键一步。

既然外部工具通常以API形式存在,要理解Function calling,就得先明白什么是外部工具API。以查天气为例,OpenWeather是一个常用的免费工具,它提供了可供代码调用的接口——也就是外部工具API。通过它,任何应用都能通过执行一段代码获取天气服务。比如,在Python中写一段代码就能查到北京当天的天气。

除了天气查询,还有成千上万功能各异的API,它们构成了整个应用开发生态的基础。接下来的问题是:如何把这个查询天气的能力赋予大模型?我们希望实现这样一个流程:用户问天气时,大模型自动调用外部工具API查询并回复。这个看似简单的过程,实际上已经触及了当前AI技术的天花板。

第一个难点在于,调用外部工具的动作必须由用户意图触发,而非预先设定的规则。举个例子,下面三个问题看起来差不多,都提到了“北京”,但意图天差地别:

  • 今天北京好冷,我想待在家里,帮我推荐几部好看的电影?
  • 今天北京好冷,我想出门,要穿多点么?
  • 今天北京好冷,我想去杭州旅游,会不会更暖和些?

第一个问题不需要查天气;第二个需要查北京天气;第三个则要同时查北京和杭州两地的天气。而现代智能体开发动辄涉及十几个甚至几十个外部工具,要同时识别多意图并匹配多个工具,绝非易事。

更关键的是,即便大模型选对了工具,它作为语言模型也只能输出字符串,最多给出查询需求,不能亲自编写并运行代码——它本身不具备直接调用API的能力。为了解决这两大难题,OpenAI采用了一套特殊的模型训练流程,让大模型学会识别外部工具,并开创性地提出了Function calling技术,通过创建一个外部函数作为中介,传递大模型的调用请求并完成API调用。

Function calling的执行流程

下面要介绍的Function calling流程是经典中的经典。无论是Agent开发框架还是MCP技术,本质上都是对它的效率优化。搞懂这个流程,就能一通百通。

首先,核心是创建一个外部函数来连接大模型和工具API。这个函数至少包含两部分:函数说明(告诉模型它的输入和输出)和具体的调用代码。比如,一个查询天气的外部函数,要求输入地名,调用OpenWeather API,返回天气结果。

接下来,只需三步就能让大模型获取天气信息:

第一步,把用户输入和外部函数说明一起送入对话。用户输入是“帮我查查北京天气”,函数说明则是一个JSON Schema格式的对象——相当于外部函数的名片。如果使用Agent框架或MCP工具,这个“名片”会自动生成,所以写好原始函数说明文档至关重要。

第二步,模型进行意图识别。如果问题与函数无关,直接回复即可;如果相关,比如问北京天气,模型会向外部函数发送一条“函数调用消息”(function call message),包含要调用的函数名称和所需参数。

第三步,外部函数接收到消息后,自动带入参数并运行,比如将“Beijing”传入get_weather函数,得到天气结果,再封装为函数响应消息(function response message)加入原始消息列表,最终由模型做出回复。

以上就是一次完整的Function calling运行流程。需要说明的是,这个过程完全依赖模型的原生能力。如果使用Agent开发框架(比如OpenAI开源的Agents-SDK),中间环节可以100%自动化,一行代码就能完成全部流程。而如果觉得编写外部函数太麻烦,MCP技术则能让你无缝接入海量现成的外部工具生态,配合Agents-SDK,只需设置一个参数就能调用各种工具。智能体开发由此变得像搭积木一样简单。

不过,无论用哪种框架或工具,大模型原生的Function calling能力始终是核心。那么,它究竟从何而来?我们又该如何优化它?

底层机制:特殊标记符与指令微调

回到之前的流程,你会发现当问题关联到外部工具时,模型会生成一条function call message——它不是普通的文本,而是高度结构化的JSON格式消息,包含了函数名称和参数。这种响应模式与普通问答截然不同,模型是如何切换的?

答案很简单:当前的大模型在训练时加入了大量特殊标记字符。这些字符没有明确的文本含义,但通过结构化分割,让模型学会不同任务模式下的响应方法。比如DeepSeek-V3-0324,我们以为它的响应过程是单纯的文本输出,实际上底层是这样的:

那些隐藏的标记符,比如``、``、`<|im_start|>`等,用于引导模型行为。它们和文本一起参与训练,模型很清楚它们的含义。对于DeepSeek R1来说,`think`标记也是一种特殊标记,只不过被允许打印出来,让用户区分思考和回复。

理解了这一点,Function calling的功能就好懂了:它本质上是用特殊标记符规范的一种响应模式。当配置外部函数时,模型接收到的完整文本里,会有一段系统提示词描述函数名称、输入输出和说明,引导它在适当时机调用工具。当需要调用时,模型的响应文本是这样的:

大量特殊标记符规范了输出格式,模型只能输出函数名和参数。如果问题与函数无关,比如用户说“你好,好久不见”,模型就按普通文本方式回应。

那么,模型如何同时拥有两种截然不同的响应模式?答案在于指令微调(Instruction Tuning)。大模型训练分为预训练和指令微调两个阶段:预训练用海量文本训练基础语言能力,指令微调则用大量带标签的数据教会模型如何回答各种问题。典型的指令微调数据包含“instruction”、“input”和“output”字段,展示在普通提示词下的问答示例。

有些模型在训练时,还会在系统提示词中加入虚拟的外部工具信息,并在output中加入function call message的创建数据;同时加入一些有外部函数但只做普通响应的数据。通过长期训练,模型同时掌握了对话和调用工具的能力,并且具备举一反三的能力,遇到新工具也能调用。

现在你应该明白,为什么有些模型有Function calling而有些没有——根源在于训练方法不同。真正训练出Function calling能力并不简单,比如DeepSeek R1为了优先保障推理能力,就放弃了这方面的训练。当然,如果模型本身没有这种能力,也可以通过强提示词模板强制输出类似的消息,比如MCP在某些客户端调用时就是这样做的,但准确率往往不足,难以达到工业级水准。像前面提到的多意图天气查询场景,就很难实现。

截至目前,全球原生Function calling能力达到工业级水平的,只有GPT、Gemini、Claude和DeepSeek-V3-0324四款模型。它们不仅准确率极高,还支持多工具并联和串联调用,甚至在工具调用出错时能自动debug,是当代智能体开发的不二之选。

作为最强开源对话模型,DeepSeek-V3-0324还在Hugging Face上开源了网络搜索和文档检索工具训练时使用的系统提示词模板。如果你希望它调用这类工具,用训练时的模板效果会更好。

文档检索提示词模板:

file_template = 
"""[file name]: {file_name}
[file content begin]
{file_content}
[file content end]
{question}"""

网络搜索提示词模板:

search_answer_zh_template = 
'''# 以下内容是基于用户发送的消息的搜索结果:
{search_results}
在我给你的搜索结果中,每个结果都是[webpage X begin]...[webpage X end]格式的,X代表每篇文章的数字索引。请在适当的情况下在句子末尾引用上下文。请按照引用编号[citation:X]的格式在答案中对应部分引用上下文。如果一句话源自多个上下文,请列出所有相关的引用编号,例如[citation:3][citation:5],切记不要将引用集中在最后返回引用编号,而是在答案对应部分列出。
在回答时,请注意以下几点:
- 今天是{cur_date}。
- 并非搜索结果的所有内容都与用户的问题密切相关,你需要结合问题,对搜索结果进行甄别、筛选。
- 对于列举类的问题(如列举所有航班信息),尽量将答案控制在10个要点以内,并告诉用户可以查看搜索来源、获得完整信息。优先提供信息完整、最相关的列举项;如非必要,不要主动告诉用户搜索结果未提供的内容。
- 对于创作类的问题(如写论文),请务必在正文的段落中引用对应的参考编号,例如[citation:3][citation:5],不能只在文章末尾引用。你需要解读并概括用户的题目要求,选择合适的格式,充分利用搜索结果并抽取重要信息,生成符合用户要求、极具思想深度、富有创造力与专业性的答案。你的创作篇幅需要尽可能延长,对于每一个要点的论述要推测用户的意图,给出尽可能多角度的回答要点,且务必信息量大、论述详尽。
- 如果回答很长,请尽量结构化、分段落总结。如果需要分点作答,尽量控制在5个点以内,并合并相关的内容。
- 对于客观类的问答,如果问题的答案非常简短,可以适当补充一到两句相关信息,以丰富内容。
- 你需要根据用户要求和回答内容选择合适、美观的回答格式,确保可读性强。
- 你的回答应该综合多个相关网页来回答,不能重复引用一个网页。
- 除非用户要求,否则你回答的语言需要和用户提问的语言保持一致。

# 用户消息为:
{question}'''

模型地址:https://huggingface.co/deepseek-ai/DeepSeek-V3-0324

另外,如果你的应用场景比较特殊,希望使用小尺寸模型并提升特定工具的调用准确率,也可以通过微调来实现。目前llama-factory或Qwen-Agent等工具都支持Function calling微调,带入特定领域的数据集后,某些工具的调用准确率能大幅提升。

来源:https://www.53ai.com/news/LargeLanguageModel/2025041412746.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。