Function calling (LLM) — 函数调用

From Systems analysis wiki
Jump to navigation Jump to search

Function Calling函数调用)是大型语言模型 (LLM)中的一种机制,它允许模型通过生成结构化数据(通常是 JSON)来调用函数,从而与外部工具和 API 交互,而不是直接生成文本回复[1]

换句话说,模型会根据用户请求,从预定义的函数集中决定调用哪个函数,以及使用哪些参数。这种机制扩展了 LLM 的应用范围,使其能够充当自然语言与实际操作之间的接口。这为将 AI 与外部系统集成开辟了可能性:模型可以请求最新数据、执行操作或使用服务,这在创建智能助手和自主代理时尤其有价值。此外,通过访问可靠数据源,使用外部工具还能降低幻觉(捏造事实)的风险[2]

历史与实现方法

早期方法(提示工程与 Toolformer)

教语言模型调用工具的想法形成于 2022–2023 年。早期方法基于复杂的提示工程技术。例如,2022 年提出的“ReAct”方案中,模型在对话过程中交替进行推理和操作(工具调用),并将两者编码在同一段文本中。

一个关键的进展是 Meta 研究人员于 2023 年初推出的“Toolformer”模型。Toolformer 证明了 LLM 可以通过专门的微调,学会根据文本提示自主调用外部工具(如计算器、搜索引擎、日历),并在生成的文本中插入特殊的 API 调用词元[3]

官方支持与发展

OpenAI 公司在 2023 年 6 月正式为其 GPT-3.5 和 GPT-4 模型的 API 引入了函数调用支持,这是一个重要的里程碑[4]。新版本的模型经过微调,能够识别用户请求中需要调用外部函数的情况,并生成结构精确的 JSON 对象作为参数。OpenAI 称此功能为“一种将 GPT 与外部工具和 API 可靠连接的新方法”。

开放计划

随着商业实现的推出,也出现了经过微调以生成正确函数调用的开源模型。

  • Gorilla: 加州大学伯克利分校的项目,一个经过微调的 LLaMA 版本,能够生成对数千种不同 API 的调用。为了评估这类模型,还创建了伯克利函数调用排行榜(Berkeley Function-Calling Leaderboard)[5]
  • ToolAlpaca, ToolLLaMA, Hermes: 一系列开源模型,它们通过在合成的函数调用示例上进行微调而得,这些示例通常由更强大的模型生成。

工作机制

使用函数调用的过程通常包括以下几个步骤:

  1. 定义函数。开发者预先定义一组模型可用的函数(例如外部 API),并描述它们的签名和用途,通常采用 JSON Schema 格式。
  2. 分析请求。在对话过程中,模型分析用户的意图,并自主决定是否需要调用已定义的某个函数来回答问题。
  3. 生成调用。如果需要执行操作,LLM 会生成一个特殊的结构化输出(例如包含函数名和参数的 JSON),而不是普通文本。如果不需要调用,模型则返回常规的文本回复。
  4. 执行函数。外部程序(聊天机器人或代理的外壳)接收 JSON,使用提供的参数实际调用指定的函数,然后将结果返回给模型。
  5. 生成最终答复。模型利用收到的数据生成给用户的最终回复[4]

为了在模型训练过程中管理这个多步骤流程,会使用特殊的对话格式,例如 OpenAI 的 ChatML 标记语言。其中除了“用户”和“助手”角色外,还引入了“函数”角色,用于传递函数调用的结果。

应用与优势

调用函数的能力显著扩展了 LLM 能够解决的任务范围。

  • 与外部 API 集成。模型可以调用外部服务(例如获取天气、汇率、新闻)来回答需要最新信息的问题。
  • 自动化用户操作。LLM 可以执行常规任务,如发送电子邮件、在日历中创建事件、在网上商店下订单。
  • 访问数据库和分析工具。自然语言查询可以被转换为内部 API 调用或 SQL 查询,以提取和分析数据。
  • 提取结构化信息。LLM 可以从长文本中自行提取事实(例如姓名、日期、地址),并以结构化的 JSON 数组形式返回,便于后续的程序处理。

安全问题

在扩展模型能力的同时,函数调用也带来了新的风险。

  • 未经检验的输出。模型与外部工具的交互必须受到严密保护。如果模型从 API 接收到恶意或错误的值,它可能会将其包含在回复中或基于该值调用另一个函数,从而导致不可预测的后果。
  • 通过函数参数进行攻击。研究人员发现了函数调用模式特有的漏洞。2025 年,一种被称为“函数调用的阴暗面”(The Dark Side of Function Calling)的攻击被展示出来。其核心思想是向模型提供一个特殊的“函数”,在其参数内部隐藏了被禁止的指令(越狱负载)。模型遵循调用函数的原则,生成了包含违规内容的参数,从而绕过了审核过滤器。测试表明,这种攻击在包括 GPT-4 和 Claude 在内的六种现代模型上成功率超过 90%[2]

为防止此类事件,建议只向模型提供受信任的工具,在执行关键操作前引入用户确认环节,并使用专门的“防御性”提示词以及对参数进行严格的危险内容检查。

链接

参考文献

  • Wu, Z. et al. (2025). The Dark Side of Function Calling: Pathways to Jailbreaking Large Language Models. ACL 2025.
  • OpenAI (2023). Function Calling and Other API Updates. OpenAI Blog.
  • Schick, T. et al. (2023). Toolformer: Language Models Can Teach Themselves to Use Tools. arXiv:2302.04761.
  • Patil, S. G. et al. (2023). Gorilla: Large Language Model Connected with Massive APIs. arXiv:2305.15334.
  • Liu, W. et al. (2024). ToolACE: Winning the Points of LLM Function Calling. arXiv:2409.00920.
  • Yao, S. et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629.

注释

  1. “What is Function Calling with LLMs?”. Hopsworks. [1]
  2. 2.0 2.1 Wu, Z. et al. “The Dark Side of Function Calling: Pathways to Jailbreaking Large Language Models”. Proceedings of the 2025 Conference on Empirical Methods in Natural Language Processing, 2025. [2]
  3. Schick, T. et al. “Toolformer: Language Models Can Teach Themselves to Use Tools”. arXiv:2302.04761, 2023. [3]
  4. 4.0 4.1 “Function calling and other API updates”. OpenAI, 2023. [4]
  5. “Gorilla: Large Language Model Connected to Massive APIs”. University of California, Berkeley. [5]