抛弃Function Calling:用Unix命令行作为AI Agent的原生工具
前Meta收购公司Manus的后端技术负责人分享经验,主张用简单的`run(command)`工具配合Unix命令行替代复杂的Function Calling,并阐述了其背后的启发式设计原则与工程架构。

在 AI Agent 的开发实践中,Function Calling 或 Tool Calling 作为一种主流范式,被广泛用于为大语言模型提供结构化工具调用能力。然而,前 Meta 收购公司 Manus 的后端技术负责人 Morro Hsu 在经历两年构建 AI Agent 的实践后,提出了一个颠覆性的观点:应放弃复杂的 Function Calling,转而采用一个简单的 run(command) 工具,配合 Unix 命令行来驱动 Agent。这一思路挑战了当前依赖庞大、结构化专用工具库的常见做法。
核心内容
Morro Hsu 的核心论点是,大语言模型在数十亿行代码的训练数据中,早已对 Unix 命令行及其组合方式有了深刻理解。因此,使用命令行作为交互接口,比设计大量专用函数更符合 LLM 的“思维模式”。
他将这种基于命令行的模式总结为“启发式设计”,其核心包含三个原则:
- 渐进式
--help发现:Agent 无需在初始阶段加载所有工具的完整文档。它可以像人类用户一样,先调用基础命令(如memory)查看用法,再根据需要探索具体子命令(如memory search)。这种按需探索的方式,能极大节省宝贵的上下文长度。 - 把错误信息当导航:传统的命令行错误信息对 LLM 帮助有限。Hsu 的设计会返回导航式错误信息。例如,当 Agent 错误地使用
cat命令读取图片时,系统会返回[error] cat: binary image file. Use: see photo.png,直接指明下一步操作,避免 Agent 盲目重试。他分享了一个案例:由于标准错误流被静默,一个 Agent 在安装软件包时,在pip、uv、apt等命令间盲目重试了 10 次,浪费了大量时间和 Token。 - 两层架构:这是关键的工程洞察。命令的执行(执行层)与返回给 LLM 的结果(表现层)必须分离。执行层应保持 Unix 管道的原汁原味,确保数据无损传递。而表现层则专门为 LLM 服务,例如自动截断超长输出并告知完整路径、将二进制文件内容替换为提示信息、附加
[exit:0 | 12ms]等执行元数据。这能防止 LLM 的上下文被无关信息污染,并帮助其学习评估每个命令的执行成本。
Hsu 强调,这一思路并非要给 Agent 一个完整的 Linux 系统,而是使用 LLM 最熟悉、最原生的“语言”与之沟通。他指出,Shell 是超集,可以方便地从 Shell 中调用 Python 代码等功能,反之,在纯代码环境中调用 Shell 命令则可能多绕一段路。
价值与影响
这一分享的价值在于,它将一个看似回归传统(用 Unix CLI 替代时髦的 Function Calling)的技术选择,提升为一种更符合 AI 本质的设计哲学。它不仅指出了“CLI 更好用”的现象,更深入剖析了其背后的原因:训练数据的高度吻合、命令的天然可组合性,以及通过渐进式帮助、导航式报错和分层架构来实现“好用”的具体工程方法。其中,“stderr 是 Agent 最需要的信息”和“Shell 是超集”等观点,为许多仍在复杂工具集中寻找最优解的开发者提供了新的视角,体现了一种工程上的返璞归真。
来源:黑洞资源笔记




