[AI智能体与提效-161] - AI应用程序开发中的Tools与Function Call的含义以及他们的异同
含义:指大语言模型(LLM)具备的一种原生能力。当模型发现用户的问题无法仅靠内部知识库回答,需要外部数据或执行操作时,它不会直接生成自然语言回答,而是生成一个结构化的 JSON 对象,描述它想要调用的函数名称及其参数。本质:它是模型输出的一种特殊格式流程用户提问:“明天北京天气怎么样?。注意:此时模型并没有真正执行代码,它只是“说”出了要执行的计划。真正的执行由应用程序后端完成。python# 这
·
在 AI 应用程序开发(特别是基于大语言模型 LLM 的应用,如 LangChain、LlamaIndex、OpenAI Assistants API 等)中,Tools(工具)和 Function Call(函数调用)是两个紧密相关但概念层级不同的术语。
简单来说:Function Call 是模型的一种“能力”或“输出格式”,而 Tool 是这种能力所调用的“具体实现”或“封装对象”。
以下是详细的解读与对比:
一、核心定义
1. Function Call (函数调用)
- 含义:指大语言模型(LLM)具备的一种原生能力。当模型发现用户的问题无法仅靠内部知识库回答,需要外部数据或执行操作时,它不会直接生成自然语言回答,而是生成一个结构化的 JSON 对象,描述它想要调用的函数名称及其参数。
- 本质:它是模型输出的一种特殊格式(Structured Output)。
- 流程:
- 用户提问:“明天北京天气怎么样?”
- 模型识别意图,输出 JSON:
{"name": "get_weather", "arguments": {"location": "Beijing", "date": "tomorrow"}}。 - 注意:此时模型并没有真正执行代码,它只是“说”出了要执行的计划。真正的执行由应用程序后端完成。
2. Tool (工具)
- 含义:指应用程序中定义的、可以被模型调用的具体功能单元。它是一个封装好的对象,通常包含三个部分:
- 元数据 (Schema):函数的名称、描述(告诉模型这个工具是做什么的)、参数定义(告诉模型需要提供什么信息)。
- 实现逻辑 (Implementation):实际执行的代码(如 Python 函数、API 请求、数据库查询)。
- 注册机制:将上述信息注册到 LLM 上下文中,让模型“知道”它的存在。
- 本质:它是能力的载体和执行者。
- 例子:一个名为
search_google的 Tool,它的元数据告诉模型“我可以搜索互联网”,它的实现逻辑是调用 Google Search API。
二、工作流程图解
理解它们关系的关键在于看它们如何协作:
在这个流程中:
- Function Call 发生在步骤 2 和 3(模型的输出)。
- Tool 包含了步骤 1(定义)、步骤 4(查找)和步骤 5(执行)。
三、异同点对比表
表格
| 维度 | Function Call (函数调用) | Tool (工具) |
|---|---|---|
| 定义层级 | 协议/格式层:模型输出的一种结构化数据格式。 | 应用/实现层:代码中具体的功能模块封装。 |
| 主体 | LLM (模型):是模型“想”做的事情。 | 开发者/框架:是开发者“提供”给模型的东西。 |
| 内容 | 仅包含:函数名 + 参数 (JSON)。 |
包含:函数名 + 描述 + 参数Schema + 执行代码。 |
| 执行动作 | 不执行。它只是一个“提议”或“请求”。 | 执行。它包含真实的业务逻辑(联网、查库、计算)。 |
| 依赖关系 | 依赖于模型是否支持该功能(如 GPT-3.5-turbo-0613+ 支持)。 | 依赖于开发者的代码实现和框架(LangChain, Semantic Kernel 等)。 |
| 比喻 | 顾客对服务员说:“我要一份牛排,五分熟。”(这是指令/意图) | 厨房里的厨师和灶台,真正把牛排做出来。(这是执行实体) |
| 演变 | 早期称为 "Function Calling",现在逐渐泛化为 "Structured Output" 或 "Tool Use"。 | 早期只是简单的函数映射,现在演变为包含复杂逻辑、记忆、甚至子 Agent 的复合体。 |
四、为什么会有这两个概念?(历史与演进)
-
早期阶段 (Prompt Engineering):
- 没有 Function Call。开发者必须在 Prompt 里写:“如果你需要查天气,请输出
CALL_WEATHER(location='...')”。 - 然后写正则表达式去解析模型的文本输出。这非常不稳定,模型容易胡说八道。
- 没有 Function Call。开发者必须在 Prompt 里写:“如果你需要查天气,请输出
-
Function Calling 时代 (API 原生支持):
- OpenAI 等厂商在 API 层面原生支持了 Function Call。模型被微调过,能稳定输出符合 JSON Schema 的格式,不再需要正则解析。
- 此时,Function Call 成为了一个标准术语,指代这种“模型输出结构化指令”的能力。
-
Tool Use / Agent 时代 (当前):
- 随着应用复杂化,仅仅调用一个函数不够了。我们需要工具拥有描述(让模型理解何时用)、错误处理、多步执行、甚至自主决定使用哪个工具。
- 框架(如 LangChain)引入了 Tool 的概念,将“函数定义”、“描述”和“执行逻辑”封装成一个对象。
- 现在的趋势是:Model supports Tool Use via Function Calling. (模型通过函数调用的机制来使用工具)。
五、代码示例 (以 OpenAI API 为例)
为了更直观地理解,请看伪代码:
1. 定义 Tool (开发者做的事)
python
# 这是一个 Tool 的定义
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather", # 函数名
"description": "Get the current weather in a given location", # 描述:告诉模型什么时候用
"parameters": { # 参数 Schema:告诉模型需要提供什么
"type": "object",
"properties": {
"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
}
]
# 这是 Tool 的实际实现 (后端代码)
def get_current_weather_impl(location, unit="fahrenheit"):
# 真实调用天气 API
return f"{location} 的天气是 25 度"
2. 触发 Function Call (模型做的事)
python
# 发送请求给 LLM
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "北京天气怎么样?"}],
tools=tools # 把 Tool 的定义(Schema)传给模型
)
# 模型返回的消息中包含 function_call (这就是 Function Call)
message = response.choices[0].message
if message.function_call:
print(f"模型想要调用函数: {message.function_call.name}")
print(f"参数是: {message.function_call.arguments}")
# 输出:
# 模型想要调用函数: get_current_weather
# 参数是: {"location": "Beijing", "unit": "celsius"}
# 接下来,开发者需要手动或框架自动去执行 get_current_weather_impl 函数
六、总结
- Function Call 是“说什么”:是 LLM 输出的一段结构化文本,表达“我想做这件事”的意图。
- Tool 是“做什么”和“怎么做”:是开发者提供给 LLM 的能力集合,包含了意图的描述(Schema)和实际的执行代码。
在现代 AI 开发框架中,我们通常配置 Tools,然后让模型通过 Function Calling 的机制来使用它们。随着技术发展,这两个词的界限在某些语境下变得模糊(例如直接说“让模型调用 Tool”),但在底层架构上,区分“意图表达(Call)”和“能力实体(Tool)”对于调试和设计系统至关重要。
更多推荐



所有评论(0)