在 AI 应用程序开发(特别是基于大语言模型 LLM 的应用,如 LangChain、LlamaIndex、OpenAI Assistants API 等)中,Tools(工具)和 Function Call(函数调用)是两个紧密相关但概念层级不同的术语。

简单来说:Function Call 是模型的一种“能力”或“输出格式”,而 Tool 是这种能力所调用的“具体实现”或“封装对象”

以下是详细的解读与对比:


一、核心定义

1. Function Call (函数调用)
  • 含义:指大语言模型(LLM)具备的一种原生能力。当模型发现用户的问题无法仅靠内部知识库回答,需要外部数据或执行操作时,它不会直接生成自然语言回答,而是生成一个结构化的 JSON 对象,描述它想要调用的函数名称及其参数。
  • 本质:它是模型输出的一种特殊格式(Structured Output)。
  • 流程
    1. 用户提问:“明天北京天气怎么样?”
    2. 模型识别意图,输出 JSON:{"name": "get_weather", "arguments": {"location": "Beijing", "date": "tomorrow"}}
    3. 注意:此时模型并没有真正执行代码,它只是“说”出了要执行的计划。真正的执行由应用程序后端完成。
2. Tool (工具)
  • 含义:指应用程序中定义的、可以被模型调用的具体功能单元。它是一个封装好的对象,通常包含三个部分:
    1. 元数据 (Schema):函数的名称、描述(告诉模型这个工具是做什么的)、参数定义(告诉模型需要提供什么信息)。
    2. 实现逻辑 (Implementation):实际执行的代码(如 Python 函数、API 请求、数据库查询)。
    3. 注册机制:将上述信息注册到 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 的复合体。

四、为什么会有这两个概念?(历史与演进)

  1. 早期阶段 (Prompt Engineering)

    • 没有 Function Call。开发者必须在 Prompt 里写:“如果你需要查天气,请输出 CALL_WEATHER(location='...')”。
    • 然后写正则表达式去解析模型的文本输出。这非常不稳定,模型容易胡说八道。
  2. Function Calling 时代 (API 原生支持)

    • OpenAI 等厂商在 API 层面原生支持了 Function Call模型被微调过,能稳定输出符合 JSON Schema 的格式,不再需要正则解析。
    • 此时,Function Call 成为了一个标准术语,指代这种“模型输出结构化指令”的能力。
  3. 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)”对于调试和设计系统至关重要。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐