函数调用是大语言模型(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的基础组件,其中模型不仅进行对话,还代表用户行动。智能体可能使用函数调用将用户目标分解为子任务,调用搜索函数收集信息,调用计算函数处理数据,然后调用消息传递函数交付结果。模型决定何时调用函数以及如何解释结果的能力对于有效代理至关重要。
LangChain、LlamaIndex和AutoGPT等框架利用函数调用编排复杂工作流。这些框架提供定义工具、管理对话状态和处理错误的抽象。函数调用的兴起也促进了工具注册表和市场的开发,开发者可以在其中共享和重用函数定义。
与替代方法的比较
在函数调用之前,开发者使用几种变通方法让LLM访问工具。一种方法是提示工程,其中指示模型输出特定格式(例如,“响应包含‘action’和‘action_input’的JSON对象”),应用程序解析该输出。这很脆弱,因为模型可能偏离格式。另一种方法是微调,其中模型在工具使用示例上进行训练,但这需要大量数据和计算。
函数调用通过提供模型明确训练遵循的结构化API来改进这些方法。它减少了解析错误,提高了可靠性,并简化了开发者体验。然而,它并非没有局限性。模型可能幻觉出不存在的函数调用,生成错误的参数,或在需要时未能调用函数。开发者必须实现验证和错误处理以缓解这些问题。
安全性与可靠性考虑
函数调用引入了安全风险,因为模型的输出直接触发操作。恶意提示可能诱使模型调用具有有害参数的函数,如删除数据或发送未经授权的消息。开发者必须实施严格的函数参数验证,使用允许函数列表,并在具有最小权限的沙盒环境中运行函数。
可靠性是另一个问题。模型可能生成语法有效但语义错误的参数,或调用错误的函数。少样本提示、更好的函数描述和事后验证等技术可以提高准确性。一些提供商提供结构化输出模式,强制执行JSON模式合规性,减少格式错误调用的风险。
未来方向
函数调用正在快速发展。研究人员正在探索改进模型选择正确函数、处理模糊提示和从错误中恢复的能力。多轮函数调用(模型可以并行或顺序调用函数)正变得越来越普遍。还有工作致力于提高函数调用的效率,通过减少函数定义使用的令牌数量和缓存工具模式。
随着LLM能力的增强,函数调用可能更深入地与其他功能(如记忆、规划和多模态输入)集成。函数调用与一般工具使用之间的界限正在模糊,一些模型能够直接调用代码或使用API而无需显式定义。跨提供商(如OpenAI兼容API)的函数调用格式标准化正在帮助创建可互操作工具和智能体的生态系统。