
工程师借鉴毕加索画牛理念,反思AI Agent构建中的过度复杂化
来源标题:What Picasso taught me about building AI Agents
工程师在构建AI Agent时常陷入堆砌框架、编排引擎与多智能体架构的误区,把基础设施误当成构建有用Agent的关键。作者以毕加索《公牛》11次删繁就简为例,指出随着模型能力提升,单一提示即可完成更多任务,构建Agent应剥离非必要复杂度。
以下正文由 AI 翻译自 Hacker News(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
毕加索有句名言:
“我花了四年时间画得像拉斐尔,却花了一辈子才画得像个孩子。”
他的作品《公牛》完美地体现了这一点。经过 11 次迭代,毕加索逐步剥离公牛身上的细节,直到最后只剩下寥寥几根线条。然而,那头公牛依然一目了然。
在我学习构建 AI agent 的过程中,我深有同感。这件事兜兜转转,又回到了原点。
和许多工程师一样,我从抽象概念和复杂的软件系统入手:框架、编排引擎、多 agent 架构、状态机、向量数据库、记忆系统,还有精心设计的规划机制。
在这段旅程中,我迷失了方向。我把技术放在了问题前面。我的自尊心在作祟。我只是想作为工程师,在 AI 时代保住自己的位置。
我把运行 agent 所需的基础设施,和构建一个有用 agent 真正需要的东西混为一谈了。
我做的实验越多,就越发现自己一直在做减法。
模型越来越强了。越来越多的事情,一个 prompt 就能搞定。但这还不是全部。是我自己把问题搞复杂了。
创建一个 agent 所需的全部东西,就是一个装着 Markdown 文件的文件夹。
指令、上下文和可复用的技能。工具的访问权限。一种调用 agent、验证结果、纳入反馈的方式。这些大部分只要和 Claude 聊聊天就能搭起来。
mkdir my_awesome_agent cd my_awesome_agent claude 然后开始一段对话。
“Claude,我想构建一个 agent 来做 XYZ。帮我初始化它。创建一个 AGENTS.md,我们一起来看看还需要什么。”
这里有一个重要的区别。Claude 本身就是一个 agent,具体来说是一个编码 agent。有人管这叫 harness(执行框架)。我是在用一个通用编码 agent 来创建一个专用 agent。说明一下,Claude 可以换成任何编码 agent:Gemini、Codex 或者 pi。更重要的是指令和上下文。
我不是从零开始构建智能。我是在定义现有的智能应该如何完成某项特定的工作。
我和 Claude 一起梳理几个问题。
实际的工作是什么?不是问该用什么框架——除非你要造一个框架。成功是什么样子的?agent 可以自主做哪些决定?哪些事情没有许可就绝对不能做?
技能是可以复用、可以混搭的专门指令。网上有大量优秀的示例。借过来、改一改、组合起来,或者让 Claude 创建新的。
通常,一个技能就是一个带有指令的 Markdown 文件,可能再加上几个辅助资源。
agent 需要上下文:你的业务是做什么的、你的客户是谁、你的代码库怎么运作,或者某些领域特定的知识。这些都可以以 Markdown 文件的形式放在文件夹里。有些上下文可以在需要时检索。有些来自对话本身。你并不一定需要向量数据库或复杂的记忆架构。
要完成一项工作,agent 需要工具。也许它需要搜索网页、读取数据库、调用 API、执行脚本,或者与浏览器交互。
引入一个工具,简单到只需启用一个插件,或添加一个 MCP 连接器。
我让 Claude 帮我找出完成任务所需的最小工具集。工具甚至可以动态创建,由 agent 自己编写代码并调用。agent 也可以在网上找到工具并安装。
要让 agent 有用,就需要把它作为工作流的一部分来调用,无论是通过 cron 任务、webhook 事件,还是另一个程序。
简洁之处在于打包方式。一个装有指令的文件夹就是一个干净的可部署单元。它可以做版本管理、被到处复制,也可以嵌入其他流程。
在 Claude 以及所需的工具和凭证都就绪的情况下,可以用 -p 参数以无头模式调用它:
cd my_awesome_agent claude -p "Do awesome stuff"
无头模式意味着没有交互式聊天。Claude 接收任务,在 agent 的文件夹里工作,打印结果,然后退出。脚本可以传入任务并收集输出。对于无人值守的工作,我会提前配置好工具权限。Claude 还可以返回结构化的 JSON,供另一个程序使用。
Anthropic 关于无头执行的文档涵盖了相关命令和配置。
agent 启动时,需要知道去哪里找它的指令、收到了什么输入,以及是否应该继续之前的工作。调用机制可以变化,但 agent 的根本目的不变。
这套设置可以部署在远程虚拟机上,用钩子触发 agent,并通过隧道访问调用它的服务。
这个 agent 也可以在沙箱中部署和调用。我在 Fife 中探索了这一点,那是我的软件 agent 工厂,构建在 Modal Sandboxes 之上。
Fife 接收 GitHub issue,为每个任务在隔离的沙箱中运行一个编码 agent,然后返回经过测试的 pull request 供人工审查。多个 issue 可以并行处理,各自在自己的环境中运行。由人来审查结果,决定合并哪些。
这正是情况大幅改善的地方。现在,一个 prompt 就能把事情搞定,不需要复杂的指令。如今,我常常只是信任它自己去完成任务。我也预期它会越来越好。
当它出错时,我会和 Claude 一起复盘。发生了什么?缺了什么?我们应该改什么?
Claude 会把本地会话记录保存在 ~/.claude/projects/<project>/<session>.jsonl 下。每份记录都包含对话、工具调用和工具结果。它提供了任务如何展开的轨迹:Claude 被要求做什么、它尝试了什么、工具返回了什么,以及错误出现在哪里。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。