工程师科普大模型系列:大模型使用工具(Function Call)
一、 什么是 Function Calling?
简单来说,Function Calling 是大模型根据用户请求,智能地判断是否需要调用外部工具(函数),并自动生成符合函数要求的调用参数的一种能力。
它并不是大模型真的去“执行”函数,而是扮演一个超级智能的“参数生成器”和“调度决策者”。真正的执行由背后的代码逻辑完成。
二、 核心原理:将自然语言转换为结构化数据
其技术基础是经过微调的训练,使模型学会以下模式:
-
意图识别: 判断用户的请求(自然语言)是否超出了模型自身知识或能力的边界,必须借助外部工具才能完成。
- 示例: “今天北京天气怎么样?” -> 意图:查询实时天气(需要调用API)。
- 示例: “解释一下量子计算” -> 意图:知识问答(无需调用函数,模型自身可回答)。
-
参数提取: 如果确定需要调用函数,模型能够从用户模糊、非结构化的自然语言描述中,精准地提取出函数所需的、结构化的参数。
- 示例: 用户说:“帮我给张三发个邮件,说明下午三点的会议取消了。”
- 函数定义可能包括:
send_email(recipient, subject, body) - 模型输出:
{ "name": "send_email", "arguments": { "recipient": "zhangsan@company.com", "subject": "会议取消通知", "body": "原定于今天下午三点召开的会议已取消,请知悉。" } }
三、 发展简史:从“提示词技巧”到“原生能力”
-
早期(提示词工程阶段): 工程师通过复杂的提示词(Prompt),引导模型以特定格式(如JSON)输出,然后再用正则表达式等方式解析。这种方式脆弱、不稳定,且容易因提示词变化而失效。
-
转折点(OpenAI GPT-3.5/4): 2023年6月,OpenAI 正式在 API 中引入了
function_call参数。这标志着 Function Calling 成为大模型的原生支持能力。开发者只需在 API 调用中明确定义好可用的函数列表及其参数格式(JSON Schema),模型就能稳定、可靠地进行判断和参数生成。 -
标准化与开源跟进: 此后,这成为一种行业标准能力。几乎所有的主流开源模型(如 Llama、Qwen、ChatGLM)都通过其特定的微调版本(如 Llama-3-8B-Instruct 支持
tools参数)支持了类似功能。
四、 应用模式与技术栈
1. 核心应用模式
- 数据抽取与结构化: 从长文本中抽取实体、关系、情感等,并输出为标准 JSON 格式。这是最基础且高价值的使用方式。
- 工具调用与 API 集成: 如上文的天气查询、发送邮件、查询数据库、调用业务系统API等。
- 智能 Agent 的基石: 复杂的 AI Agent(如 AutoGPT)之所以能自主行动,其核心就是循环地进行“思考 -> 决定调用哪个工具 -> 生成参数 -> 执行 -> 观察结果”的流程。Function Calling 是这个循环的核心驱动引擎。
2. 关键技术栈与流程
一个完整的 Function Calling 流程涉及以下组件和步骤:
步骤 1:定义函数
开发者使用 JSON Schema 精确描述函数名、描述、参数及其类型。
{
"name": "get_current_weather",
"description": "获取指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,例如:Beijing"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
description字段至关重要,模型靠它来理解函数的用途。
步骤 2:模型决策与生成
将用户查询和函数定义一同发送给大模型。模型返回一个决策:
function_call为null:不调用任何函数,直接回答。function_call包含name和arguments:需要调用指定函数,并提供了参数。
步骤 3:后端执行
你的应用程序接收到模型的 function_call 响应后:
- 在你的代码中(Python/Java/Go等)找到对应的真实函数。
- 将模型生成的
arguments解析为变量。 - 执行这个函数(如调用天气 API)。
步骤 4:结果整合与回复
将函数执行的结果(如 {“temperature”: 22, “unit": "celsius"})再次塞回上下文,请求模型生成一个对用户友好的总结。
- 最终回复: “北京今天天气晴朗,当前气温为 22 摄氏度。”
常用技术栈:
- 框架: LangChain / LlamaIndex 提供了高级抽象,简化了 Function Calling 的流程。
- 直接调用: 使用 OpenAI API、Anthropic Claude 的
tools参数,或开源模型的兼容接口(如 vLLM + OpenAI-Compatible API)。
五、 实践案例:天气查询智能体
场景: 用户问:“今天北京的天气怎么样?明天会下雨吗?”
后端系统已有函数:
get_current_weather(city): 返回当前天气状况。forecast_weather(city, date): 返回指定日期的天气预报。
具体流程:- 模型识别出用户意图是查询北京当前的天气以及明天的天气预报。
- 模型判断需要调用上述两个函数,并生成调用参数
{"city": "北京"}和{"city": "北京", "date": "明天"}。 - 你的代码执行这两个函数,获取到原始数据: *
get_current_weather("北京")->"晴朗"*forecast_weather("北京", "明天")->"多云,局部有小雨" - 将原始数据交回给模型,模型组织成自然语言回复: * “今天北京的天气是晴朗的,而明天则会是多云,局部地区可能会有小雨,请您注意携带雨具。”
总结
Function Calling 的本质是 “自然语言”与“结构化世界”之间的桥梁。它解决了大模型“知其然不知其所以然”(无法获取实时信息)和“纸上谈兵”(无法执行具体操作)的核心短板。对于工程师而言,它意味着:
- 可靠性: 输出是结构化的 JSON,易于解析和验证。
- 安全性: 模型只能选择你预先定义好的函数,行动范围被严格限制。
- 实用性: 极大地扩展了大模型的应用边界,使其能真正融入现有的软件系统和业务流程。
这正是当今大模型应用从“聊天玩具”走向“生产级系统”的关键技术支柱。
更多推荐


所有评论(0)