@kentcdodds: This is a great article and is exactly the kind of thing I'm talking about in my most recent YouTube video https://yout…
摘要
Kent C. Dodds shares an article and YouTube video arguing that the quality of AI agent outputs depends on the design of system primitives—providing agents with well-crafted, composable building blocks narrows their action space and yields reliable results.
查看缓存全文
缓存时间: 2026/07/20 19:36
This is a great article and is exactly the kind of thing I’m talking about in my most recent YouTube video https://youtu.be/kbmv3HIuKyk?is=ch2mysu8YMEY8whK…
TL;DR: 编程代理输出质量取决于系统原语设计——为代理提供精心构建的可组合积木,缩小其行动空间,才能获得可靠结果。
为什么你的代理输出很糟糕?
如果你觉得代理生成的代码、UI或逻辑像是“垃圾”,问题很可能不在代理本身,而在于你让它工作的系统。系统设计得越好,代理的输出质量就越高。这里的“系统”本质上是一系列原语(primitives)——你的系统暴露的最小意义单元,像是可组合的积木块。代理需要猜测或自行创建原语的次数越多,你得到满意结果的可能性就越低。
过去,技术负责人负责为个人贡献者构建系统;现在,每个开发者都是技术负责人,因为我们都有代理在自己设计的系统中工作。对于产品工程师来说,系统设计 现在是最稀缺、最有价值的工作。你的目标是为代理建造一个安全的游乐场,并提供工具,让它们高效完成任务。
原语是什么?不同领域的原语
原语就是你的系统暴露的最小可组合单元,无需重新实现每个独立部分的工作原理。以下是常见的系统领域及其对应的原语:
UI 与设计原语
组件和设计令牌,比如按钮、文本字段、间距等。没有它们,代理就只能“边做边编”,最终得到颜色、间距乱七八糟的UI。
API 与后端原语
资源和可应用于这些资源的操作,比如向订单端点发POST、取消订阅等。缺少这些,逻辑会到处重复实现,系统不可靠,追查Bug或重复劳动会变成常态。
数据原语
不同的实体以及它们之间的关系,比如用户、订单、订单行项目。没有这些,代理会临时拼凑数据结构,不得不猜测关系。
基础设施与平台原语
定时任务、数据存储、分布式系统托管、部署位置、密钥管理等。缺少这些,代理可能“不小心删了生产环境的存储卷——数据库没了”。
代理与工具原语
如果代理没有非常好用的可调用工具,它就只能写一次性bash脚本,低效且难以复现。
工作流与可重复模块原语
内置重试能力、工作流编排等。好的原语让代理不需要手动编写所有这些逻辑。
身份验证与信任原语
权限、RBAC(基于角色的访问控制)、审计追踪等。缺少这些,你可能会把“上帝模式”密钥交给不同代理,且难以审计。
对原语进行生命周期管理:创建、组合、合并、删除、扩展
仅仅拥有原语还不够,在项目的整个生命周期中,你需要不断管理原语:当出现新需求时判断它是否是现有原语的变体;当两个原语本质上是一回事时合并它们;当某个原语不再使用时删除它;当需要覆盖更多场景时扩展它。
具体例子:缺少原语时,代理会找变通方法
最近我在给Kodi添加社区包功能——允许在Kodi内部创建包并放到公共注册表里,供其他人参考、复刻使用。构建时,我发现缺少一个关键原语:管理员和用户的区分。我需要审核包、下架包,因此必须拥有不同角色和权限。在我录制这段视频时,多用户功能还不存在,但社区包是用户参与的重要一环。我没有让负责社区包的代理顺带实现RBAC,而是创建一个全新的代理专门构建这个原语,因为这是整个系统的基础。之前我犯过让一个代理同时做多件事的错误,但这次我决定“让代理专门做这个”。
合并原语的例子:PayPal 的组合框
很久以前在PayPal工作时,我负责跨境交易功能。输入邮箱地址会弹出选择框——UI上叫组合框。我检查代码库,发现我们居然有三种实现:用于选择发送国家的、选择货币的、输入朋友邮箱的(非跨境交易)。这对人类开发者和代理都不友好。于是我坐下来实现了一个非常好的组合框原语,最终成为了开源库downshift。合并后,只需要一个概念,所有人都更高效了。
合并原语的例子:Cody 的“技能”与“包”
在Cody(我的AI助手MCP服务器)里,我原来有“技能”的概念:Cody写代码,我满意后保存到D1数据库,后续调用“技能”即可重复执行。后来Cloudflare发布了artifacts(相当于Cloudflare内部的Git仓库),这明显更好,能做更多事(打包、使用持久对象等)。于是我构建了一个新的“包”原语,并把“技能”合并进去,还把Cody已有的“已保存应用”(带UI、端点的应用)也合并到了“包”里。现在只需一个原语,非常高效。
删除原语的例子:Instagram 的转型
Instagram最初是一个叫Bourbon的Foursquare克隆版,做酒类社交。他们观察用户行为,发现只有照片分享最受欢迎,于是删除了其他所有功能,只专注照片分享。我们都知道那之后发生了什么。删除原语减少了代理可能做的事情,也就减少了代理误用的可能。
删除后扩展:Cody 的邮件处理
以前Cody有接收邮件并用所有MCP工具(执行等)处理的能力,需要几个代理轮次然后回复。我发现这过于死板和特定,于是删除了它,改为一个简单的事件系统:Cody收到邮件时只是发布一个事件,你的包可以订阅事件。这样,原来庞大的邮件处理原语被缩小为“只发射事件”,而包原语扩展了一点来订阅事件。现在任何使用Cody的人都能创建任意数量的包来处理邮件 —— 比如“主题不对,忽略它”或“处理正文内容,然后做点什么”。这更灵活,尽管乍一看像是“帮助没那么大”(控制反转),但最终更强大。对代码而言,反正我们也不真正做大部分工作,所以效果很好。
作业:让代理评估你的代码库
现在,我希望你问你的代理:“当前系统中存在哪些原语?哪些应该创建、合并、删除或扩展?缺少什么?哪些看起来差不多?哪些需要再加强一点?”既然代理是在游乐场玩耍的那个,你不妨问问它的感受:“你在我的代码库里工作得怎么样?”然后运用你的判断力,结合产品方向来演化系统。通过有意识地管理原语,你为代理缩小了行动空间,让它们组合可复用的模块,而不是即兴拼凑。这样,审计也变得容易得多。
来源: Kent C. Dodds 的 YouTube 视频 (视频标题:@kentcdodds: This is a great article and is exactly the kind of thing I’m talking about in my most recent YouTube video)
相似文章
@kentcdodds: 如果你的AI代理在生成低质量内容,不要放弃或试图通过清理来对抗代理。专注于代理所使用的基础元素…
Kent C. Dodds建议改进AI代理使用的基础元素,以减少低质量输出,而不是依赖清理,并通过一个链接的线程来说明这一点。
@yoheinakajima:非常棒的文章,主要聚焦于 coding agents,但个人认为也适用于其他领域。与我之前的许多想法不谋而合:- agent…
该推文总结了构建 agent systems 的关键原则,着重强调了 scaffolding、memory 与可复用工具,内容基于 Yohei Nakajima 的一篇文章。
@kentcdodds: 这就是我过去一年一直在说的。这也是为什么 @kodykoala 不是一个代理,而是一套非常强大的原语…
Kent C. Dodds 赞同一条推文,认为将代理直接集成到产品中可能行不通。他解释道,他的工具 Kody Koala 是一套供代理使用的原语,而非代理本身。
@jeffreyliu_05: 可能是目前关于构建优秀智能体最好的文章
一条推文推荐了一篇关于构建优秀AI智能体的文章,暗示它对开发者极具价值。
一位开发者分享关于如何最大化AI代理能力的见解,认为更简单的设置和理解核心原则比复杂的工具和库更有效。
一位开发者分享关于如何最大化AI代理能力的见解,认为更简单的设置和理解核心原则比复杂的工具和库更有效。