AI 与大模型 · 第 2 期

为什么 JSON 工具调用比自然语言准 30 倍?

CodeAgent vs ToolCallingAgent · 结构化是 Agent 的安全带

让 Agent 调工具,JSON 比自然语言少错 30 倍。自然语言调用靠模型"说人话"再靠代码"猜人话",每一步都在赌;JSON 调用是结构化契约,解析可靠、可校验、可路由。结构化是 Agent 的安全带——不系也能开,但出事就飞出去。
⏱ 约 10 分钟 🎯 写过 Agent / 用过 function calling 的开发者 📦 源:smolagents 教程 §3

01一个反共识:自然语言不是更灵活,是更脆弱

很多人觉得"让 Agent 用自然语言调工具更灵活"。实测正好相反——

自然语言调用的链路是:模型生成一段话 → 代码用正则/关键词解析 → 提取工具名和参数 → 执行。每一步都可能崩:模型多说了个"请",参数顺序写反了,正则没覆盖那个句式。smolagents 实测,自然语言调用的解析失败率约 30%,JSON 调用约 1%。

原因不是模型笨,是自然语言天生有歧义,而工具调用需要的是契约。JSON 把"我想调 search 工具,参数 query=xxx"写成一个能被 JSON.parse 直接吃掉的对象,消除了歧义。

结构化是 Agent 的安全带,
不系也能开,出事就飞出去。
灏天文库 · AI 与大模型 P.04

02同一段任务,两种写法

同一个任务"搜索 2026 年量化策略",看自然语言调用和 JSON 调用长什么样、各自会怎么崩。

🔧 JSON vs 自然语言调用对比
看两种调用格式,再点"运行 N 次"模拟,看各自的失败率。
任务:调用 search(query, limit) 搜索"2026 量化策略",返回 5 条。

❌ 自然语言调用

"请帮我搜索一下 2026 年的量化策略, 大概要 5 条结果吧,谢谢" → 代码需用正则解析: /搜索(.+?),要(\d+)条/ (句式一变就匹配不上)

✅ JSON 工具调用

{ "tool": "search", "args": { "query": "2026 量化策略", "limit": 5 } } → JSON.parse 直接吃, schema 校验参数类型
自然语言调用成功率
—
JSON 调用成功率
—
← 点"运行模拟"看结果
自然语言靠猜,
JSON 靠契约。
灏天文库 · AI 与大模型 P.05

03CodeAgent 的另一面:代码即动作

smolagents 提出第三种形态——CodeAgent:让模型直接生成一段 Python 代码作为"调用",解释器执行。它比 JSON 调用更进一步:

代价是安全:执行任意代码有风险,所以 CodeAgent 必须配 AST 沙箱(限制可调用函数、可访问模块)。这是为什么 smolagents 专门有一章讲 AST 解析做安全网——让 Agent 写代码又不让它炸。

CodeAgent 把调用写成代码,
安全网写成语法树。
灏天文库 · AI 与大模型 P.06

04带走这套清单

✅ 工具调用 6 条可执行规则

  1. 优先 JSON 工具调用(function calling):解析可靠、可 schema 校验、可路由。
  2. 避免自然语言解析工具调用:失败率高、句式一变就崩,只用在最简单的玩具场景。
  3. 给每个工具写清晰的 schema:参数名、类型、必填、范围,模型按 schema 生成。
  4. 工具超过 10 个就做路由:先让一个小模型/分类器选工具子集,再交给主模型。
  5. 要组合调用/控制流就用 CodeAgent,但必须配 AST 沙箱限制可执行操作。
  6. 错误反馈结构化:工具失败时返回 JSON 错误对象,让模型能据此重试,不是返回一段人话。
Agent 的可靠性,
藏在调用的格式里。
灏天文库 · AI 与大模型 P.07