CodeAgent vs ToolCallingAgent · 结构化是 Agent 的安全带
很多人觉得"让 Agent 用自然语言调工具更灵活"。实测正好相反——
自然语言调用的链路是:模型生成一段话 → 代码用正则/关键词解析 → 提取工具名和参数 → 执行。每一步都可能崩:模型多说了个"请",参数顺序写反了,正则没覆盖那个句式。smolagents 实测,自然语言调用的解析失败率约 30%,JSON 调用约 1%。
原因不是模型笨,是自然语言天生有歧义,而工具调用需要的是契约。JSON 把"我想调 search 工具,参数 query=xxx"写成一个能被 JSON.parse 直接吃掉的对象,消除了歧义。
同一个任务"搜索 2026 年量化策略",看自然语言调用和 JSON 调用长什么样、各自会怎么崩。
smolagents 提出第三种形态——CodeAgent:让模型直接生成一段 Python 代码作为"调用",解释器执行。它比 JSON 调用更进一步:
result = search(q1) + search(q2),不用来回多轮。if/for,工具调用之间能做条件分支。代价是安全:执行任意代码有风险,所以 CodeAgent 必须配 AST 沙箱(限制可调用函数、可访问模块)。这是为什么 smolagents 专门有一章讲 AST 解析做安全网——让 Agent 写代码又不让它炸。