抛弃 Function Calling 拥抱 Unix 命令行
前Meta技术负责人主张:用Unix命令行替代复杂Function Calling构建AI Agent,因其更符合LLM思维模式,通过渐进式帮助、导航式报错和分层架构实现高效交互。
在人工智能代理(AI Agent)的开发领域,Function Calling(或 Tool Calling)长期以来被视为构建智能工具使用能力的标准范式。然而,一位拥有深厚实战经验的技术专家却提出了一个颠覆性的观点:我们可能一直在走弯路。
前 Meta 旗下公司 Manus 的后端技术负责人 Morro Hsu,在深度构建 AI Agent 两年之后,得出了一个足以让许多开发者重新审视其技术栈的结论:是时候放弃复杂的 Function Calling 了。取而代之的,是一个极其简单却异常强大的工具:一个能够执行 Unix 命令行的 run(command="...") 函数。
主流范式与反直觉的洞察
当前,OpenAI、Google 等巨头在其官方文档与 API 设计中,无不推崇精细化的、结构化的 Function Calling。开发者们普遍认为,为 AI Agent 配备一个庞大、分类清晰、接口明确的专用工具库,是提升其能力的不二法门。这种思路催生了诸如 read_file()、filter_lines()、count_items() 等一系列原子化工具。
但 Hsu 的实践揭示了一个被忽略的真相:大型语言模型(LLM)在其预训练阶段,早已消化了海量的代码与系统交互数据,其中自然包括数十亿行涉及 Unix Shell 命令的文本。对于 LLM 而言,grep、awk、sed、find 这些命令的语法和语义,可能比我们人为设计的 JSON 格式函数调用接口更为“原生”。当你需要完成“读取日志文件,筛选出错误行,并计算其总数”这个任务时,LLM 更自然的“思考”方式可能是生成一行命令:grep -c "ERROR" app.log,而非发起三次离散的、结构化的函数调用。
超越 CLI:一套为 AI 设计的交互哲学
Hsu 提出的方案远非简单地“让 AI 执行 Shell 命令”。他将这套模式提炼为一种“启发式设计”哲学,其核心包含三个精妙的工程要点。
首先是 渐进式 --help 发现机制。传统的 Agent 设计通常需要在一开始就将所有工具的详细说明文档加载到上下文(Context)中,这极大地消耗了宝贵的 Token 限额。Hsu 的设计则模拟了人类使用命令行时的学习过程:Agent 可以先尝试运行 memory(一个假设的命令),当系统返回“命令未找到”或简要用法提示时,Agent 可以接着尝试 memory --help 或 memory search 来探索更具体的功能。这种按需探索的方式,使得 LLM 能够高效地动态学习工具集,而非背负全部文档的重担。
其次是 将错误信息转化为导航指引。在传统命令行中,错误信息(stderr)往往是晦涩且终止性的。例如,用 cat 命令查看一张图片只会得到“cat: binary file”这样的报错。Hsu 对其进行了改造,让错误信息变得具有指导性。系统可能会返回:[error] cat: binary image file. Use: see photo.png。这相当于直接告诉 Agent:“你用的工具不对,试试另一个。” Hsu 分享了一个反面案例:由于标准错误流被静默处理,一个 Agent 在尝试安装软件包时,盲目地在 pip、uv、apt 等命令间重复失败了十几次,浪费了大量计算资源与时间。这个案例凸显了 stderr 是 Agent 最需要的信息 这一深刻洞见。
最后,也是最关键的一点,是 执行层与表现层的分离架构。这是保障系统鲁棒性和效率的工程基石。执行层严格遵循 Unix 哲学,保证数据通过管道(Pipe)时是无损且高效的。而表现层则专门为 LLM 的“阅读”体验而优化:它会自动截断过长的输出并告知完整内容的位置,将二进制文件(如图片)替换为友好的提示文本,并在每条命令结果后附加如 [exit:0 | 12ms] 的元数据。这种分层设计有效防止了无意义的二进制数据或冗长日志污染 LLM 的上下文窗口,同时让 Agent 能够逐渐“感知”每个命令的执行耗时与状态,学会评估操作成本。
Shell 作为超集:一种工程上的返璞归真
这一设计思路的终极目标,并非给 Agent 一个完整的、不受限制的 Linux 系统权限。其精髓在于,使用 LLM 最熟悉、最原生的“语言”与之沟通。正如 Hsu 在讨论中所强调的:Shell 是超集。你永远可以轻松地从 Shell 环境中调用一段 Python 或任何其他语言的代码来完成特定任务;但若试图在一个纯 Python 函数调用环境中去模拟 Shell 命令的灵活性与组合能力,无异于舍近求远,自我设限。
这篇分享的价值,在于它将一个看似“技术倒退”的选择——用诞生已五十年的命令行界面替代时髦的 Function Calling——提升为一种更符合 AI 本质的设计哲学。它没有停留在表面比较,而是深入剖析了其底层优势:与训练数据的高度吻合、命令之间无与伦比的可组合性,并给出了使之高效工作的工程实践:渐进式帮助、导航式报错和分层架构。这无疑为那些仍在纠结于如何设计“完美工具库”的开发者们,提供了一条清晰而高效的路径。这是一种基于深刻理解的、工程意义上的返璞归真。
原文链接: 前Meta收购公司Manus的后端技术负责人,在构建AI Agent两年后得出结论:别再用复杂的Function Calling了。




