跳转到正文
技术教程·

Function Calling 教程:用工具调用搭建可执行 AI 助手

Function Calling 教程:从工具定义到多轮调用,手把手教你让大模型调用外部函数、查询数据库和执行操作,搭建真正能做事的 AI 助手。

这篇教程适合你吗

你已经用过 OpenAI 或 Claude 的 API 做基础对话,现在想让模型真正「做事」——查天气、搜数据库、调接口、执行操作。Function Calling 就是干这个的。

不适合:完全没写过 API 调用代码的读者。建议先看 OpenAI API 教程最终产物:一个能让大模型自动调用外部函数的完整代码示例。

环境假设

  • Python 3.9+
  • OpenAI API Key
  • 以当前常见版本为准

> 合规提醒:使用 OpenAI 等海外 API 服务时,请遵守所在地法律法规和服务条款。如遇网络连接不稳定,可参考我们的海外 AI 工具使用指南

Function Calling 的核心思想

传统 API 调用是「你告诉程序做什么」,Function Calling 是「你告诉大模型有哪些工具,它自己决定用哪个」。

用户: "北京今天天气怎么样?"

大模型: 判断需要调用 get_weather 工具,参数 city="北京"

你的代码: 执行 get_weather("北京"),拿到结果

大模型: 根据结果生成自然语言回答

第一步:定义工具

先告诉模型你有哪些工具可用。工具用 JSON Schema 描述:

tools = [

{

"type": "function",

"function": {

"name": "get_weather",

"description": "查询指定城市的当前天气信息",

"parameters": {

"type": "object",

"properties": {

"city": {

"type": "string",

"description": "城市名称,例如 北京、上海"

},

"unit": {

"type": "string",

"enum": ["celsius", "fahrenheit"],

"description": "温度单位,默认摄氏度"

}

},

"required": ["city"]

}

}

}

]

关键description 写得越清晰,模型越能准确判断何时调用。这是 Function Calling 效果好坏的核心。

第二步:发送请求

from openai import OpenAI

client = OpenAI() # 自动读取 OPENAI_API_KEY 环境变量

response = client.chat.completions.create(

model="gpt-4o",

messages=[{"role": "user", "content": "北京今天天气怎么样?"}],

tools=tools,

tool_choice="auto" # 让模型自动决定是否调用

)

第三步:处理工具调用

模型不会直接调用你的函数——它只是返回「我想调用这个函数,参数是这些」。你需要自己执行:

import json

message = response.choices[0].message

# 检查模型是否要求调用工具

if message.tool_calls:

for tool_call in message.tool_calls:

function_name = tool_call.function.name

arguments = json.loads(tool_call.function.arguments)

if function_name == "get_weather":

# 这里是你真正执行函数的地方

result = get_weather(arguments["city"], arguments.get("unit", "celsius"))

print(f"天气结果: {result}")

注意:模型返回的是「调用请求」,不是执行结果。你必须自己实现函数逻辑,然后把结果返回给模型。

第四步:把结果返回给模型

拿到工具执行结果后,再发一次请求让模型生成最终回答:

# 把工具结果添加到对话历史

messages.append(message) # 模型的 tool_calls 消息

messages.append({

"role": "tool",

"tool_call_id": tool_call.id,

"content": json.dumps({"city": "北京", "temp": 28, "condition": "晴"})

})

# 再次请求,让模型基于工具结果生成回答

final_response = client.chat.completions.create(

model="gpt-4o",

messages=messages

)

print(final_response.choices[0].message.content)

# → "北京今天天气晴朗,气温 28°C,适合外出。"

完整流程总结

定义 tools → 发送请求 → 模型返回 tool_calls → 你执行函数 → 把结果返回 → 模型生成最终回答

这就是一个完整的 Function Calling 循环。

多工具场景

实际项目中通常定义多个工具。模型会根据用户意图自动选择:

tools = [

{"type": "function", "function": {"name": "get_weather", "description": "查天气", ...}},

{"type": "function", "function": {"name": "search_web", "description": "搜索网页", ...}},

{"type": "function", "function": {"name": "send_email", "description": "发邮件", ...}},

]

用户说「帮我搜一下最新的 AI 新闻」→ 模型自动选择 search_web

用户说「给张三发封邮件」→ 模型自动选择 send_email

Claude 的 Function Calling

Claude 的工具调用逻辑类似,但 API 格式不同:

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(

model="claude-sonnet-4-20250514",

max_tokens=1024,

tools=[{

"name": "get_weather",

"description": "查询指定城市的当前天气信息",

"input_schema": {

"type": "object",

"properties": {

"city": {"type": "string", "description": "城市名称"}

},

"required": ["city"]

}

}],

messages=[{"role": "user", "content": "北京天气怎么样?"}]

)

# 检查 stop_reason 是否为 tool_use

for block in response.content:

if block.type == "tool_use":

print(f"调用工具: {block.name}, 参数: {block.input}")

> 合规提醒:使用 Anthropic Claude API 时请遵守 Anthropic 的服务条款。API 服务的可用性和定价可能因地区不同而有所变化。

常见问题与排错

模型不调用工具

原因:工具描述不够清晰,模型不确定何时使用。 解决:在 description 中明确说明「在什么场景下使用这个工具」,而不是只写工具名。

模型调用了错误的工具

原因:多个工具的功能描述有重叠。 解决:让每个工具的职责边界更清晰。如果两个工具确实容易混淆,考虑合并成一个。

参数格式错误

原因parameters 的 JSON Schema 定义不够严格。 解决:善用 enumrequireddescription 约束参数,减少模型自由发挥的空间。

进阶学习

总结

  • Function Calling 让大模型自动决定调用哪个工具
  • 你定义工具接口,模型负责理解和调用,你负责执行
  • 关键是写好工具的 description,让模型准确理解何时使用
  • 可以定义多个工具,模型根据用户意图自动选择

---

本文最后更新于 2026-07-27。代码示例基于当前常见版本,请根据最新 API 文档调整。

保障 API 调用稳定性

调用 OpenAI、Anthropic 等海外 API 时,网络波动可能导致请求超时或失败。稳定的网络环境有助于提升开发效率。

⚠️ 请遵守所在地的法律法规和服务条款。使用 AI API 时请遵守各平台的使用政策。

了解安全上网方案 →

常见问题

相关推荐

获取更多 AI 内容

订阅更新,第一时间获取新教程和工具推荐。