外观
AI 智能体中的函数调用
函数调用也称工具调用,是现代大语言模型智能体的核心能力之一。理解函数调用的内部工作方式,有助于构建有效的智能体,并在出错时进行调试。
本文内容
什么是函数调用?
函数调用让大语言模型能够与外部工具、API 和知识库交互。如果用户的查询需要训练数据以外的信息或行动,模型可以决定调用外部函数,获取信息或执行操作。
例如,用户问“巴黎现在天气如何?”。单独的大语言模型无法准确回答,因为它不能直接访问实时天气。借助函数调用,模型可以识别出需要使用天气 API,生成包含正确参数(城市“Paris”)的函数调用,再利用返回数据作答。
这项能力让模型从文本生成器变成能够与现实世界交互的智能体。
函数调用如何支持智能体?

大语言模型智能体主要依靠工具调用与推理两种能力处理复杂任务。它们可以借此使用外部工具、连接 MCP(模型上下文协议)服务器,并访问知识库。
函数调用的过程如下:
- 用户查询:用户向智能体发送请求,例如“巴黎现在天气如何?”。
- 组装上下文:系统消息、工具定义和用户消息共同组成发送给模型的上下文。
- 决定是否调用工具:模型分析上下文;如果需要工具,则输出结构化请求,指出工具名称及参数。
- 执行工具:开发者的程序接收请求并执行实际函数,例如访问天气 API。
- 观察结果:工具返回结果,在智能体术语中称为“观察”。
- 生成回答:观察结果连同先前消息一起交回模型,模型据此生成最终回答。
关键在于,在这个流程中,模型需要获得对话中已经发生的相关信息。上下文使智能体能够判断下一步行动,并把工具结果融入最终回答。
工具定义的作用
工具定义可以说是函数调用最关键的组成部分。模型依靠它知道哪些工具可用,以及何时使用。
工具定义通常包括:
- 名称:清晰的函数标识符。
- 描述:说明工具的功能和使用时机。
- 参数:函数接受的输入,以及输入的类型和说明。
下面是天气工具定义的示例:
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 字段尤其重要,它既说明工具能做什么,也说明何时该使用。工具越多,清晰而具体的描述对正确选择工具就越重要。
提示
工具定义会成为每次模型调用的上下文,因而消耗词元,并影响成本和延迟。描述应兼顾简洁与信息量。
智能体循环:行动与观察
理解智能体循环是调试和优化的基础。循环包含反复执行的四个环节:
- 行动:智能体决定采取行动,即调用工具。
- 环境响应:外部工具或 API 返回结果。
- 观察:智能体接收并处理结果。
- 决策:决定继续行动,还是直接回复用户。
以用户询问“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%,有效性以课程方说明为准。
函数调用连接了模型推理与现实行动。理解工具定义如何影响决策、循环如何处理行动与观察,以及如何调试完整流程,有助于构建能够有效利用外部工具解决复杂问题的可靠智能体。