这篇适合已经了解智能体基本流程、想弄清“模型怎样学会调用工具”的读者。读完你能说清函数调用在对话里是怎样表示的,知道一个基础模型要经过哪些训练才变得能用,并理解 LoRA 为什么能用较少的资源完成微调。
函数调用是什么
函数调用(function calling)是让大语言模型对外部环境采取行动的一种方式。它最早由 GPT-4 引入,之后也被其他模型复现[1]。
它与智能体的工具很相似,都让模型能对环境采取行动。不同之处在于,函数调用的能力是模型学会的,而且比其他智能体技术更少依赖提示词[1]。
在第一单元里,智能体并没有真正学会用工具:工具清单交给它,模型靠泛化能力自己规划如何使用这些工具。而函数调用则是通过微调(训练)让智能体学会使用工具[1]。
模型怎样“行动”:思考、行动、观察
使用工具的模型会循环三个步骤[1]:
- 思考(Think):判断要完成目标需要采取什么动作;
- 行动(Act):按正确的参数格式化动作,然后停止生成;
- 观察(Observe):取回执行的结果。
对话通过 API 进行时,用户和助手的消息交替出现,像这样[1]:
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]。以 Mistral API 为例,助手发出函数调用,然后一条 tool 角色的消息返回结果[1]:
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 实际上是把动作作为 assistant 消息返回的。聊天模板再用一组特殊标记来表示函数调用[1]:[AVAILABLE_TOOLS] 开始列出可用工具,[/AVAILABLE_TOOLS] 结束列表;[TOOL_CALLS] 表示调用工具,也就是行动;[TOOL_RESULTS] 表示观察工具返回的结果,[/TOOL_RESULTS] 结束观察,之后模型才能继续解码[1]。想深入了解,可以读 Mistral 官方的函数调用文档[1]。
模型的三步训练
一个模型通常要经过三步训练[2]:
- 预训练:在海量数据上训练,得到基础模型(base model)。它只会预测下一个词,不擅长遵循指令;
- 指令微调:让模型能遵循指令,在聊天场景中可用;
- 对齐:让模型符合创建者的偏好。比如客服聊天模型绝不能对客户无礼。
Gemini、Mistral 这类完整产品通常会走完这三步;Hugging Face 上的模型则可能只完成了其中的一步或几步[2]。
为什么从指令微调模型开始
本文以 google/gemma-2-2b-it 作为起点,而不是基础模型 google/gemma-2-2b。前者已经针对这类用途做过改进[2]。
如果从预训练模型开始,就得同时学会遵循指令、聊天和函数调用,需要更多训练。从指令微调模型出发,模型需要学习的内容就少得多[2]。
LoRA:只训练一小部分参数
LoRA(Low-Rank Adaptation of Large Language Models,大语言模型的低秩适配)是一种流行而轻量的训练技术,能显著减少需要训练的参数数量[2]。
它的做法是在模型中插入少量新的权重,作为适配器(adapter)来训练。这让训练更快、更省显存,产出的权重只有几百 MB,更容易保存和分享[2]。具体来说,LoRA 在 Transformer 层中加入成对的秩分解矩阵,通常作用于线性层。训练时其余部分保持冻结,只更新适配器的权重[2]。
推理时,输入会同时经过适配器和基础模型;也可以把适配器的权重合并进基础模型,这样不会带来额外的延迟开销[2]。对于要把大语言模型适配到特定任务或领域、同时控制资源消耗的场景,LoRA 尤其有用[2]。
准备:打开 notebook
有一个可以在 Colab Notebook 中运行的 notebook,按它的步骤做即可[2]。
下一步
第一单元的材料提到,下一步是给 google/gemma-2-2b-it 添加函数调用能力。这个模型原本没有这种能力,做法是向模型追加新的特殊标记[1]。
本文改编自 Hugging Face 开源课程《Agents Course》附加单元 1 的内容[1][2],原文以 Apache-2.0 许可证发布。
来源
- 1What is Function Calling?Hugging Face agents-course (Apache-2.0)
- 2Let's Fine-Tune Your Model for Function-CallingHugging Face agents-course (Apache-2.0)
引用本页: 给模型微调函数调用能力:LoRA 入门. TellWorld, https://www.tellworld.net/zh/practice/practice-function-calling-fine-tuning. 更新于 2026-11-14