乐于分享
好东西不私藏

AI agent 工具调用实战 SOP:让大模型学会调工具

AI agent 工具调用实战 SOP:让大模型学会调工具

🔗 推广:aiwebcool.com - 最硬核的 AI 工具指南网站,挑工具前先来这查一眼

实战SOP

AI agent 工具调用实战 SOP:让大模型学会调工具

发布于 2026年8月9日 · 9 分钟阅读

大模型能写诗、能推理、能翻译,但你问它「SKU-8821 现在还有多少库存」,它只能编一个数字。训练数据里没有你的实时业务数据,模型的「知识」停留在训练截止那天。要让 agent 真正干活--查数据库、调 API、读文件、下订单--靠的不是更大的上下文窗口,而是一套让模型「会调工具」的机制:function calling(OpenAI 叫法)或 tool use(Anthropic 叫法)。这篇 SOP 给你一个可复制的实现模板,代码基于官方文档核实(截至 2026-08-09),四步循环跑通。

一句话定位:模型不执行代码,它只产出「调哪个工具、传什么参数」的意图。真正执行的是你的应用代码。这个分工是工具调用安全的基石--模型不会偷偷 rm 你的数据库,除非你写了这样的工具还告诉它可以用。

一、四步循环:模型决策 -> 执行 -> 回填

工具调用的本质,是让大模型学会「我不懂,但我找懂的人来办」。整套机制拆成四步,先看流程表把全局装进脑子:

步骤
谁来做
做什么
关键字段
① 定义 schema
你(开发者)
用 JSON Schema 描述工具有哪些、吃什么参数
name / description / parameters
② 模型决策
大模型
结合用户指令和工具列表,决定调哪个、传什么参数
tool_calls / tool_use
③ 执行
你的代码
真正查数据库、调 API、读文件,拿真实结果
你的业务函数
④ 回填结果
你的代码 + 模型
把结果塞回对话,模型据此生成最终回答或再调一轮
tool_call_id / tool_use_id

关键认知:模型只产出结构化的「调用意图」,不真正执行。你的应用代码才是执行者。`tool_call_id`(OpenAI)或 `tool_use_id`(Anthropic)是调用与结果的关联键,千万别丢。

二、OpenAI function calling 代码模板

OpenAI 当前有两条 API 路径:Chat Completions(经典,仍在用)和 Responses(新一代,带会话状态)。下面以 Chat Completions 为主示例。注意:早期 2023 年的 `functions`/`function_call`(单数)参数已废弃,当前统一用 `tools`/`tool_choice`(复数),别再抄老教程。

// 1. 定义工具 schema(Chat Completions 包一层 function) const tools = [{   type: "function",   function: {     name: "check_inventory",     description: "查询某 SKU 的当前库存数量与仓库。",     parameters: {       type: "object",       properties: {         sku: { type: "string", description: "商品 SKU 编码" },         warehouse: { type: "string", enum: ["beijing","shanghai","guangzhou"] }       },       required: ["sku"]     }   } }];  // 2. 模型决策:带上 tools 发请求 const resp = await openai.chat.completions.create({   model: "gpt-5.6",   messages,   tools,   tool_choice: "auto"  // auto|none|required|指定函数 });  // 3. 执行:模型决定调用 check_inventory const msg = resp.choices[0].message; if (msg.tool_calls?.length) {   messages.push(msg);   for (const call of msg.tool_calls) {     const args = JSON.parse(call.function.arguments);     const result = await checkInventory(args.sku, args.warehouse);     // 4. 回填结果,用 tool_call_id 关联     messages.push({       role: "tool",       tool_call_id: call.id,       content: JSON.stringify(result)     });   }   // 5. 模型拿到结果生成最终回答   const final = await openai.chat.completions.create({ model:"gpt-5.6", messages, tools });   console.log(final.choices[0].message.content); }

Anthropic 的 tool use 思路一致,四处 API 差异:schema 字段叫 `input_schema`(不是 `parameters`);工具直接平铺不外包 `function`;结果回填的 role 是 `"user"`、content 是 `tool_result` block(OpenAI 用 `role:"tool"`);`tool_use.input` 已是 dict 不用 JSON.parse。

三、五个踩坑与修法

坑1schema 太松致参数幻觉:description 模糊、参数全 string、没 enum,模型就编参数(如编出 `warehouse:"wuhan"` 而你没这仓)。修法:每个参数写清 description,枚举值用 enum,开 `strict:true`。

坑2模型编造参数值:把用户随口说的「那个商品」填成 `sku:"that-product"`。修法:system prompt 写「缺 SKU 先问用户,不要猜测」;或加 `search_product` 模糊搜索工具让模型先搜后查。

坑3不处理调用失败,agent 卡死:模型调工具你的代码抛异常没回填,下一轮缺 `tool_result` 直接报错。这是最常见的线上事故。修法:所有工具执行包 try/except,失败也回填 `is_error:true` 的结果让模型自己决定。

坑4无超时和循环上限:模型反复调慢工具或陷入失败-重试死循环。修法:每个工具加超时(10-30s),整个 agent 循环加最大轮次(5-10 轮),超限强制返回兜底回答。

坑5工具太宽安全失控:给个 `execute_sql(query)` 模型可能拼 `DROP TABLE`。用 `check_inventory(sku,warehouse)` 而非 `run_any_sql(sql)`,写操作务必加权限校验和二次确认。

和 MCP 什么关系?互补。MCP 是「标准化工具层」--定义工具怎么被发现、被传输;function calling / tool use 是「模型侧决策机制」--定义模型怎么决定调哪个。一个 agent 通常两者都用。详见本站《MCP Server 开发实战 SOP》与《MCP 客户端横评》。

参考来源

 OpenAI Function Calling 官方指南(tools 参数、tool_choice、tool_calls、strict 模式):platform.openai.com Anthropic Tool Use 官方文档(input_schema、tool_use block、tool_result 回填):docs.anthropic.com Model Context Protocol 官网(标准化工具层,与本文模型侧机制互补):modelcontextprotocol.io 

往期推荐 ①《GPT-5.6 Luna 热点》 ②《开源 ego-lite(星9.3k)》 ③《MCP 客户端横评》AI 声明:本文由 AI 辅助生成,经人工审核编辑。代码示例基于官方文档核实,API 以官方为准。互动:你写 agent 工具调用踩过什么坑?schema 怎么设计才不让模型幻觉?评论区聊聊你的实战经验。 

相关学习资料