什么是函数调用?
函数调用是大语言模型(LLM)对其环境采取行动的一种方式。它最初在 GPT-4 的函数调用更新 中引入,随后被其他模型借鉴。
就像智能体(Agent)的工具一样,函数调用赋予了模型对其环境采取行动的能力。然而,函数调用能力是由模型学习(微调)得到的,并且比其他智能体技术更少依赖提示词。
在第 1 单元中,智能体并未学习使用工具(Tools),我们只是提供了工具列表,并依赖模型能够泛化地使用这些工具来定义计划这一事实。
而在这里,通过函数调用,智能体被微调(训练)以使用工具。
模型如何“学习”采取行动?
在第 1 单元中,我们探讨了智能体的一般工作流程。一旦用户向智能体提供了一些工具并用查询提示它,模型将循环执行:
- 思考(Think):为了实现目标,我需要采取什么行动。
- 行动(Act):使用正确的参数格式化行动并停止生成。
- 观察(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"},
]
函数调用为对话带来了新的角色!
- 一个用于 行动(Action) 的新角色
- 一个用于 观察(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。