转载--AI Agent 架构设计:工具返回值设计(OpenClaw、Claude Code、Hermes Agent 对比)

原文:https://mp.weixin.qq.com/s?__biz=MzkzMTEzMzI5Ng==&mid=2247496776&idx=1&sn=5fdeadb256ab6905c9334672b9634c69&chksm=c26d1657f51a9f41954bc52ec73e443816990cb0a1fda28a6370e9b882c883d0b65bb9db635e&cur_album_id=4419773328652107782&scene=189#wechat_redirect

工具执行完了,麻烦才刚开始

工具调用成功了,返回了结果。

但这个结果现在要进入上下文。从这一刻起,它会占据上下文里的一块空间,在后续所有推理里被模型"看到"------直到这个 Session 结束,或者被 Compaction 压缩掉。

如果返回值设计得不好,它会持续地污染后续的推理:

返回太长:5 万字的日志全量注入上下文,关键信息被淹没,Lost in the Middle 问题加剧,Token 成本暴涨,后续每次调用都带着这 5 万字作为"包袱"。

返回太短:只返回"成功"或者一个 ID,模型不知道接下来该怎么做,下一步推理质量下降,甚至会再次调用工具来获取本来应该一起返回的信息。

返回格式不对:模型对 JSON、XML、Markdown 的处理能力不同。格式不对,模型理解效率低,也可能产生解析错误。

错误消息太抽象:工具失败了,只返回"Error 500",模型不知道原因,不知道怎么修,可能会盲目重试或者换一个错误的方向继续。

返回值设计,是工具设计里最容易被忽视、但影响最持久的部分。

Anthropic 的官方建议:25,000 Token 上限

Anthropic 在工具设计指南里给出了明确的数字:

Claude Code 默认把工具返回值限制在 25,000 Token 以内。

这不是随意设定的数字。Anthropic 的理由是:

"优化上下文质量很重要,但优化工具返回给 Agent 的上下文数量同样重要。我们建议对任何可能消耗大量上下文的工具返回值,实现分页、范围选择、过滤、截断的某种组合,并设置合理的默认参数。"

25,000 Token 大约是 2 万字------够模型做出合理判断的信息量,但不会撑爆上下文。

重要的是:这个限制预计会随着上下文窗口的增大而调整,但"需要上下文高效的工具"这个需求不会消失。 上下文窗口扩大,不是"可以随便返回大量数据"的理由,而是"可以处理更复杂任务"的能力扩展。

错误返回值:比成功返回值更重要

工具失败了,返回的错误消息是模型决策的唯一依据。

一个真实的案例:Anthropic 发布 Claude 的网页搜索工具时,发现模型会在搜索查询里无缘无故加上"2025",导致搜索结果出现年份偏差。修复方法不是改模型,而是改工具描述------在描述里明确说明"不要在查询里添加年份约束,除非用户明确要求"。

这说明工具的返回值和描述,会系统性地塑造模型的行为。 一个工具的设计问题,会在每次调用这个工具的任务里反复出现。

三个框架对返回值设计的不同态度

Claude Code:50K 外部化是架构级保护

Claude Code 对超长返回值有一个框架级别的保护机制:

当工具调用返回内容超过 50,000 字符,自动触发外部化------完整内容写入临时文件,上下文里只注入约 2KB 的摘要和文件引用。模型需要更多细节时,通过文件读取工具按需获取。

复制代码
工具返回 100,000 字符的日志    ↓超过 50,000 字符阈值    ↓完整内容写入 /tmp/tool_output_xxx.txt    ↓上下文注入:"工具返回了大量输出,已保存到 tool_output_xxx.txt。摘要:发现 127 条 ERROR 级别日志,主要集中在 14:30-15:00。如需查看完整输出,使用 read_file 工具读取文件。"

这个机制保护了主上下文不被单次工具调用撑爆,同时给了模型继续工作的信息(摘要)和获取更多信息的路径(文件引用)。

OpenClaw:无架构级保护,依赖 Skill 作者

OpenClaw 没有类似 Claude Code 的 50K 外部化机制。

工具返回什么、返回多少,完全由 Skill 作者决定。如果 Skill 作者没有实现分页和截断,工具可能返回几十万字的原始内容,全部注入上下文,没有任何自动保护。

ClawHub 上工具返回值设计的质量参差不齐。有质量好的 Skill,会在工具描述里明确说明返回值大小限制和分页参数;也有质量差的 Skill,直接暴露底层 API 的原始输出,没有任何裁剪。

Hermes:内置工具设计合理,execute_code 是特殊路径

Hermes 的 40+ 内置工具,大多数遵循了合理的返回值设计:有限制最大返回量、支持分页参数、错误消息有基本的可读性。

Hermes 最有特色的是 execute_code 工具------模型可以写脚本来处理数据,脚本的输出作为工具返回值。

原始日志可能有 10 万行,但脚本只返回了几十个 Token 的摘要。 模型"看到"的是处理结果,不是原始数据。这本质上是把"数据处理"放在了工具里,而不是让模型来处理原始数据。

这也是 Hermes 处理长文档的推荐方式(第二十七篇讲过的):对于结构化数据,让 execute_code 处理,返回摘要;对于非结构化内容,才考虑直接读取。

返回值是工具和模型之间的对话

工具的返回值,不只是"给了模型一个结果"。它是工具在告诉模型:

"发生了什么"------操作的结果。

"还有什么可以做"------分页提示、相关工具建议。

"如果出错了,下一步怎么办"------可操作的错误说明。

设计得好的返回值,让模型每次读完都知道接下来该做什么。设计得差的返回值,让模型每次都要在大量噪音里找信号,或者因为信息不足而做出错误决策。

Anthropic 在指南里说的那句话,在返回值设计这里同样适用:

"工具设计和 prompt 工程一样,需要同等程度的投入。"

工具能调出什么,往往被高估。工具返回什么、怎么返回,往往被低估。但后者对 Agent 稳定性的影响,一点都不亚于前者。

相关推荐
windawdaysss1 小时前
离线学习SQL和数据库的工具及其部署
数据库·sql·学习
Rubin智造社1 小时前
Claude Code开发者大会系列8:从脚本到智能体——独立开发者的“AI原生”工作流转型
数据库·人工智能·独立开发者·agentic工作流·ai原生开发·实操指南
一条泥憨鱼1 小时前
深入理解 MySQL 索引:原理、分类与优化实战
数据库·mysql
楠枬1 小时前
Redis 缓存
数据库·redis·缓存
一条泥憨鱼1 小时前
详解MySQL事务(超详细版)
java·数据库·mysql·spring·maven·后端开发
j7~1 小时前
【MYSQL】 数据库的常见数据类型--详解
数据库·mysql·decimal·varchar·数据库的基本类型
星星也在雾里11 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
雨辰AI12 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202413 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列