
🔗 推广:aiwebcool.com - 最硬核的 AI 工具指南网站,挑工具前先来这查一眼
实战SOPAI agent 工具调用实战 SOP:让大模型学会调工具
发布于 2026年8月9日 · 9 分钟阅读
大模型能写诗、能推理、能翻译,但你问它「SKU-8821 现在还有多少库存」,它只能编一个数字。训练数据里没有你的实时业务数据,模型的「知识」停留在训练截止那天。要让 agent 真正干活--查数据库、调 API、读文件、下订单--靠的不是更大的上下文窗口,而是一套让模型「会调工具」的机制:function calling(OpenAI 叫法)或 tool use(Anthropic 叫法)。这篇 SOP 给你一个可复制的实现模板,代码基于官方文档核实(截至 2026-08-09),四步循环跑通。
一句话定位:模型不执行代码,它只产出「调哪个工具、传什么参数」的意图。真正执行的是你的应用代码。这个分工是工具调用安全的基石--模型不会偷偷 rm 你的数据库,除非你写了这样的工具还告诉它可以用。
一、四步循环:模型决策 -> 执行 -> 回填
工具调用的本质,是让大模型学会「我不懂,但我找懂的人来办」。整套机制拆成四步,先看流程表把全局装进脑子:
关键认知:模型只产出结构化的「调用意图」,不真正执行。你的应用代码才是执行者。`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 怎么设计才不让模型幻觉?评论区聊聊你的实战经验。
夜雨聆风