本文首发于同名公众号,欢迎收藏转发点赞。

你有没有遇到过这种情况:问AI一个实时问题,比如"今天大盘涨了多少",它要么说不知道,要么给出一个可能是编出来的数字。
这就是大模型的死穴:它没有连接现实世界的能力。

大模型的知识是训练时学到的,有截止日期。它能告诉你历史,但不能告诉你"现在"发生了什么。它能给你一个看似专业的分析,但那可能只是它根据训练数据"推断"出来的,不一定是真的。
比如你问ChatGPT:“特斯拉最近股价怎么样?”
它可能回答:“特斯拉股价近期表现强劲,受益于电动车市场需求增长…”
听起来像那么回事。但问题是:这个回答是什么时候生成的?是今天的?还是上周的?还是几个月前的?用户无从判断。
Function Calling就是为了解决这个问题。
让大模型能"召唤"外部能力——搜索、执行、发消息、做计算。


先说个感受

我第一次用上Function Calling的时候,有种"原来AI可以这样"的感觉。

之前用大模型,感觉就像在跟一个"百科全书"聊天。知识渊博,但永远活在书里,走不出来。你问它任何问题,它都能给你一段回答,但那回答本质上是"回忆",不是"查询"。

就像你问一个记忆力超群的人:"现在几点了?"他翻开一本《时间简史》,给你讲了一堆时间理论,但就是不告诉你现在几点。

加上Function Calling之后,大模型突然"长出了手脚"。

它不再只是回答问题,而是能真的帮你做事:

查实时数据——想知道今天的天气、现在的股价、刚发布的新闻,问它,它帮你查。不是靠"回忆",而是真真切切地去查。

发邮件——让它写完邮件直接发出去,不需要你复制粘贴到邮箱App。写完直接发,任务完成。

执行代码——让它跑一段Python分析数据,画个图,结果直接给你看。分析报告直接生成,不需要你手动跑代码。

操作数据库——让它查订单、查库存、查用户信息,读写都行。企业的业务系统,Agent可以直接对接。

预约会议室——让它查哪个会议室有空,直接帮你预约成功。不用再打开会议室系统一个个看。

这种感觉,就像从"纸上的虚拟人"变成了"能动的机器人"。


Function Calling是什么

Function Calling,中文叫"函数调用"或"工具调用"。

它的核心逻辑并不复杂,分三步:

第一步:开发者定义一套"工具"

每个工具有三个部分:名称、描述、参数说明。

比如一个天气查询工具:
工具名称:get_weather
工具描述:获取指定城市的天气预报
所需参数:城市名称、日期

就像给Agent一本"工具手册",告诉它有哪些武器可以用。

第二步:大模型学会"召唤"这些工具

大模型不只是输出文字。当用户的问题需要某个工具时,它会输出一个结构化的"调用指令",告诉系统要调用哪个工具、传什么参数。

这个过程是模型自己判断的。它分析用户的问题,觉得需要查天气,就输出一个调用天气API的指令。

第三步:系统执行工具,返回结果

外部系统收到指令,执行对应的操作,把结果返回给大模型。

天气API被调用了,返回真实的天气数据:气温、湿度、风力、空气质量。

大模型拿到真实数据后,再生成最终的回答。

这三步形成了一个闭环:用户提问 → Agent判断是否需要工具 → 调用工具获取真实数据 → 基于真实数据回答。

整个过程对用户是透明的。用户只是问了一个问题,但背后可能已经调用了好几个工具,拿到了真实数据。


一个具体例子

场景:问Agent"今天北京适合穿什么?"

没有Function Calling时:

Agent可能回答:“今天北京气温15-25度,建议穿薄外套或长袖T恤。”

听起来不错。但这个温度是真的吗?可能是上周的数据,可能是模型根据历史平均值"猜"出来的,也可能完全是瞎编的。

你无从验证。你只能选择相信或不相信,但没有办法确认。

有Function Calling时,完全不同。

第一步,开发者定义工具。工具名叫get_weather,描述是"获取指定城市的天气预报",参数是城市名称和日期。

第二步,Agent分析需求。用户问"今天北京适合穿什么",Agent立刻判断:这个问题需要实时天气数据。我应该先调用get_weather获取北京今天的天气。

第三步,Agent输出调用指令。它并没有直接回答问题,而是"召唤"了一个工具。输出内容是:调用get_weather,城市=北京,日期=今天。

第四步,系统执行工具。调用天气API,返回真实数据:气温15-25度,晴,微风,湿度40%,空气质量优。

第五步,Agent基于真实数据回答。“今天北京天气晴朗,气温15-25度,微风,湿度适中,空气质量优。建议穿薄外套或长袖,早晚温差较大可以带件外套。这样的天气很适合户外活动。”

看到区别了吗?数据是真实的,不是"想"出来的。

用户得到的是一个基于真实数据的回答,而不是一个可能正确的猜测。

而且这个回答里包含了具体的天气细节——湿度40%、空气质量优——这些信息不是大模型能"编"出来的,必须是真实查询结果。


为什么Function Calling重要

1. 解决"知识过时"问题

大模型的知识有截止日期。这不是bug,是原理——模型的知识来源于训练数据,而训练数据永远是"过去的"。

ChatGPT-4的知识截止到2023年12月。它不知道2024年发生了什么,更不知道现在正在发生什么。你问它今天的事,它只能根据历史数据猜测。

有了实时数据调用,Agent可以回答"现在"的问题。

今天的股价、昨天的新闻、现在的天气、下周的天气预报、最近发布的手机配置…这些它都能查到。

对用户来说,能够获取实时信息是非常重要的需求。谁不关心"现在"发生的事呢?

2. 解决"幻觉"问题

大模型有时候会瞎编。这个现象有个专门的名字叫"hallucination"——幻觉。

大模型的工作原理是:根据训练数据,生成最"可能"正确的文字。但这文字可能根本不是事实。

比如大模型回答:“特斯拉2023年Q4营收同比增长35%。”

这个回答看起来很专业,很有数据感。但它是真的吗?

实际上,大模型可能只是根据"特斯拉"、“Q4”、"增长"这些词的概率组合,生成了一个看起来合理的句子。它没有查过特斯拉的财报,也没有验证过这个数字。

有了API调用,返回的是真实数据,不是模型"想"出来的。

你看到的每一个数字、每一个日期、每一个事实,都是从真实系统中查出来的。用户可以验证,可以追溯。

这对企业应用尤其重要。谁敢让一个会"瞎编"的AI去处理财务数据、医疗数据、法律文件?

3. 解锁"行动"能力

搜索、发邮件、执行代码、操作数据库……这些操作,Function Calling之前大模型完全做不到。

大模型本质上是个"文本生成器"。你让它"帮我查一下会议室还有没有空位",它只能回答"抱歉,我无法直接查询会议室系统"。

你让它"帮我发一封邮件给领导",它只能写一封邮件草稿,然后说"以下是邮件内容,请手动发送"。

你让它"帮我分析一下这份销售数据",它只能给你一段文字描述,没有办法真的读取和分析文件。

但有了Function Calling,它可以真的去查、去发、去分析、去操作。

帮你查会议室,直接告诉你哪个会议室有空。

帮你发邮件,写完直接发出去,你手机上收到邮件通知。

帮你分析数据,读取文件,跑代码,生成图表,结论直接给你。

这种"能做事"的能力,是Function Calling带来的最大改变。

4. 实现"多步骤推理"

复杂任务不是一句话能解决的,需要拆解成多个步骤。

比如用户说"帮我分析一下苹果股票最近一个月的走势,看看要不要买"。

这个任务包含多个子步骤:
第一步,查询苹果股票历史价格
第二步,查询近期相关新闻
第三步,分析数据趋势
第四步,生成对比图表
第五步,给出结论和建议

没有Function Calling,大模型只能空对空地"分析"。它可能会说:"根据历史数据,苹果股票通常表现良好…"这种泛泛而谈的结论毫无价值。

有了Function Calling,每个步骤都能拿到真实数据:
查询股价:获取最近一个月的每日收盘价
查询新闻:获取近期关于苹果的重要新闻
分析数据:跑Python代码计算涨跌幅、波动率
生成图表:用代码画出K线图
给出建议:基于数据给出分析结论

结论不再是猜测,而是基于真实数据的专业分析。


常见的工具类型

1. 搜索工具

接入搜索引擎或新闻API,获取实时信息。

这是最基础的工具。当用户问实时新闻、股价、天气、比赛结果等问题时,大模型需要搜索工具来获取最新数据。

比如用户问:
比如用户问:“今天有什么科技新闻?”
再比如问:“特斯拉股价现在多少?”
或者问:“这周末北京天气怎么样?”

这些都需要搜索工具。没有搜索工具,大模型对这些问题的回答永远是过时的,或者干脆说"我不知道"。

2. 知识库查询

接入企业内部的RAG系统,查文档、查知识。

当用户问公司政策、产品规格、历史项目等问题时,大模型不知道企业内部的信息。但通过知识库工具,它可以检索内部文档,找到准确答案。

比如员工问:
比如员工问:“我的年假还剩几天?”
再比如问:“公司报销流程是什么?”
或者问:“这个产品的技术规格是什么?”

大模型通过HR系统、文档库、产品数据库等工具查询,返回真实信息。员工不需要翻找各种文档,AI助手直接帮你查好。

3. 代码执行

执行Python代码进行计算、生成图表。

当用户需要数据分析、复杂计算、图表生成时,代码执行工具让Agent真的跑代码。

比如用户说:
比如用户说:“帮我分析一下这份销售数据,找出销售额最高的产品类别”
再比如:“计算一下这个投资组合的收益率”
或者:“生成一份收入趋势图”

Agent调用Python执行工具,读取数据文件,运行分析代码,生成结果和可视化图表。用户拿到的是完整的分析报告,不是一段文字描述。

4. 文件操作

读写文件、生成报告。

当需要生成报告、保存文档时,文件操作工具让Agent可以写入本地文件或云端存储。

比如:
比如分析完数据后,直接生成一份Word报告保存到指定位置
用户打开文件就能看到完整的分析结果
报告里的数据、图表都是基于最新查询的真实数据

Agent不只是给建议,而是真的产出可交付的成果。

5. 通信工具

发邮件、发消息、发送通知。

当用户要求发送报告、通知时,通信工具让Agent真的能"做事"。

比如:
比如Agent帮用户完成周报后,可以直接发送邮件给领导
用户不需要手动复制粘贴到邮箱App
还可以自动发送给多个收件人,附带附件

或者:
或者当某个监控指标异常时,自动发送告警通知
用户不用一直盯着系统,AI帮你监控,有问题第一时间通知

6. 数据库操作

查询订单、查询库存、查询用户信息、写入交易记录。

企业级应用场景中,数据库是最核心的数据源。Agent通过数据库工具,可以直接读写业务系统。

比如:
比如客服问"查一下这个用户的最近订单",Agent直接查数据库
再比如销售问"这个产品还有多少库存",Agent实时查询
再比如财务查"这周的交易流水",Agent拉取完整数据

这种能力让AI真正融入了企业工作流程,不再只是"聊天",而是"做事"。


工具描述决定了Agent会不会用它

Function Calling效果的好坏,很大程度上取决于工具描述的质量

这是很多人容易忽略的细节。

很多人设计工具描述时太敷衍。

反面例子

工具名是search,描述就写一个字"搜索"。

就这两个字段,Agent根本不知道什么时候该用这个工具。

用户问"北京天气怎么样",Agent会想:这个"搜索"是什么意思?搜什么?搜哪里?用中文还是英文搜?算了,我还是自己回答吧。

用户问"帮我查一下航班",Agent又会想:用户是想查天气还是想查航班?"搜索"这个工具能查航班吗?不确定。还是靠自己编一个航班信息吧。

好的描述应该这样写

工具名是search_flights,描述是"搜索航班信息,当用户想查机票、航班时刻、机票价格时使用"。例如用户问"北京到上海今天有哪些航班"、“下周机票多少钱”、"帮我查个航班"时调用此工具。

参数说明:
出发城市:出发城市,中文,如"北京"
目的城市:目的城市,中文,如"上海"
出发日期:出发日期,格式YYYY-MM-DD

Agent一看就明白:这个工具是查机票的,用户问机票问题时我就用它。参数怎么填、什么时候用,一清二楚。

工具描述越具体,Agent调用得越准。

好的描述应该回答三个问题:
第一步,这个工具是干什么的? —— 描述清楚工具的功能
第二步,什么时候用? —— 说明使用场景,什么时候应该调用
第三步,参数是什么意思? —— 每个参数的要求和格式


多工具协作

复杂的任务,往往需要调用多个工具。

以"分析特斯拉股票并发送报告"为例,这个任务包含多个子步骤:

第一步,调用股票API获取特斯拉股价走势数据

获取最近一个月特斯拉的每日收盘价、最高价、最低价、成交量等数据。

第二步,调用新闻搜索获取特斯拉最新动态

搜索最近一周关于特斯拉的新闻,看看有没有重大事件影响股价。

这两步可以并行进行——查股价和查新闻没有依赖关系,同时调用效率更高。Agent会智能地判断哪些任务可以并行执行。

第三步,调用数据分析生成对比图表

这需要等股价数据返回后才能执行。Agent用Python跑分析代码,计算涨跌幅、波动率,和大盘对比,生成可视化图表。

第四步,生成报告文档

把分析结果整理成一份报告,包含数据摘要、图表、结论建议。需要等分析结果出来后才能执行。

第五步,发送邮件

把报告发送给用户指定的邮箱。需要等报告生成后才能执行。

Agent需要判断:
调用顺序是什么?(先查数据,再分析,再生成报告)
哪些可以并行?(查数据和查新闻同时进行)
哪些必须等前一步完成?(先生成报告,才能发送)
出错了怎么办?(重新调用还是跳过?还是告诉用户?)

这就是Agent规划能力的体现:知道什么先做,什么后做,什么可以同时做,什么必须等结果。

如果某个步骤失败了怎么办?

Agent需要决定:
是重试一次?(网络波动可以重试)
是跳过这个步骤继续?(某个数据查不到,用其他方式弥补)
是换方案?(API超时,换一个数据源)
还是告诉用户任务失败了?(无法恢复的错误,需要用户介入)

这些都是Function Calling在实际应用中必须考虑的问题。


Function Calling vs Tool Use

很多人把这两个概念混用,但严格来说有区别。

Function Calling是更狭义的概念,指大模型输出结构化的函数调用指令,通常配合特定的API接口使用。

这种方式的好处是:调用格式是标准化的,大模型知道怎么输出参数,系统知道怎么解析。

代表实现是OpenAI的function calling接口。它定义了标准的工具格式,大模型按照这个格式输出调用指令,开发者按标准解析。

{
  "name": "get_weather",
  "arguments": {
    "city": "北京",
    "date": "2026-04-25"
  }
}

这种格式清晰、标准化、容易调试。

Tool Use是更广义的概念,指Agent使用各种工具的能力,包括Function Calling、插件、API、代码执行等。

可以理解为:Tool Use是目标,Function Calling是实现方式之一

打个比方:
如果打个比方,“使用工具"就是"去餐厅吃饭”
而Function Calling就像是"用筷子吃饭"
Tool Use则是"用任何方式吃饭"——筷子、勺子、手,都行

两者不是非此即彼的关系。在实际开发中,Function Calling通常是最好的实现方式,因为它标准化、易调试、成功率高。

但Tool Use的范围更广,包含了Function Calling之外的其他工具使用方式。


底层原理

Function Calling是怎么实现的?

本质上是让大模型学会"在合适的时候输出结构化数据"

传统的大模型只输出文字。用户问问题,模型输出文字回答。

但Function Calling的模型被微调过,它学会了在必要时输出一种特殊格式的内容。

当用户的问题需要工具时,大模型会分析:

意图识别:用户想要什么?我需要什么数据?

工具选择:调用哪个工具?当前有哪些工具可用?

参数提取:传什么参数?参数值是什么?

然后它输出一个结构化的指令,包含工具名称和参数。

这个过程涉及几个关键能力:

意图识别:大模型要能判断用户的问题是否需要工具。

如果用户问"今天天气怎么样",明显需要查天气工具。

如果用户说"请帮我写一封请假邮件",明显需要发邮件工具。

如果用户只是闲聊"你好",就不需要任何工具。

参数提取:大模型要从用户的问题中提取出工具需要的参数。

用户说"帮我查一下下周三北京到上海的机票",大模型要能提取出:
出发城市是北京
目的城市是上海
出发日期是下周三(需要转换成具体日期)

结果整合:拿到工具返回的结果后,大模型要能把结果整合成自然语言回答给用户。

API返回的可能是一堆JSON,包含航班号、起飞时间、到达时间、票价等信息。

大模型要理解这些数据,用人话解释给用户:“下周三早上8点有一班东航MU5101,北京到上海,票价680元…”

这三个能力任何一个出问题,Function Calling的效果都会打折扣。

意图识别错了,该用工具时不用。参数提取错了,工具调用失败。结果整合错了,返回的数据用户看不懂。


OpenAI vs Anthropic vs Google

不同公司对Function Calling的实现方式略有不同,各有特点。

OpenAI是最早也是最成熟的实现。

GPT-4的function calling接口设计得很优雅:
定义工具用JSON Schema格式
调用结果清晰易解析
文档完善,社区活跃
开发者体验很好

这是目前最主流的选择,大多数Function Calling应用都是基于OpenAI接口开发的。

Anthropic的Claude走了不同的路线。

Claude不直接输出结构化调用,而是通过"Extended Thinking"模式间接实现类似功能。它先思考再执行,输出的是思考过程和行动指令。

这种方式更灵活,但调用流程不如OpenAI标准化。开发时需要自己处理更多的逻辑。

Google的Gemini把Function Calling集成到模型能力中。

它支持自然语言到API调用的转换,声称可以自动将用户的自然语言请求转换为API调用。

但工具生态还在建设中,目前的成熟度不如OpenAI。

选择哪个平台,主要看你的具体需求和已有的技术栈:

如果追求稳定和成熟,选OpenAI
如果需要更灵活的推理能力,可以试试Anthropic
如果已经在Google生态里,可以看看Gemini


常见问题与解决方案

在实际开发中,Function Calling会遇到各种问题。下面是几个常见问题和解决方案。

问题一:工具调用过于频繁

有些Agent会陷入"工具调用循环",对同一个问题反复调用工具,导致响应缓慢或资源浪费。

比如用户问"今天天气怎么样",Agent调用了天气API,返回了结果。但Agent可能又想"让我再确认一下",又调用了一次。反复调用十几次才给出回答。

解决方案:设置最大调用次数限制

比如一个任务最多调用10次工具,超过后强制返回当前结果。

或者设置"冷却时间":对于相同类型的问题,一段时间内只调用一次。

问题二:参数传递错误

大模型有时候会传错参数。

比如用户说"帮我查一下下周三的机票",Agent提取的参数是"date": “下周三”,但API需要的是"date": “2026-04-29”。

或者用户说"查一下苹果公司",Agent传的是"company": “苹果”,但API需要的是"company": “AAPL"或"Apple Inc.”。

解决方案:在工具描述中明确说明参数格式要求

描述中写:“日期格式必须是YYYY-MM-DD,例如’2026-04-25’”、“公司名称请使用标准缩写或全称”。

大模型看到这种明确的格式要求,会更准确地输出参数。

问题三:工具返回结果无法理解

有些API返回的数据结构复杂,大模型无法正确解析。

比如一个股票API返回的数据结构是嵌套的JSON,包含几十个字段,大模型可能看晕了,给出的回答驴唇不对马嘴。

解决方案:让工具返回结构化的JSON,同时提供清晰的字段说明

或者在中间加一层处理,把原始数据转成更容易理解的格式。

比如把"{“open”: 185.2, “high”: 187.5, “low”: 184.8, “close”: 186.9}“转成"开盘价185.2,最高187.5,最低184.8,收盘价186.9”。

问题四:不知道什么时候该用工具

大模型有时候会跳过工具,直接用自己的"知识"回答。

用户问"今天特斯拉股价多少",Agent觉得"我知道特斯拉股价大概在150-200美元之间",就自己编了一个数字,而不是去查API。

解决方案:优化工具描述和使用提示

在工具描述中强调:“当用户问实时数据时,必须调用此工具获取最新信息,不能使用模型内部知识回答。”

也可以在系统提示词中明确告诉大模型:对于需要实时数据的问题,必须调用相应工具获取真实数据。


开发者实践建议

如果你正在开发基于Function Calling的应用,这里有几个经过验证的实践建议。

建议一:从简单工具开始

不要一开始就设计十几二十个工具。

先从最简单的开始,比如:
比如一个搜索工具
再比如一个计算器

把这两种工具调试通,理解Function Calling的工作原理后,再逐步增加更多工具。

工具多了之后,Agent选择工具的难度会指数级增加。先小步快跑,再逐步扩展。

建议二:每个工具只做一件事

不要设计一个"万能工具"能做很多事。

比如不要设计一个工具既能查天气、又能搜新闻、又能查股价。

让每个工具职责单一:
get_weather:专门查天气
search_news:专门搜新闻
get_stock_price:专门查股价

这样Agent更容易判断什么时候该用什么工具。

建议三:测试各种边界情况

用户的问题是千奇百怪的。要测试:

比如模糊的问题:“今天天气怎样?”、“帮我查个东西”
再比如错误的数据格式:日期写成"下周三"而不是"2026-04-29"
或者工具返回空结果:查询的数据不存在
再或者网络超时:API调用失败
以及权限不足:没有访问某个系统的权限

Agent在这些边界情况下如何表现,决定了用户体验。要提前想到,提前处理。

建议四:设计好错误处理

工具调用可能失败——API超时、参数错误、权限不足。

Agent需要优雅地处理这些错误:

告诉用户发生了什么问题
提供可能的替代方案
让用户决定下一步怎么做

不要让Agent直接崩溃或返回一堆技术错误信息。用用户能理解的语言解释问题。

建议五:控制调用深度

避免Agent陷入无限循环。

可以设置最大调用深度,比如"最多连续调用5次工具",超过后强制结束并返回结果。

也可以设置"回退机制":尝试调用3次失败后,用大模型的内部知识来回答。


我的观点

Function Calling是Agent"睁开眼睛看世界"的技术。

没有它,大模型就是一个孤立的大脑,知识有上限、能力有边界。

它能回答过去的问题,但回答不了现在的问题。

它能生成文字,但做不了实际的事。

它像一个困在图书馆里的百科全书,知道很多,但无法接触现实世界。

有了它,Agent可以接入真实世界:

接入实时数据:搜索、新闻、股票、天气
操作现实世界:发邮件、操作文件、控制设备
获取专业知识:查数据库、用RAG
执行复杂计算:跑代码、做分析

工具的丰富程度,直接决定了Agent的能力边界。

这也是为什么现在各大厂都在拼命建"工具生态"——

谁的工具多、工具好用,谁的Agent就更强。

OpenAI推出了Plugin系统,Anthropic推出了MCP,Google在推AgentBuilder…

每家都在开放工具接口,因为没有工具的AI只能"纸上谈兵"。

未来,Agent的价值不只是"智能",更在于它能连接多少真实世界的服务

一个能查航班、发邮件、订酒店、买股票、写报告的Agent,比一个只会聊天的AI助手有用一百倍。

就像一个人,光有脑子不够,还得有手有脚,能把想法变成行动。

Function Calling,就是给AI装上手脚的技术。


下期预告

Agent能调用工具,但工具用完就忘了。

上一秒查过的天气,下一秒可能又要再查一遍。

用户的偏好、对话的上下文、多轮交互的历史…

这些都需要Agent记住。

下一期,我们来解决这个问题:Agent如何记忆?

我会讲清楚Agent的三层记忆系统:

感官记忆:当前对话中的即时信息
工作记忆:当前任务的相关上下文
长期记忆:跨对话的持久知识

以及向量数据库是如何让Agent能"记住"海量知识的。

Agent不只是能做事,它还能记得住。

记忆让Agent变得真正智能,而不只是简单的问答机器。

下期见。


完整版合集、面试题库、项目实战,全网同名【图解 AI 系列】

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐