智能体课程文档

什么是函数调用?

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

什么是函数调用?

函数调用是大型语言模型(LLM)在其环境中采取行动的一种方式。它最初由GPT-4 引入,后来在其他模型中也得到了实现。

就像代理的工具一样,函数调用赋予模型在其环境中采取行动的能力。然而,函数调用能力是由模型学习的,并且对提示的依赖程度低于其他代理技术

在第一单元中,代理没有学习使用工具,我们只是提供了列表,我们依赖于模型能够概括使用这些工具来定义计划的能力。

而在这里,通过函数调用,代理被微调(训练)以使用工具

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

在第一单元中,我们探讨了代理的一般工作流程。一旦用户给代理提供了一些工具并用一个查询提示它,模型将循环执行以下步骤:

  1. 思考:我需要采取什么行动才能实现目标。
  2. 行动:用正确的参数格式化行动并停止生成。
  3. 观察:获取执行结果。

在通过 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. 一个新角色用于行动
  2. 一个新角色用于观察

如果我们以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 中,模型将要采取的行动格式化为“助手”消息。聊天模板将通过特殊标记来表示函数调用。

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

我们将在本课程中再次讨论函数调用,但如果您想深入了解,可以查看这个优秀的文档部分


现在我们了解了什么是函数调用以及它是如何工作的,让我们通过向模型附加一些新的特殊标记来为尚未具备这些能力的模型添加一些函数调用能力google/gemma-2-2b-it

为此,我们首先需要了解微调和 LoRA

< > 在 GitHub 上更新