大模型函数调用:从思考到行动
在大模型应用中,Function-calling(函数调用) 是让大模型突破“纯文本输出局限”、连接外部工具/系统(如数据库查询、API接口、硬件控制等)的核心能力——简单说,它让大模型从“只能回答问题”升级为“能主动调用工具解决实际问题”,是构建Agent(智能体)、自动化工作流的关键技术。
一、核心定义:大模型为什么需要Function-calling?
大模型本身的能力有两个天然限制:
- 信息滞后:训练数据截止到某个时间(如GPT-4截止2023年10月),无法获取实时信息(如2024年天气、实时股价);
- 无执行能力:只能输出文本,无法直接操作外部系统(如查数据库、发邮件、控制机器人)。
而Function-calling解决了这两个问题:
- 它允许开发者预先定义“可调用的函数列表”(如
get_weather(city, date)获取天气、query_database(sql)查询数据库),并告诉大模型“这些函数能做什么、需要什么参数”; - 大模型在处理用户需求时,会自主判断:“是否需要调用函数?调用哪个函数?传什么参数?”,然后输出“函数调用指令”;
- 开发者的代码接收这个指令后,实际执行函数并返回结果;
- 大模型再基于“函数返回结果”,生成最终的自然语言回答(或继续调用其他函数)。
简单类比:Function-calling让大模型从“只会说话的顾问”,变成“能调用计算器、查字典、发消息的全能助手”。
二、核心流程:一次完整的Function-calling是怎样的?
以“用户查询北京2024年5月1日天气”为例(假设大模型无实时数据,需调用天气API),流程分4步:
1. 开发者定义函数并“告诉”大模型
首先,开发者需要用结构化格式(通常是JSON),把可调用的函数信息传给大模型,明确:
- 函数名(如
get_weather); - 函数功能(“获取指定城市指定日期的天气数据”);
- 所需参数(如
city:城市名,字符串;date:日期,格式YYYY-MM-DD,必填)
示例函数定义(json格式):
[
{
"name": "get_weather",
"description": "获取指定城市指定日期的天气数据(包括温度、降水概率、风力)",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如‘北京’‘上海’"
},
"date": {
"type": "string",
"description": "日期,格式为YYYY-MM-DD,如‘2024-05-01’"
}
},
"required": ["city", "date"] // 必填参数
}
}
]
2. 用户输入需求,大模型判断“是否需要调用函数”
用户输入:“北京2024年5月1日的天气怎么样?”
大模型分析后发现:“我的训练数据截止到2024年5月前,没有2024年5月1日的实时天气,必须调用get_weather函数才能获取数据”——于是,大模型输出“函数调用指令”(而非直接回答)。
示例模型输出(通常带特定标记,方便代码识别):
{
"name": "get_weather",
"parameters": {
"city": "北京",
"date": "2024-05-01"
}
}
3. 开发者代码执行函数,返回结果
开发者的后端代码(如Python、Java)监测到模型输出的是“函数调用指令”,会:
- 解析指令中的函数名和参数;
- 调用对应的天气API(或数据库),执行
get_weather("北京", "2024-05-01"); - 获取API返回的天气数据(如“温度18-25℃,晴,降水概率10%,风力2级”),并整理成结构化格式(如JSON)。
示例函数返回结果:
{
"city": "北京",
"date": "2024-05-01",
"temperature": "18-25℃",
"weather": "晴",
"precipitation_prob": "10%",
"wind": "2级"
}
4. 大模型基于函数结果,生成最终回答
开发者将“函数返回结果”作为新的输入,传给大模型;
大模型结合“用户需求”和“函数结果”,生成自然语言回答:“北京2024年5月1日的天气为晴,气温在18-25℃之间,降水概率10%,风力2级,适合户外活动~”。
三、关键注意点:与token限制、多轮调用的关系
1. 占用输入token
- 函数定义、函数调用指令、函数返回结果,都会计入大模型的“输入token总量”——如果函数定义复杂(如多个参数、长描述)或返回结果冗长(如大段数据库数据),可能会挤压“历史对话”的token空间,需注意精简。
2. 多轮函数调用
部分复杂任务需要“连续调用多个函数”:
例如“用户查询‘北京2024年5月1日天气是否适合爬山,若适合,推荐3个附近的爬山景点’”——
- 模型先调用
get_weather获取天气(判断适合爬山); - 再调用
search_mountain_spots(查询北京附近爬山景点); - 最后基于两个函数的结果,生成综合回答。
此时,每一轮函数调用的“指令+结果”都会作为历史对话,存入输入上下文,供模型判断下一步是否需要继续调用函数。
四、典型应用场景
Function-calling是大模型落地的核心技术,常见场景包括:
- 实时信息获取:调用天气API、股价API、新闻API,获取实时数据;
- 数据查询与分析:调用数据库函数(如
query_sales_data(month="2024-04")),生成销售报表; - 工具控制:调用办公软件API(如发邮件、生成Excel)、硬件API(如控制智能家居、机器人);
- Agent智能体:构建自动完成任务的Agent(如“自动生成周报”:调用数据库查数据→调用Excel生成表格→调用邮件发送给领导)。
简单说,Function-calling的核心价值是“打通大模型与外部世界的连接”——让模型不仅能“思考”,还能“行动”,是从“文本生成”走向“任务解决”的关键一步。
更多推荐
所有评论(0)