函数调用是大型语言模型(LLM)中的一种应用程序编程接口(API)机制,它允许模型输出结构化、机器可读的请求,以调用开发者定义的函数或工具,而不是生成纯文本。这种能力弥合了对话式或生成式输出与可执行操作之间的差距,使LLM能够检索实时数据、执行计算、与外部系统交互或编排多步骤工作流。在典型实现中,开发者向模型提供一组函数定义,包括名称、描述和参数模式;然后,模型根据用户的提示决定是否调用函数,如果调用,则发出包含函数名称和参数的结构化对象(通常是JSON)。应用程序执行该函数,将结果返回给模型,然后模型可以将该结果整合到对用户的最终响应中。
函数调用与早期方法(如提示工程或针对工具使用的微调)不同,因为它依赖于模型原生遵循结构化输出格式以及推理何时及如何调用工具的能力。它是许多现代LLM API的核心功能,包括OpenAI、Anthropic和Google DeepMind的API,并已成为代理式AI系统的标准构建块,在这些系统中,模型自主规划和执行一系列操作。该机制也被称为工具使用、工具调用或结构化输出生成,尽管函数调用特别强调了模型与应用程序之间的API契约。
历史发展
将语言模型连接到外部工具的概念早于“函数调用”这一术语。2010年代的早期工作,例如将检索系统与神经模型集成,通过证明模型可以从外部信息源中受益,为此奠定了基础。然而,现代函数调用范式随着基于Transformer的LLM及其可靠生成结构化输出的能力而出现。
OpenAI于2023年6月正式推出了函数调用API,作为其GPT-4和GPT-3.5 Turbo模型更新的一部分。这允许开发者定义函数,并让模型返回一个JSON对象,指定要调用哪个函数以及使用哪些参数。该发布附带了文档和示例,展示了诸如查询数据库、发送电子邮件和获取天气数据等用例。Anthropic在2024年推出了自己的工具使用功能,Google DeepMind也将其类似能力整合到Gemini模型中。到2025年,函数调用已成为主要LLM提供商的标准功能,包括Meta和Mistral等开源模型,通常通过兼容OpenAI的API格式实现。
函数调用的设计受到了早期关于工具增强语言模型研究的影响,例如Meta AI(2023年)的Toolformer模型,该模型学习何时调用API,以及ReAct模式(2022年),该模式将推理和行动交错进行。这些方法表明,LLM可以从显式工具调用中受益,但它们需要自定义训练或提示。函数调用将其标准化为简单的API契约,使任何开发者都能使用。
技术机制
函数调用在标准LLM推理循环中运行。开发者向API发送请求,其中包含用户提示和函数定义列表。每个定义通常包括名称、描述和指定参数的JSON模式。模型处理此输入,并生成普通文本响应或结构化函数调用。例如,在OpenAI API中,模型在响应中返回一个tool_calls字段,其中包含函数名称和作为JSON字符串的参数。
模型生成有效结构化输出的能力,得益于其在包含JSON和其他结构化格式的大型语料库上的训练,以及指令调整和基于人类反馈的强化学习(RLHF)。一些实现使用约束解码或基于语法的采样来确保输出在语法上有效,尽管大多数现代LLM无需此类约束即可高可靠地生成正确的JSON。
模型发出函数调用后,应用程序在沙盒或可信环境中执行该函数,捕获结果(可以是字符串、数字或复杂对象),并在后续请求中将其发送回模型。然后,模型生成最终响应,整合工具结果。此循环可以重复多次,允许模型链式调用多个函数以完成复杂任务。
用例和应用
函数调用支持广泛的实用应用。一个常见用例是实时数据检索:用户询问当前股价、天气或体育比分的问题,模型调用一个查询外部API以获取最新数据的函数。另一个是数据库交互,模型将自然语言查询转换为SQL或其他查询语言,并针对数据库执行,将结果返回给用户。
在企业环境中,函数调用为客服聊天机器人提供支持,这些机器人可以查找订单状态、更新记录或升级问题。在软件开发中,它使AI助手能够执行代码、运行测试或与版本控制系统交互。在自动化中,它允许模型控制智能家居设备、发送消息或安排约会。该机制也是代理式框架的核心,在这些框架中,模型规划一系列操作,调用函数执行每个步骤,并根据结果进行迭代。
与代理系统的集成
函数调用是代理式AI的基础组件,在这种AI中,模型不仅进行对话,还代表用户采取行动。代理可以使用函数调用将用户的目标分解为子任务,调用搜索函数收集信息,调用计算函数处理数据,然后调用消息传递函数交付结果。模型决定何时调用函数以及如何解释结果的能力,对于有效的代理行为至关重要。
LangChain、LlamaIndex和AutoGPT等框架利用函数调用编排复杂工作流。这些框架提供了定义工具、管理对话状态和处理错误的抽象。函数调用的兴起也导致了工具注册表和市场的开发,开发者可以在其中共享和重用函数定义。
与替代方法的比较
在函数调用之前,开发者使用了几种变通方法让LLM访问工具。一种方法是提示工程,即指示模型输出特定格式(例如,“响应包含‘action’和‘action_input’的JSON对象”),应用程序解析该输出。这种方法很脆弱,因为模型可能偏离格式。另一种方法是微调,即模型在工具使用的示例上进行训练,但这需要大量数据和计算资源。
函数调用通过提供模型明确训练遵循的结构化API,改进了这些方法。它减少了解析错误,提高了可靠性,并简化了开发者体验。然而,它并非没有局限性。模型可能幻觉出不存在的函数调用,生成错误的参数,或在需要时未能调用函数。开发者必须实现验证和错误处理以缓解这些问题。
安全性和可靠性考虑
函数调用引入了安全风险,因为模型的输出直接触发操作。恶意提示可能诱使模型调用具有有害参数的函数,例如删除数据或发送未经授权的消息。开发者必须实施严格的函数参数验证,使用允许的函数列表,并在具有最小权限的沙盒环境中运行函数。
可靠性是另一个问题。模型可能生成语法有效但语义不正确的参数,或调用错误的函数。少样本提示、更好的函数描述和事后验证等技术可以提高准确性。一些提供商提供强制JSON模式合规的结构化输出模式,降低格式错误调用的风险。
未来方向
函数调用正在快速发展。研究人员正在探索改进模型选择正确函数、处理模糊提示和从错误中恢复的能力。多轮函数调用(模型可以并行或顺序调用函数)正变得越来越普遍。还有工作致力于提高函数调用的效率,通过减少用于函数定义的令牌数量以及缓存工具模式。
随着LLM能力的增强,函数调用可能会与记忆、规划和多模态输入等其他功能更紧密地集成。函数调用与一般工具使用之间的界限正在模糊,一些模型能够直接调用代码或使用API而无需显式定义。跨提供商(如兼容OpenAI的API)的函数调用格式标准化,正在帮助创建互操作工具和代理的生态系统。