目录
- 欢迎收听跨国串门计划。这是一档专注于让中文听众无 [00:00:00 - 00:15:00]
- 也有几个重要点 [00:15:00 - 00:17:38]
欢迎收听跨国串门计划。这是一档专注于让中文听众无
一凯:欢迎收听跨国串门计划。这是一档专注于让中文听众无障碍欣赏全球优质外语播客的节目。通过先进的AI声纹克隆技术,我们不仅将内容翻译成中文,还完美保留了原主持人和嘉宾的独特声音,为您呈现全球顶尖的AI财经健康与科技领域精品内容。我是主播一凯一位热衷于AI领域的产品经理很荣幸能为您搭建这座跨越语言障碍的桥梁接下来让我为您简单介绍本期我们克隆的这档节目并分享几句非常精彩的原话本期我们克隆的是AI Engineer在2026年5月30日更新的一期技术分享标题是How I deleted 95% of my agent skills and got better results分享者Nick Nisi来自WorkOS是一名Developer Experience工程师长期负责多语言SDK和开源项目也在实践如何把AI Agent真正用进工程流程里他有几句原话让我印象很深我自己大概已经八个月没亲手写过一行代码了这里最重要的词就是证明因为这些Agent老是骗我我让他按我想要的方式做事比撒谎更容易所以我删掉了95%的内容之后性能反而上去了这些话背后是一套很真实的agent工程实践接下来就让我们一起进入这期完整分享大家早上好欢迎来听我的分享 [00:01:30]
Nick Nisi:主题是Building AI Systems That Ship我是Nick Nisi在WorkOS工作我们楼下有展台欢迎过来看看跟我们聊聊我很乐意交流我重新开个头你好我就是那个瓶颈我是WorkOS的DX工程师负责20多个Repo横跨8种不同语言这些都是我们的SDK和开源项目比如AuthKitJSAuthKit ReactWorkOS NodeWorkOS KotlinWorkOS RubyPHP各种都有所以我要在很多不同的项目里处理很多事我很擅长这些工作过去8个月里我也很擅长借助agent来做这些事所以我自己大概已经8个月没亲手写过一行代码了我已经很熟练的用agent把这件事规模化让他们做事我来review指导再把工作完成的更快更好同时还保持质量但这样做有个很大的问题一次只用一个agent却要横跨所有这些repo我就得不停的切换上下文一遍又一遍越来越难这本身还可以接受问题是每次开始时我都要花一点准备时间基本就是拿出十分钟帮他搭好问题背景比如一起看这个GitHovit issue看这个linear ticket看这个slack thread弄清楚发生了什么看看能不能浮现问题然后再开始干活所以我有大量时间都花在和agent打交道上说白了就是把我脑子里已经有的上下文交给他然后再让他从那里开始工作另一方面我也在做一些产品是我们想为agent构建的产品虽然我说自己是developer experience engineer但在我的工作里developer仍然是最重要的对象只是现在触达developer的路径越来越多是通过agent所以我认为agent experience也同样重要因为这是我们出现在developer面前的方式所以我需要从两个不同方向走向AI native内部这边我开始做一个叫case的项目这是一个harness如果你读过Ryan DiPello的harness engineering说的就是那个思路我只是把那些想法拿过来开始做起来基本上我给他一个GitHub issue一个PR一个slack thread一个linear ticket什么都可以我只要把他指向那里他就能弄清楚自己需要什么上下文然后开始工作他不会停下来直到产出一个PR并且附上证据证明他确实做了我要求他做的事或者证明问题是什么修复了什么最重要的是他必须提供证据这个项目一开始是一个clawed skill因为为什么不呢我当时觉得clawed什么都能做而且一开始效果也很好但随着他变得更复杂上下文丢失的问题就非常明显他会开始忘东西或者跳过任务我问clawed你为什么这么做他会说哦对你是让我做那个了我决定不做这个就不太行所以我后来把它基于PI重写了并且用一个TypeScript State Machine来推动这些agent一步一步往下走它里面有五个不同的agentImplementerVerifierReviewerCloser还有Retro Agent这些agent很重要但不是最重要的case最重要的部分是他们之间的gateState Machine真正强制执行的就是每一步之间的检查所以当我们实现了某个东西之后不能直接进入reviewer必须先由verifier验证通过reviewer review完之后如果发现任何问题就必须把它送回implementer去处理等这些都完成之后closer才能工作但closer也不能提前工作必须等系统认为事情已经完成closer的作用是提供证据retrospective则是分析整个执行过程它会查看case做过的所有日志然后问我本来可以哪里做得更好接着它还会更新自己的memory system确保下次如果他之前绕了一点圈子就可以跳过一些步骤他也可以给自己一些提示告诉自己接下来该往哪里走这样下次再在同一个项目里工作时就不会撞上同样的障碍所以下一个agent具体是什么其实没那么重要重要的是证明工作真的完成了证明每个状态里发生的事情真的发生了这里最重要的词就是证明因为这些agent老是骗我我会跟他说你需要跑测试尤其是在它还是一个skill的时候我会说你要跑这些测试并且确认测试真的通过当时有一种做法是让它检查有没有一个case tested文件如果这个文件存在那就很好说明它跑过测试了完美结果它很快就摸清楚了Claude会直接touch一下那个文件然后说对我跑过测试了真像个初级工程师我发誓所以我得想办法证明它真的跑了测试一个做法是直接拿测试输出做sh256把结果存进case tested的文件里然后再用加密方式验证是的你确实跑过测试这里真正关键的是我让他按我想要的方式做事比撒谎更容易核心就是这个他不再撒谎不是因为我很客气的请求他而是因为我让他每次都必须证明自己真的做了这件事刚才说的是内部这边对外这边是workOS CLI这是我们的客户会用的工具他能做很多事但最核心的功能是帮你安装AuthKit我们想让别人看看我们的产品或者他们已经感兴趣的时候最大的痛点之一就是我还得花时间搭起来还得读文档之类的现在用WorkOS install就不用了它会自己判断你在什么项目里比如你在Next.js项目里你在TanStack项目里或者你在Ruby项目里它都会识别出来它还会发现你已经配置了Auth0那我可以很容易把它移掉换成AuthKit然后就能用了整个过程不到五分钟如果你还没有WorkOS账号它会先帮你创建一个之后你可以再去认领所以搭建这件事几乎没有任何阻力这对我们面向公众的形象很重要也影响客户怎么使用我们怎么理解我们我们希望这件事更偏agent化更往前走但这里也有问题我在做它的时候它会像这些模型一贯的表现一样过度自信的说是的我做完了其中一个例子是我想把它安装进一个TenStack Start项目TenStack Start还比较新还在RC阶段而且一直在变化结果case不对是CLI做了一些修改它安装了东西也改了一个叫start.ts的文件这个文件和TenStack之间有一种隐含约定它必须导出某些东西我们把这件事搞坏了那段代码在我看来是对的在Claude看来也是对的但在TenStack Start看来不对所以碰的一下它失败了于是我们得想办法告诉他失败了或者让他理解自己失败了我当时想那我们只需要一些skills对吧skills就是解决办法所以我开始教他开始做这些skills当然我又想我们有这么好的文档我可以直接拿文档生成一些skills于是我生成了一万多行skills全部基于我们的文档我还用了一个特别复杂的方式他会取文档里的不同章节再围绕这些章节生成skills然后他还会在skill里放一小段注释里面是当前这段文档状态的加密hash基本逻辑是如果我再跑一次而这个shad没变那就不要更新这个skill这样它就不会一直不停更新我当时觉得自己特别聪明特别厉害生成了这么一大坨东西甚至还给它做了一些evals我开始做那些evals结果跑完这些场景要68分钟真的太夸张了它会一次又一次失败然后重试最后可能能跑到结果但这消耗了很多工作量也消耗了很多token所以我当时有更多token我想token更多很好那肯定更好但最后结果反而更差真正告诉我问题的是measurement也就是那些evals他们在告诉我嘿这不对所以我手写重做了一版之前我想的是全面覆盖我们文档里的所有内容但后来我意识到我只需要覆盖每个部分里常见的坑就行所以对于我们整套文档我不再有一万行那种内容而是只有553行God Chess也就是常见坑这些就是我反复跑E-VALS的过程中最常出现的问题这版跑得更快Token数也小得多每次运行只需要6分钟而且我没有再让模型去跑那些很长的Wild Goose Chase让它到处检查一大堆东西它会更专注在真正重要的事情上所以我删掉了95%的内容之后性能反而上去了我之所以知道这一点真的只是因为我做了测量回头看我有一个特别明显的skill我能看到当我带着这个skill去跑给他一个任务说加载这个skill然后做这个任务他的正确率是77%但如果我让他做同一个任务不加载这个skill他的正确率是97%也就是说我其实是在主动让他变差而我之所以知道这件事只是因为我在测量所以当你在处理这种非确定性的代码时evils非常重要Cloud现在把这件事做得很方便他们有类似EVILS的东西还有一个Cloud skill可以帮你做EVILS它甚至会帮你搭起来生成一个HTML输出让你并排看到我带skill跑了一堆不带skill也跑了一堆这是结果用它去测量看看你到底在哪里出问题因为我原本以为加上一大堆代码会让事情好很多但其实我只需要相信模型本来就会写代码然后在某些情况下轻轻把它往正确方向推一下就够了所以我到底从这两个系统里学到了什么基本上就是要用机制去强制执行不要只给指令模型可能会撒谎它可能决定不去拉取某些东西不去做某些事原因可能是它忘了也可能是被别的事情分散了注意力但如果你真的搭好一条pipeline让它必须自我约束并且向你证明它完成了你要求的事那体验肯定会好很多而且很多时候token还会少得多你要引导模型不要把每一步都规定死所以不要只是丢给他一份这是我所有文档的摘要里面塞一大堆信息你应该更具体的引导他比如说你在next.js里工作而且你在proxy里那你应该怎么做如果你不在proxy里就不能调用directs这个问题特别常见一遍又一遍的出现他会到处乱放这些东西所以要引导他但不要把所有做法都硬性规定死当然还要衡量不要预设他能工作不要假设它就是有效的要让信任变成一个通过率一个Delta分数或者类似的指标这样你才能证明它到底行不行Case在最后会做的一件事是作为它Reviewer script的一部分我还是会读它生成的所有代码确认那确实是我愿意发布的代码但在它先用非代码的方式证明自己完成了我要求的事情之前我甚至不会浪费时间去看那些代码主要方式是如果它在处理一个UI bug我希望他用Playwright CLI录一段视频先录修复前自己怎么操作再录修复后怎么操作然后告诉我现在修好了能用了如果他能通过这些附在PR里的视频向我证明这一点我就更愿意去看那个PR然后说好我们可以修一下他写出来的那些奇怪地方但他确实把工作做对了这样我才更有动力花时间重新成为这个流程里的瓶颈否则我就让他再做一遍所以每一次失败都会变成下一次运行的数据这也是另一个重要点事情失败的时候这又回到了Harness Engineering那件事如果你在做一个Harness而他犯了错不要去修他犯下的那些具体错误要去修Harness让Harness能自己修那些错误Ryan Lopolo我这次没看到他的演讲但我在Zoom上看过他的一场分享他说他们团队从来不直接改代码本身他们只改Harness让Harness去修代码本身我在做case的时候真的把这件事记在心里了所以我只改case本身确保他在做我想让他做的事如果他失败了我们就再来一次然后这会变成他记忆的一部分另一个重要部分是case运行的时候最后还有一个retrospective agent他做的事情很简单就是回头看自己做了什么他会进去看Cloudy和Codex的transcript比如Jason L文件然后从里面提取信息比如我是不是同时跑了很多tool我是不是连续三次发起同一个tool request中间什么都没变我是不是陷进了某种doom loop他会尝试识别这些情况看看自己下次能怎么做得更好在内部case会保存一大堆memory file都是Darjan文件他会理解说好我有一个general memory file如果我在next.js里工作我有一个next.js memory file如果是tan stack start我有一个tan stack start memory file等等他会自己判断这些信息应该放在哪里这样他下次就不会再犯同样的错误比如又把10 stack start里的start.ts弄坏他知道这件事因为他已经把信息写进了自己的memory我还想加的一个东西是Cloud现在在做的那个autotrim功能它可以随着时间推移修剪自己的memory这会是我接下来要加进去的部分关键是要确保他能从错误里学习而且能自动做到这一点同时你也可以给他反馈要有一种方式让你也能把反馈提供给他然后下一次你给他任务时他就会比上一次更好一点最终你会开始越来越信任他如果你是在让自己的产品适配agent也有几个重要点 [00:15:00]
也有几个重要点
Nick Nisi:也有几个重要点先弄清楚agent在你的产品上稳定会搞错什么然后把重点放在那里不要把重点放在整个产品上因为他可能已经知道很多关于你产品的东西比你想象的还多把那些gotcha写下来一条一条写下来围绕这些gotchas创建skills你也可以创建tutorials但不要依赖它模型可以读tutorials也能从里面学习但要记住模型本来就知道怎么写代码它只需要知道你这个产品的细节以及里面的雷区在哪里当然也要衡量你发布出去的东西你要理解模型在你的具体产品上哪里会失败并确保你把重点放在那里而你唯一能做到这一点的方法就是用evils之类的东西否则你可能只是在增加噪音把模型带上一堆没用的绕路也要像看待开发者一样看待这些使用者也就是说要用看待开发者的方式来看待这些agent他们想知道什么我怎么让他们用起来更顺比如你的页面是不是后加载了很多JavaScript补进了一大堆context而agent用某种流程去抓取总结你页面信息的时候这些内容可能没有被带进去结果对他们来说就丢失了你要确保这种事不会发生如果你是在让agent为你工作就像这个案例里一样那就要用证据来替代信任永远不要相信他一定要让他向你证明他确实做了某件事如果他说跑了测试就让他证明如果他说修好了一个UI bug就必须把结果展示给你否则不要在他身上浪费时间而且要用代码来强制这些要求不要靠prompt所以我才把它改成用Python并用State Machine去强制执行因为我可以完全控制这个state machine而且这个控制是在AI或Cloud自己决定我要不要做这件事之外的不是让它决定它必须做我通过这个循环来强制执行然后每一次失败都会变成一个系统bug它每次在某件事上搞砸了那就是harness里的bug去修harness所以说你真正要做的是为agent搭建一个可以一起工作的环境并把重点放在这个环境上我们的实践方式其实没有真的改变我们的工作也没有真的改变只是某种程度上被抽象了一层你的工作从来就不只是写代码它一直都是在构建这些系统现在我们只是有了一个更好的抽象能帮助我们理解这件事所以要把这一点考虑进去然后从这里继续往前走我的分享就到这里谢谢大家剩下的时间我很愿意回答问题 [00:17:36]