@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…

X AI KOLs Following 新闻

摘要

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.

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…
查看原文
查看缓存全文

缓存时间: 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)

相似文章