Function Calling(函数调用)
让大语言模型在需要时生成结构化调用指令,由外部系统执行真实函数并返回结果的机制。
LLM 通过调用外部工具突破自身能力边界的核心机制。
内容摘要
Tool Use(工具使用)是指大语言模型(LLM, Large Language Model)在对话过程中,自主判断是否需要借助外部工具来完成任务,并生成结构化的调用指令,由应用层执行后将结果回传给模型的一整套交互机制。
Tool Use(工具使用)是指大语言模型(LLM, Large Language Model)在对话过程中,自主判断是否需要借助外部工具来完成任务,并生成结构化的调用指令,由应用层执行后将结果回传给模型的一整套交互机制。
LLM 的训练数据有截止日期,无法获取实时信息;它做"概率预测下一个 token(词元)"而非真正的数学运算,计算结果不可靠;它也无法主动操作数据库、发邮件或读写文件。Tool Use 的出现就是为了解决这三个根本性限制——不让 LLM 什么都自己干,而是让它当"调度员",把具体工作分配给专业工具执行。
与传统的 API 调用不同,Tool Use 的核心特点在于由模型自主决策:开发者只需告诉模型"有哪些工具可用、每个工具做什么",模型会根据用户的自然语言请求,自行判断该不该调用工具、调用哪个、传什么参数。这种"理解意图 + 选择工具 + 生成参数"的能力,是 Agent(智能体)能够真正"做事"的基础。
Tool Use 的运转依赖四个核心要素,缺一不可:
| 结构 | 作用 | 说明 |
|---|---|---|
| 工具定义(Tool Definition) | 告诉模型有什么工具可用 | 包含名称、功能描述、参数格式 |
| 意图识别(Intent Recognition) | 模型判断是否需要调用工具 | 基于用户请求和工具描述进行匹配 |
| 参数生成(Parameter Generation) | 模型输出结构化调用指令 | 通常为 JSON 格式,包含函数名和参数值 |
| 结果回传(Result Return) | 工具执行结果返回给模型 | 模型据此生成最终的自然语言回答 |
工具定义是整个机制的起点。开发者用 JSON Schema(JSON 模式)格式描述每个工具的名称、功能和参数结构,这段描述会随 API 请求发送给模型。模型不会看到工具的源代码,它完全依赖这份描述来理解工具能做什么、什么时候该用。
以 Anthropic Claude API 为例,一个工具定义的基本结构是:
工具名称(name): "get_weather"
功能描述(description): "获取指定城市的当前天气"
参数模式(input_schema):
- location(字符串,必填): 城市名称
- unit(字符串,可选): 温度单位
工具描述的质量直接影响模型的调用准确率。描述不仅要说明"能做什么",还应说明"什么时候该用"。
模型收到用户请求后,会将请求内容与所有可用工具的描述进行比对,判断是自己直接回答,还是调用某个工具。比如用户问"什么是机器学习",模型直接回答;用户问"北京今天几度",模型识别出需要调用天气工具。
模型决定调用工具后,从用户的自然语言中提取出工具所需的参数,并按照 JSON 格式输出。比如用户说"上海明天天气",模型生成 {"location": "上海"}。这一步的难点在于用户表达的多样性——"魔都天气"、"明天出门要带伞吗"都需要被正确解析。
应用层执行完工具函数后,将返回的原始数据(如 {"temperature": 22, "condition": "晴"})以特定消息格式发回给模型。模型将这些数据转化为用户能理解的自然语言回答,如"上海明天 22 度,晴天"。
Tool Use 的核心是一个"请求 - 调用 - 回传"的消息循环。整个过程中,模型只负责决策和语言处理,不执行任何实际操作;应用层只负责执行工具函数,不做意图判断。两者分工明确。
完整流程分为四步:
tool_use。tool_result(工具结果)消息格式发回给模型。如果一次请求需要多条信息(比如同时查北京和上海的天气),模型可以在单次响应中发起多个工具调用(Parallel Tool Calls,并行工具调用),应用层逐一执行后统一回传。
图中的关键流转:模型在第 ② 步不是返回文字回答,而是返回一个结构化的工具调用指令——这是 Tool Use 和普通对话的核心区别。第 ③ 步的工具执行完全发生在开发者侧,模型无法直接访问任何外部系统。
以下伪代码展示 Tool Use 的核心消息结构(基于 Anthropic Claude API 格式):
# 伪代码:展示 Tool Use 的消息交互结构
# 基于 anthropic Python SDK 格式(截至 2026-03)
# ① 开发者定义工具
tools = [{
"name": "get_weather",
"description": "获取指定城市的当前天气",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市名称"}
},
"required": ["location"]
}
}]
# ② 模型返回工具调用指令(而非文字)
# response.stop_reason == "tool_use"
# response.content 包含:
# {"type": "tool_use", "name": "get_weather", "input": {"location": "北京"}}
# ③ 开发者执行工具,拿到结果
result = get_weather(location="北京") # {"temperature": 22, "condition": "晴"}
# ④ 将结果以 tool_result 格式回传给模型
messages.append({
"role": "user",
"content": [{"type": "tool_result", "tool_use_id": "xxx", "content": '{"temperature":22}'}]
})
# ⑤ 模型收到结果后生成最终回答
# "北京今天 22 度,晴天,适合出行。"
伪代码对应前述四步流程的消息结构。实际开发中需补充 API 客户端初始化、错误处理和多轮对话管理,此处省略以聚焦核心机制。
| 概念 | 与 Tool Use 的区别 | 更适合关注的重点 |
|---|---|---|
| Function Calling(函数调用) | 是 Tool Use 的具体实现方式之一,最初由 OpenAI 在 2023 年 6 月提出 | 某个模型 API 的调用规范和参数格式 |
| MCP(Model Context Protocol,模型上下文协议) | 是工具侧的标准化协议,解决"工具如何被发现和接入"的问题 | 跨应用的工具复用和即插即用 |
| Agent(智能体) | Tool Use 是 Agent 的核心能力之一,Agent 还包含规划、记忆等能力 | 自主任务分解、多步推理、完整任务闭环 |
核心区别:
functions 参数,后来升级为 tools 参数;Anthropic 从一开始就使用 tools 参数| 常见误区 | 正确理解 |
|---|---|
| "Tool Use 是让 LLM 执行代码" | LLM 只负责决定调用什么工具并生成参数,实际执行在应用层。模型本身不运行任何代码 |
| "工具注册得越多越好" | 工具过多会导致模型选择困难,参数生成错误率上升。实践建议按场景精选 5-20 个工具 |
| "Function Calling 和 Tool Use 是不同的东西" | Function Calling 是 Tool Use 的一种实现方式。OpenAI 最初用 functions 参数命名,后来统一为 tools,本质是同一机制 |
| "工具描述随便写几个字就行" | 工具描述是模型选择和使用工具的唯一依据。好的描述应包含功能说明、使用时机和参数约束 |
参考答案:
四步流程:① 开发者发送工具定义和用户消息 ② 模型返回工具调用指令 ③ 应用层执行工具并回传结果 ④ 模型生成最终回答。模型负责意图识别、工具选择和参数生成(决策层),应用层负责实际执行工具函数(执行层)。模型不直接运行任何代码。
参考答案:
模型完全通过工具描述来理解工具的功能和使用时机。描述为"天气工具"缺少三个关键信息:(1) 具体能做什么(查当前天气?查预报?查历史?);(2) 什么时候该用(用户问温度时?问穿衣建议时?);(3) 参数含义(city 还是 location?支持哪些地区?)。模型可能在不该调用时调用它,或者生成错误的参数格式。好的描述应写成:"获取指定城市的当前天气信息,当用户询问某个城市当前的温度、天气状况时使用"。
参考答案:
三个优化方向:(1) 减少同时可用的工具数量——按对话场景动态加载相关工具子集,比如用户聊订单时只挂载订单相关的 5-8 个工具;(2) 优化工具描述——确保每个工具的描述明确说明功能边界和使用条件,避免功能重叠导致模型混淆;(3) 引入工具路由层——先用一个轻量模型或规则引擎对用户意图做粗分类,再将对应的工具子集传给主模型。
优先展示同分类且标签更接近的内容,方便继续串联学习。
让大语言模型在需要时生成结构化调用指令,由外部系统执行真实函数并返回结果的机制。
Anthropic 提出的开放标准协议,为 AI 应用提供连接外部工具与数据源的统一接口。
动态构建和管理 LLM 输入信息的系统化方法,是 Prompt Engineering 的自然演进