Agent如何调用工具:Function Calling原理详解
本文首发于同名公众号欢迎收藏转发点赞。你有没有遇到过这种情况问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-DDAgent一看就明白这个工具是查机票的用户问机票问题时我就用它。参数怎么填、什么时候用一清二楚。工具描述越具体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推出了MCPGoogle在推AgentBuilder…每家都在开放工具接口因为没有工具的AI只能纸上谈兵。未来Agent的价值不只是智能更在于它能连接多少真实世界的服务。一个能查航班、发邮件、订酒店、买股票、写报告的Agent比一个只会聊天的AI助手有用一百倍。就像一个人光有脑子不够还得有手有脚能把想法变成行动。Function Calling就是给AI装上手脚的技术。下期预告Agent能调用工具但工具用完就忘了。上一秒查过的天气下一秒可能又要再查一遍。用户的偏好、对话的上下文、多轮交互的历史…这些都需要Agent记住。下一期我们来解决这个问题Agent如何记忆我会讲清楚Agent的三层记忆系统感官记忆当前对话中的即时信息工作记忆当前任务的相关上下文长期记忆跨对话的持久知识以及向量数据库是如何让Agent能记住海量知识的。Agent不只是能做事它还能记得住。记忆让Agent变得真正智能而不只是简单的问答机器。下期见。完整版合集、面试题库、项目实战全网同名【图解 AI 系列】