函数调用与工具调用实战:让大模型真正「动手」

工具调用原理 · JSON Schema 声明 · 多轮回写 · 可运行示例与排错

核心结论:没有工具调用,大模型只是个「聊天框」;加上工具调用,它才能查数据库、调 API、算数、发消息——从「会说」变成「会做」。

一、工作原理

  1. 你用 JSON Schema 声明可用工具(名称、用途、参数)。
  2. 模型理解用户意图后,输出「调用函数 X,参数 Y」。
  3. 你的代码真正执行该函数,拿到结果。
  4. 把结果回传给模型,模型据此生成最终自然语言答复。

二、最小可运行示例

tools = [{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "查询某城市当前天气",
    "parameters": {
      "type": "object",
      "properties": {"city": {"type": "string"}},
      "required": ["city"]
    }
  }
}]

# 1) 把 tools 随消息提交,模型返回 tool_calls
# 2) 本地执行 get_weather(city)
# 3) 把 {role:"tool", content: 结果} 回传,再让模型总结

三、提升命中率的写法

进阶把多个工具组合,就是 Agent 的雏形:模型自己决定先查哪个、再调哪个,逐步逼近目标。详见AI Agent 入门。

四、常见问题

函数调用(Function Calling)是什么?

它让模型根据对话意图,输出「要调用哪个函数、参数是什么」的结构化指令,由你的代码真正执行后再把结果回传给模型。模型不直接执行函数,只负责「决策与填参」。

怎么告诉模型有哪些工具可用?

用 JSON Schema 描述每个工具的名称、用途与参数类型,随请求一并提交。模型会据此判断何时调用、填什么参数。

为什么模型有时不调用或调错?

常见原因:工具描述不清、参数定义模糊、或系统提示未强调「能查就别猜」。把工具用途和必填参数写精确,命中率会明显提升。

一次能并行调用多个工具吗?

现代接口普遍支持并行/多工具调用。适合互相独立的查询(如同时查天气与汇率),依赖关系的则必须串行回写。

工具调用和 Agent 是什么关系?

工具调用是 Agent 的「手」。Agent 在「规划-调用-观察-再规划」的循环里反复使用工具调用,从而完成多步任务。

模型会乱调收费接口吗?

会。凡是「有副作用」的工具(发消息、下单、删数据)务必加人工确认或权限校验,不要完全自动放行。

中文函数名能用吗?

建议保留英文函数名(兼容性更好),用 description 写清中文用途即可。

AI Agent 入门与框架对比 » · 通用 API 接入 » · Prompt 工程入门 »