工具输出 Schema 设计:你的工具响应如何塑造智能体推理
大多数团队在设计 LLM 智能体时,会花大量精力在工具选择和系统提示措辞上。而几乎没有人认真思考工具返回什么内容。这是一个后果不断叠加的错误——因为工具响应的结构决定了智能体能否有效推理、消耗多少上下文窗口,以及产生幻觉解读的频率。
工具输出 schema 设计是基础设施,而非管道细节。设计失误,你的智能体将以表面上像推理问题的方式失败,而根源其实是 schema 问题。
好坏 Schema 之间的推理鸿沟
2026 年初发表的一项对照研究发现,与散文文档相比,基于 schema 的工具接口能减少接口格式错误。但研究同时发现,语义动作质量和超时敏感任务仍是主要失败模式——这意味着良好的 schema 设计不能保证推理成功,但糟糕的 schema 设计会让推理成功成为不可能。
机制很 直接:LLM 是在人类可读文本上训练的下一词预测器。当工具返回 {"uuid": "d3fa...", "mime_type": "image/png"} 时,模型必须在上下文中推断这些值的含义。当返回 {"name": "profile-photo.png", "image_url": "https://..."} 时,模型可以直接推理。这种认知开销差异在多步智能体循环中会不断累积。
字段命名单独来看就比大多数工程师预期的更重要。叫 ts 的字段需要推断,叫 created_at 的字段一目了然。同一个工具的两个响应中,一个用 urgency,另一个用 priority,会打破智能体对第一个响应建立的任何推理模式。
破坏智能体推理的六种反模式
没有语义标签的裸 JSON 对象。 返回原始内部 ID、不透明类型字符串和数据库 UUID 的 API 是为提前知道 schema 的代码设计的,而非为智能体设计。智能体从字段名推断含义,字段名不透明时就会猜测——这些猜测会以幻觉解读的形式出现在下游。
成功响应中隐藏错误。 返回 HTTP 200 但响应体包含 {"status": "error", "message": "Invalid parameter"} 违反了 HTTP 语义,让智能体和处理失败的包装代码都感到困惑。智能体看到工具调用成功,读取响应体,然后卡在调和"调用成功"和"出了什么问题"之间。设计良好的工具响应在结构上不可能混淆成功与失败:正确使用 HTTP 状态码,永远不要把错误信号埋在成功形态的响应中。
模糊的可空性。 字段缺失(不适用)、字段存在且为 null(适用但未知)、字段有值,这三者之间有本质区别。当你的 schema 混淆了这些情况——有时省略字段,有时设为 null,没有文档说明的约定——智能体只能猜测语义,而且在生产中猜错的频率足以造成影响。
过于冗长的响应。 在大多数托管模型上,输出 token 的成本是输入 token 的 4–6 倍,在多轮智能体循环中,上下文成本大致以 n(n+1)/2 增长——而非线性增长。工具响应中每个不必要的字段都是占用推理空间的 token。一个有 20 个工具的服务器,在每次请求时注入 2000–4000 token 的 schema 开销,不管实际调用了哪些工具,都在悄悄降低每个下游推理步骤的质量。分页默认值同样重要:当智能体只需要 5 条结果时,返回 500 条的工具在浪费上下文预算并稀释信号。
信息量不足的响应。 相反的失败同样有害。当智能体需要推理资源状态时,只返回主键的工具要么迫使额外的工具调用(更多延迟、更多 token),要么导致幻觉假设(更多错误)。目标是智能体完成下一推理步骤所需的最少信息——不多不少。
跨响应字段类型不一致。 当某个字段有时是字符串有时是整数,或有时是列表有时是单个值时,智能体为该工具建立的推理模式会不可预测地失效。生产 CRM 集成正是以这种方式失败的:响应形态之间的 schema 漂移在测试中看起来一致,但在真实流量模式下却出现了分歧。
