什么是函数调用?

函数调用是大语言模型(LLM)对其环境采取行动的一种方式。它最初在 GPT-4 的函数调用更新 中引入,随后被其他模型借鉴。

就像智能体(Agent)的工具一样,函数调用赋予了模型对其环境采取行动的能力。然而,函数调用能力是由模型学习(微调)得到的,并且比其他智能体技术更少依赖提示词。

在第 1 单元中,智能体并未学习使用工具(Tools),我们只是提供了工具列表,并依赖模型能够泛化地使用这些工具来定义计划这一事实。

而在这里,通过函数调用,智能体被微调(训练)以使用工具。

模型如何“学习”采取行动?

在第 1 单元中,我们探讨了智能体的一般工作流程。一旦用户向智能体提供了一些工具并用查询提示它,模型将循环执行:

  1. 思考(Think):为了实现目标,我需要采取什么行动。
  2. 行动(Act):使用正确的参数格式化行动并停止生成。
  3. 观察(Observe):从执行中获取结果。

在通过 API 与模型进行的“典型”对话中,对话将在用户和助手消息之间交替进行,如下所示:

conversation = [
    {"role": "user", "content": "I need help with my order"},
    {"role": "assistant", "content": "I'd be happy to help. Could you provide your order number?"},
    {"role": "user", "content": "It's ORDER-123"},
]

函数调用为对话带来了新的角色!

  1. 一个用于 行动(Action) 的新角色
  2. 一个用于 观察(Observation) 的新角色

如果我们以 Mistral API 为例,它看起来像这样:

conversation = [
    {
        "role": "user",
        "content": "What's the status of my transaction T1001?"
    },
    {
        "role": "assistant",
        "content": "",
        "function_call": {
            "name": "retrieve_payment_status",
            "arguments": "{\"transaction_id\": \"T1001\"}"
        }
    },
    {
        "role": "tool",
        "name": "retrieve_payment_status",
        "content": "{\"status\": \"Paid\"}"
    },
    {
        "role": "assistant",
        "content": "Your transaction T1001 has been successfully paid."
    }
]

但是,你刚才说函数调用有一个新角色?

是也不是。在这种情况下以及许多其他 API 中,模型将要采取的行动被格式化为“助手”消息。聊天模板随后将此表示为函数调用的特殊词元(special tokens)。

  • [AVAILABLE_TOOLS]:开始可用工具列表
  • [/AVAILABLE_TOOLS]:结束可用工具列表
  • [TOOL_CALLS]:调用工具(即采取“行动”)
  • [TOOL_RESULTS]:行动结果的“观察”
  • [/TOOL_RESULTS]:观察结束(即模型可以再次解码)

我们将在本课程中再次讨论函数调用,但如果你想深入了解,可以查看 Mistral 的这份文档。


现在我们已经了解了什么是函数调用以及它是如何工作的,接下来为一个尚未具有这些能力的模型添加一些函数调用功能:通过向模型添加一些新的特殊词元来增强 google/gemma-2-2b-it。

要能够做到这一点,我们首先需要理解微调和 LoRA。

小结

  • 函数调用是 LLM 借助微调“学会”使用工具、对环境采取行动的能力,比通用智能体技术更少依赖提示词。
  • 它不同于第 1 单元:智能体不再只是泛化使用给定工具列表,而是被训练来生成工具调用。
  • 函数调用在对话中引入 Action(行动)与 Observation(观察)两个新角色,通常以“助手”消息承载,并由聊天模板转为特殊词元。
  • 关键特殊词元包括 [AVAILABLE_TOOLS]、[TOOL_CALLS]、[TOOL_RESULTS] 等,用于标记工具列表、调用与结果。
  • 为无此能力的模型(如 Gemma-2-2b-it)添加函数调用,需要借助微调与 LoRA。

参考与延伸阅读