跳转到正文

AI 智能体中的函数调用

函数调用也称工具调用,是现代大语言模型智能体的核心能力之一。理解函数调用的内部工作方式,有助于构建有效的智能体,并在出错时进行调试。

本文内容

什么是函数调用?

函数调用让大语言模型能够与外部工具、API 和知识库交互。如果用户的查询需要训练数据以外的信息或行动,模型可以决定调用外部函数,获取信息或执行操作。

例如,用户问“巴黎现在天气如何?”。单独的大语言模型无法准确回答,因为它不能直接访问实时天气。借助函数调用,模型可以识别出需要使用天气 API,生成包含正确参数(城市“Paris”)的函数调用,再利用返回数据作答。

这项能力让模型从文本生成器变成能够与现实世界交互的智能体。

函数调用如何支持智能体?

函数调用流程

大语言模型智能体主要依靠工具调用与推理两种能力处理复杂任务。它们可以借此使用外部工具、连接 MCP(模型上下文协议)服务器,并访问知识库。

函数调用的过程如下:

  1. 用户查询:用户向智能体发送请求,例如“巴黎现在天气如何?”。
  2. 组装上下文:系统消息、工具定义和用户消息共同组成发送给模型的上下文。
  3. 决定是否调用工具:模型分析上下文;如果需要工具,则输出结构化请求,指出工具名称及参数。
  4. 执行工具:开发者的程序接收请求并执行实际函数,例如访问天气 API。
  5. 观察结果:工具返回结果,在智能体术语中称为“观察”。
  6. 生成回答:观察结果连同先前消息一起交回模型,模型据此生成最终回答。

关键在于,在这个流程中,模型需要获得对话中已经发生的相关信息。上下文使智能体能够判断下一步行动,并把工具结果融入最终回答。

工具定义的作用

工具定义可以说是函数调用最关键的组成部分。模型依靠它知道哪些工具可用,以及何时使用。

工具定义通常包括:

  • 名称:清晰的函数标识符。
  • 描述:说明工具的功能和使用时机。
  • 参数:函数接受的输入,以及输入的类型和说明。

下面是天气工具定义的示例:

python
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location. Use this when the user asks about weather conditions in a specific city or region.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "The temperature unit to use"
                    }
                },
                "required": ["location"]
            }
        }
    }
]

description 字段尤其重要,它既说明工具能做什么,也说明何时该使用。工具越多,清晰而具体的描述对正确选择工具就越重要。

提示

工具定义会成为每次模型调用的上下文,因而消耗词元,并影响成本和延迟。描述应兼顾简洁与信息量。

智能体循环:行动与观察

理解智能体循环是调试和优化的基础。循环包含反复执行的四个环节:

  1. 行动:智能体决定采取行动,即调用工具。
  2. 环境响应:外部工具或 API 返回结果。
  3. 观察:智能体接收并处理结果。
  4. 决策:决定继续行动,还是直接回复用户。

以用户询问“OpenAI 的最新消息”为例,原文流程如下:

User: "Latest news from OpenAI"

Agent thinks: I need current information about OpenAI news.
              I should use the web_search tool.

Action: web_search(query="OpenAI latest news announcements")

Observation: [Search results with recent OpenAI articles...]

Agent thinks: I now have the information needed to answer.
              Let me summarize these results for the user.

Response: "Here are the latest updates from OpenAI..."

观察就是环境在智能体行动之后返回的信息,本例中的环境是搜索引擎或 API。观察会进入下一轮上下文,使智能体能够利用已有发现继续工作。

在复杂场景中,回答一个问题可能需要多次工具调用。每次调用都会补充上下文,智能体利用逐渐积累的信息决定下一步。

调试函数调用

构建智能体时,难免遇到行为不符合预期的情况:调用错误工具、传错参数,或者应该调用工具时却没有调用。此时,理解函数调用的内部流程就很有帮助。

在 n8n 等工作流自动化工具中,可以启用“Return Intermediate Steps”(返回中间步骤),查看:

  • 调用了哪些工具:工具调用顺序。
  • 传入了哪些参数:每次调用的准确参数。
  • 收到哪些观察结果:工具的返回内容。
  • 词元用量:每一步消耗多少词元。

研究型查询的中间步骤可能如下:

json
{
  "intermediateSteps": [
    {
      "action": {
        "tool": "web_search",
        "toolInput": {
          "query": "OpenAI latest announcements 2025"
        }
      },
      "observation": "1. OpenAI announces new reasoning model... 2. GPT-5 rumors surface..."
    },
    {
      "action": {
        "tool": "update_task_status",
        "toolInput": {
          "taskId": "search_1",
          "status": "completed"
        }
      },
      "observation": "Task updated successfully"
    }
  ]
}

这些信息对调试非常重要。如果结果有误,可以沿执行步骤定位问题。常见问题包括:

  • 工具选择错误:模型选用了不适合任务的工具。
  • 参数错误:传入的参数不正确或不完整。
  • 上下文不足:工具定义没有提供足够指引。
  • 观察处理错误:模型误解了工具返回的信息。

提示

某些平台的抽象层不会暴露完整提示词上下文。调试时应尽量查看原始 API 调用,确认模型实际接收了什么。

工具定义的实践建议

描述要具体。

与其只写“搜索网页”,不如写“搜索网页中的最新信息。当用户询问近期事件、新闻,或训练后可能发生变化的数据时使用”。

在系统提示词中补充使用场景。

虽然工具定义已有描述,但系统提示词中明确说明工具的使用时机和方法,可以提供额外上下文。这看起来有所重复,却有助于模型作出更好的决策,尤其是在多个工具同时可用时。

You have access to the following tools:
- web_search: Use this for any questions about current events or recent information
- calculator: Use this for mathematical calculations
- knowledge_base: Use this to search internal documentation

Always prefer the knowledge_base for company-specific questions before using web_search.

明确参数约束。

可行时使用枚举限制参数值,并在描述中提供示例,引导模型。

python
"unit": {
    "type": "string",
    "enum": ["celsius", "fahrenheit"],
    "description": "Temperature unit. Use 'celsius' for most countries, 'fahrenheit' for US."
}

妥善处理工具失败。

工具应返回有信息量的错误消息,帮助智能体恢复,或尝试替代方案。

python
def search_database(query: str) -> str:
    results = db.search(query)
    if not results:
        return "No results found for this query. Try broadening your search terms or using alternative keywords."
    return format_results(results)

原文课程信息

本文基于《使用 n8n 构建有效的 AI 智能体》,提供构建和调试智能体系统的实操经验。原文优惠码 PROMPTING20 可额外优惠 20%,有效性以课程方说明为准。

函数调用连接了模型推理与现实行动。理解工具定义如何影响决策、循环如何处理行动与观察,以及如何调试完整流程,有助于构建能够有效利用外部工具解决复杂问题的可靠智能体。

ChatGPT 中文使用指南 · MIT 许可 · 隐私政策