▲ 社区会议:如何创建和发布技能

VVercel
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00[无音频]
00:00:30[无音频]
00:01:00大家好,最近怎么样?
00:01:25欢迎来到新一期的 Vercel 社区会议。
00:01:29很高兴大家能参加。
00:01:32如果这是你第一次参加我们的会议,
00:01:35你好,我是来自 Vercel 社区团队的 Pauline Navas。
00:01:40Es posible que me hayan visto rondando por los espacios de la comunidad.
00:01:44对我来说,能在这里和大家直播交流、
00:01:46建立联系,总是一段非常愉快的时光。
00:01:51很高兴已经看到不少人在关注和收看直播了。
00:01:56如果你是第一次参加我们的会议,
00:02:00但你看不到聊天框或者想提问的话,
00:02:02我强烈建议你参与进来,你应该提问。
00:02:06请随时加入我们的社区平台 community.vercel.com。
00:02:12然后点击参加本次活动。
00:02:15这样你就能使用聊天功能并在整个会议期间提问了。
00:02:20如果你在 X 或其他平台收看,也可以直接在那里提问。
00:02:25对于今天的会议,我超级兴奋。
00:02:28不知道你们能不能感觉到,我们要深入探讨一些
00:02:32真正改变开发者与 AI Agent 协作方式的内容。
00:02:36那就是 Claude Code 的技能(Skills)。
00:02:39如果你曾希望你的 AI Agent 能直接知道如何
00:02:44以正确的方式升级 Next.js,或者遵循你团队的编码规范。
00:02:49这就是这些“技能”所能实现的。
00:02:51所以我非常荣幸地邀请到
00:02:56来自 Vercel AI DX 团队的 John 来为大家主持这场工作坊。
00:03:02嗨,John。
00:03:04>> 嘿,Pauline。
00:03:05大家好。
00:03:05感谢各位的光临。
00:03:07>> 见到你真好。
00:03:09那我们开始吧。
00:03:12>> 没问题,开始吧。
00:03:13好,聊聊“技能”。
00:03:15感觉它们已经存在很久了,但实际上可能也就出来两周左右,谁知道呢?
00:03:20接下来我会通过这个幻灯片来讲解“技能”。
00:03:24我会展示一些案例,请大家随时提问或打断我,
00:03:28没关系,我非常乐意聊这些东西。
00:03:31关于技能,我们首先要讨论的是如何创建和
00:03:35发布它们。
00:03:36这份演示文稿其实是用一个叫 Remotion Geist 的技能生成的。
00:03:42它利用了 Vercel 的设计语言,并结合了 Remotion,
00:03:46构建出了这个效果,我最后会展示一下。
00:03:48不过现在,我先带大家看一些视频。
00:03:51过去很长一段时间,模型还没那么强大的时候,
00:03:55我们一直在谈论“提示词工程(Prompt Engineering)”。
00:03:58每个人都必须让提示词变得完美,
00:04:00大家甚至觉得提示词工程会成为一种职业。
00:04:03而现在,我们正在转向“上下文工程(Context Engineering)”,
00:04:08允许这些技能,也就是这些 Markdown 文件,在稍后阶段按需加载。
00:04:13所以现在,初始提示词
00:04:17和随后加载的这些上下文片段之间有了清晰的分离。
00:04:19我们把这些片段称为“技能”。
00:04:22“技能”这个概念起源于 Anthropic。
00:04:25他们需要教给 Claude Code 特定的任务,因为模型开始时
00:04:30是一张白纸,每个模型启动时都是全新的,没有记忆。
00:04:33就像刚出生的婴儿一样,没有任何技能。
00:04:37它们唯一的只是灌输在脑子里的固有知识。
00:04:42所以它们从零开始。
00:04:44Anthropic 就在想:我们要怎么解决这个问题?
00:04:48显然,用 Markdown 就能解决,因为现在几乎所有问题
00:04:51都是靠 Markdown 解决的,“技能”也就应运而生了。
00:04:55从现在起,你可以封装这些技能了。
00:04:58技能就是 Markdown 文件,你可以在团队之间共享,
00:05:04也可以封装你内部的工作流。
00:05:07你可以把它们打包并分享到 GitHub 仓库上。
00:05:12我们还发布了一些自定义工具。
00:05:15让我打开浏览器展示一下用于管理社区技能的工具。
00:05:22skills.sh 是一个你可以访问的地方。
00:05:27你可以在这里搜索社区技能。
00:05:29你可以找到一些最常用的技能。
00:05:32一如既往,请确保你信任该技能的来源,确认它来自可靠渠道
00:05:36或者是你团队的成员。
00:05:38这样你使用的东西才能符合你的目标。
00:05:42我们稍后会详细讨论如何使用它。
00:05:45但这里是搜索整个技能生态系统和
00:05:48社区中可用技能的绝佳场所。
00:05:50接下来,我会介绍一下这个工作坊通常是如何教授的,
00:05:56然后跳到下一个视频。
00:06:00说到“白纸”,意思就是,
00:06:07当婴儿出生、Agent 启动时,
00:06:11你要知道 Agent 实际上是运行一个模型。
00:06:14我把这个放大一点。
00:06:16Agent 知道 React、TypeScript、CSS 和 SQL 的基础知识。
00:06:23但它不知道的是:你的规则、你的模式、
00:06:28你的系统和你的架构。
00:06:30所以你可以将
00:06:35你的个性化内容与它已知的内容结合起来,填补知识鸿沟。
00:06:40你引入了那些上下文,而技能被加载进来,
00:06:42这样它就能完全按照你想要的方式完成任务。
00:06:45就是这样,它们懂语言,懂 TypeScript,懂 React。
00:06:51但它们不懂你所使用的那种“方言”。
00:06:53这是一个很好的理解方式。
00:06:54好了,到目前为止有什么问题吗?
00:07:01我有漏掉什么吗?
00:07:03目前还没有问题。
00:07:06聊天室里大家都很兴奋。
00:07:08所以继续吧,John。
00:07:09出发。
00:07:11我认为这就像是“技能”领域的 NPM 时刻。
00:07:17NPM 是大家都很熟悉的包管理器。
00:07:23包管理器拥有社区绑定的资源,
00:07:27你可以利用这些资源让你的产品运行得更轻松。
00:07:30如果你把“技能”和 skills.sh 看作是技能的包管理器,
00:07:35你就可以把这些能力安装到你的 Agent 中。
00:07:39就像安装库一样,
00:07:41你可以使用 `npx skills add` 为你的项目添加知识。
00:07:45以前的提示词工程,你会在 `claude.md` 或
00:07:52`agents.md` 文件里试着说:永远这样做,永远那样做。
00:07:55使用这个库,检查 Jira 等等。
00:07:59但现在,我们可以添加这些技能,它们捕捉了
00:08:04这些要求并带入我们的项目中。
00:08:06所以它们是持久化的。
00:08:08我们可以在用户级别或项目级别共享它们。
00:08:11而且它们可以独立于具体的项目。
00:08:14你不需要频繁地复制粘贴了。
00:08:17我们可以自动化很多流程,一旦你启动一个新项目,
00:08:21你就可以添加所有想要或需要的技能。
00:08:23再说一次,我们正在从过度关注
00:08:28如何构建这些提示词转移开来。
00:08:30好的。
00:08:34所以,这些是能力,是持久的,是面向整个团队的。
00:08:38如果你还没有经历过在项目中管理
00:08:43`agents.md` 或 `claude.md` 文件的痛苦,
00:08:47比如还得为这些 Markdown 文件提交 PR 之类的,
00:08:50那么这个方案也解决了那个问题。
00:08:53这体现了从单兵作战到团队协作的转变。
00:08:58好的,这也涉及到你可以思考的一个概念,
00:09:03叫做“被动”与“主动”。
00:09:05“被动”是指这些技能不需要被加载,
00:09:12直到需要它们的时候。
00:09:15如果我们看 `agents.md` 里的结果,
00:09:22Markdown 文件就像是系统提示词,
00:09:25是最先被读取的内容。
00:09:26它是始终被加载的。
00:09:28Agent 必须读取它。
00:09:31通过大量的测试你可以看到,
00:09:35如果你往里面塞进一大堆上下文,
00:09:38填满了整个上下文窗口,
00:09:41它在遵循规则方面会表现得好得多,
00:09:46比如“始终使用 TypeScript 和 Tailwind”等。
00:09:50而这些技能变得更加“主动”。
00:09:53Agent 可以由你手动调用它们,
00:09:57或者由 Agent 进行延迟加载,
00:10:00并在需要时实时引入它们所需的东西。
00:10:04比如部署到 Vercel 或创建数据库等。
00:10:08所以,这又是“规则(Rules)”与“工具(Tools)”的博弈,
00:10:13把技能看作工具,
00:10:15而在这些场景中你总是两者都需要。
00:10:18John,刚收到了一个问题,
00:10:21我觉得在这个环节回答正合适。
00:10:24我们如何决定什么时候把某个功能作为 MCP
00:10:28发布,或者作为技能发布?
00:10:30我想说,默认情况下,
00:10:33这可以分为几个层次,如果你想,
00:10:37我刚好想展示一下这个概念。
00:10:38我要把它投在屏幕上。
00:10:39好的,没问题。
00:10:40默认情况下,优先尝试用 Markdown 解决问题。
00:10:44如果 Markdown 不够用,那就用 CLI(命令行界面)解决。
00:10:47如果 CLI 还是不够,再用 MCP 解决。
00:10:51这就是抽象的层级,
00:10:53简单性的层级。如果你能想到办法
00:10:58用 Markdown 解决问题,
00:10:59这对任何 AI 驱动的工具都适用。
00:11:01你可以看到很多
00:11:05Anthropic 设计 Claude Code 的方式,
00:11:08其他厂商在技能、命令和
00:11:11子 Agent 方面也都在效仿。
00:11:13它们大多是带有前置配置(Front Matter)
00:11:15和设置的 Markdown 文件,而这通常已经足够了。
00:11:19然后这些 Markdown 文件可以定义它们需要的工具、
00:11:21允许调用的工具
00:11:24以及各种限制。要仔细完成
00:11:29这些配置步骤确实需要一些时间。
00:11:31但如果你遇到了需要严格控制
00:11:37具体的负载(Payload)和数据类型,
00:11:40以及在 Agent 和 MCP 之间
00:11:42往返传递的所有内容的场景,
00:11:43那么 MCP 是一个很好的解决方案。
00:11:46但我认为总的来说,整个行业趋势
00:11:50都在向 CLI、
00:11:54Markdown 文件靠拢,只在绝对必要时才使用 MCP。
00:11:59是的,这也是我从
00:12:04网上的各种讨论中看到的观点。
00:12:06我们还收到一个来自 X 平台的问题。
00:12:10这太神奇了,在可预见的未来,
00:12:13你认为技能会支持“Agent 到 Agent”的自动发现吗?
00:12:17如果能看到一个 Agent 决定
00:12:20安装一个技能,那就太酷了。好问题。
00:12:22我太喜欢这个问题了,“Agent 到 Agent”
00:12:27是目前被低估但非常有潜力的模式。
00:12:32绝对可以,我能想象一个 Markdown 文件
00:12:39被加载进来,作为对某个 Agent 的描述。
00:12:42Claude 目前通过“子 Agent(Sub-agents)”来支持这一点,
00:12:46而且就在今天,正好可以聊聊
00:12:49他们今天刚刚发布的团队(Teams)功能,
00:12:54它们可以启动一组子 Agent,
00:12:59然后这些子 Agent 向主“团队领导”汇报。
00:13:02他们现在称之为“团队”。
00:13:04这些团队基本上可以
00:13:10由那一名团队负责人管理,你可以进去查看
00:13:12代理机器人们都在做什么。
00:13:14那些代理机器人对自己的职责有明确定义,
00:13:18我想看看能不能快点找到相关的文档。
00:13:23- 在 John 查找的时候,
00:13:30如果你在直播间想提问,
00:13:34现在正是时候,尽管把问题发在聊天框里,
00:13:37我们会在整个会议期间逐一解答。
00:13:40- 我该发在哪里呢,我至少可以
00:13:42发在 Twitter 的聊天群里。
00:13:47所以,
00:13:51在这个页面上,你会看到子代理的定义方式,
00:13:58你可以看到它们有一个 front matter 部分,
00:14:01在 front matter 部分中,
00:14:03你可以定义该子代理拥有的技能。
00:14:08所以如果你想创建一个代理,在这个案例中,
00:14:13一个拥有一系列技能的子代理,
00:14:17那么你可以通过技能名称来实现。
00:14:20我们还没到那一步,
00:14:22接下来的幻灯片是关于技能结构的,
00:14:26但技能基本上就是名称。
00:14:28因此,你可以有一个子代理
00:14:29具备一组特定的技能,
00:14:31非常专业的一组技能,
00:14:34然后让那个子代理去处理任务。
00:14:38今天发布的 Teams 功能所实现的是,
00:14:43它们可以,
00:14:45Cloud Code 基本上可以组建自己的团队,
00:14:48构建自己的代理,
00:14:49并尽力去完成任务。
00:14:53但你也可以定义具有自定义技能的自定义子代理,
00:14:56如果你想说:
00:14:57“请使用这些子代理组建一个团队”。
00:15:00当然,这还算不上完全的代理间通信。
00:15:05关于架构设计代理间通信
00:15:08是一个更宏大的讨论,
00:15:11这已经超出了本次讨论的范围。
00:15:12但我确实看到了这种模式,
00:15:14即我们定义子代理的方式
00:15:17正在被我们定义代理的方式
00:15:21以及它们之间相互通信的方式所采用。
00:15:23比如你如何展示一个代理,
00:15:24我想它会是一个 Markdown 文件,
00:15:26写着“这就是我的能力”,
00:15:28有点像“教练,让我上场”的模式,
00:15:30比如“我会投三分,
00:15:32我会抢篮板,让我上场吧”。
00:15:34然后它们就可以通过这种方式互相发现。
00:15:39我想我们已经有了针对技能的 skills.sh,
00:15:43类似于技能的包管理器。
00:15:47未来我们也会有代理的包管理器
00:15:49和代理的 Markdown 文件。
00:15:51这是必然会发生的趋势。
00:15:54我的意思是,我相信它已经发生了,
00:15:57可能有人已经发布了相关内容,
00:15:58只是还没有进入主流视野。
00:16:00- 这非常有道理。
00:16:03谢谢,谢谢。
00:16:04各位,如果还有其他问题,
00:16:06请发在聊天框里。
00:16:08与此同时,John 你想继续吗?
00:16:10- 是的,没问题。
00:16:12技能其实就是一个文件夹,不需要服务器,不需要托管。
00:16:15技能位于一个目录中,
00:16:20你给它起个名字,然后技能名称
00:16:24或技能文件必须命名为 skill.md。
00:16:28这让代理在它们的发现模式中
00:16:31能够找到它们。
00:16:32这只是一个约定的设置,以便工具
00:16:35能更好地配合使用。
00:16:36这使得构建包管理器、
00:16:39组织管理等变得非常容易。
00:16:41此外,技能还可以捆绑在一起。
00:16:45它可以捆绑脚本,可以有参考文件,
00:16:49等等,所有这些功能都允许技能
00:16:53去调用其内部引用的其他内容。
00:16:56所以你会看到技能会有 front matter。
00:17:01默认情况下,它需要一个名称和描述。
00:17:04名称应该与……保持一致,
00:17:08如果你看一下这个结构。
00:17:10如果我们创建一个名为 my-skill 的技能,
00:17:12你就在这里把它命名为 my-skill。
00:17:17描述非常关键,
00:17:20因为它会告诉代理
00:17:23何时该使用这项技能。
00:17:24代理会想,
00:17:26它在执行你交给它的任务。
00:17:29如果它进行到某一步发现:
00:17:31“噢,我需要一些能强制执行
00:17:33销售标准的东西”,那么它就会加载这项技能。
00:17:38它会使用技能加载工具来加载这项技能。
00:17:41所以这些描述变得至关重要。
00:17:42如果你打算以一种非常“懒惰”的方式使用技能,
00:17:43你可以这样写;
00:17:46否则,你可以使用斜杠提前调用技能,
00:17:50将其视为命令。
00:17:52我想我有一张关于命令与技能区别的幻灯片,
00:17:55但基本上从历史上看,它们是两件独立的事情,
00:18:00而现在它们已经合二为一了。
00:18:03以前技能只能被延迟加载,
00:18:04但现在既可以由用户通过斜杠调用,
00:18:08也可以由代理延迟加载。
00:18:12我的意思是,如果你在这里输入斜杠,
00:18:17你可以看到可用技能列表,
00:18:19如果你想手动调用,可以手动操作,
00:18:22或者你可以等待代理在需要时自行调用。
00:18:27那么从这里开始,不再分心了。
00:18:32- 我想你正准备讲这个,John,
00:18:39但我个人很想听听具体的例子。
00:18:43比如你会推荐大家先构建
00:18:47哪种范围较小、定义明确的技能,来掌握这个模型?
00:18:52- 噢,这问得好,让我给出一个我认为
00:18:55目前最好的例子之一。
00:18:57基本上在 Vercel,我们遇到的一些
00:19:03关于技能的问题是,
00:19:07我们的发布节奏非常快。
00:19:12而代理和模型,它们的知识截止日期
00:19:15是在几个月前,甚至一年多以前。
00:19:19所以默认情况下,
00:19:24如果你给代理一个任务,它可能会使用 Next.js 14,
00:19:30而那已经落后好几个版本了。
00:19:33它可能会使用 AI SDK,而你知道,
00:19:35该 SDK 最近弃用了像 generate object 这样的功能,
00:19:39现在它已成为 generate text 的一部分,
00:19:41从而使 API 更加标准化且易于遵循。
00:19:45所以你会遇到这类问题,
00:19:50它在使用旧版本,
00:19:51而你正尝试做一些事情,
00:19:53你在阅读文档,
00:19:54但内容却不同步、过时了。
00:19:56于是项目就会陷入停滞,
00:20:00试图弄清楚问题所在,
00:20:03或者没有对齐它所需的内容。
00:20:05为了让你自己与代理保持同步,
00:20:08你可以创建一个技能,比如:
00:20:11“使用这个版本的 React,使用这个版本的 AI SDK,
00:20:16使用这个版本的 workflow”。
00:20:18然后你可以放入参考信息,
00:20:19告诉它去哪里查找相关信息。
00:20:22例如,我为 Vercel 构建的一个技能,
00:20:28让我调出来看看。
00:20:33这个 Vercel workflow 技能就是
00:20:40我几天前发布的那个。
00:20:43我们这样做的方式是,
00:20:46因为我们非常关注版本号,
00:20:49所以我们开始随 NPM 包一起发布文档,
00:20:50我们告诉它,你的 workflow 知识
00:20:54已经过时了。
00:20:58我们知道这一点,因为 workflow 现在
00:20:59在迈向正式商用(GA)的过程中几乎每天都在更新。
00:21:02但我们可以做的是说,听着,
00:21:06我们已经打包了文档。
00:21:10所以每当你需要查找 workflow 时,
00:21:11去查看我们打包的文档,
00:21:13并查看最新版本。
00:21:16这使得每当我启动一个 workflow 时,
00:21:18我不必担心它会找到过时的信息。
00:21:22它总能找到随 NPM 包
00:21:25一起打包的信息,从而保持
00:21:27与版本本身同步一致。
00:21:32所以,这非常……整个技能的核心基本上就是
00:21:34“去阅读手册”,并附带了一些基本的最佳实践
00:21:38和快速参考。
00:21:42所以这些技能解决了
00:21:44代理知识截止日期的问题,
00:21:48以及遇到版本号冲突等问题。
00:21:53你可以为自己编写的一个技能是,
00:21:57我会说如果你使用这个技能,
00:22:01我来演示一个叫做“创建技能”的技能。
00:22:07如果你在 skills.sh 上搜索 create skill,
00:22:11create skill,我不知道……
00:22:14所以如果你拿一个 create skill 技能,
00:22:23可能就用 Claude code 团队发布的那个吧。
00:22:28让我看看 Claude,我想我们发布了他们的。
00:22:33抱歉,这个技能我没提前准备好。
00:22:39- 没事,你边找边说。
00:22:42太棒了,请继续。
00:22:46- 我刚才应该想 Anthropic
00:22:47而不是 Claude code。
00:22:49是的,如果你引入他们的一个创建技能
00:22:50或者他们的模式,你可以说“创建技能”,
00:22:54然后,糟糕,你可以说“创建技能”,然后输入:
00:22:58“查看 readme.md 文件中
00:23:02我的写作风格,并创建一个
00:23:09永远遵循这种写作风格的技能”。
00:23:12然后这就会提取 readme 中的内容,
00:23:14并创建一个技能,它本质上
00:23:19就像你个人的写作风格,
00:23:21这样以后你就可以调用该技能,
00:23:23比如叫“John 的写作风格”之类的。
00:23:26你可以喂给它大量的文档,
00:23:28或者输入你博客文章的 URL,
00:23:31或者你自己的帖子、客户语言等等,
00:23:33直接喂进去。
00:23:37我认为这些总是很好的切入点,
00:23:38即“我已经拥有了什么,
00:23:40且我想能够再次复刻它?”
00:23:42比如“我经常使用且知道以后会用得更多的东西是什么?”
00:23:43比如你经常使用
00:23:46且知道以后还会经常使用的东西。
00:23:50所以这通常是比如客户消息、
00:23:53博客、内容以及各种材料,
00:23:56那些你过去创作过的
00:23:57且想要创作更多同类的内容。
00:23:59所以,没错,那是入门尝试“风格”技能的绝佳切入点。
00:24:04——这主意真棒。
00:24:05我一定要试一试。
00:24:06我正好想读一下聊天框里的
00:24:08一些评论。
00:24:10Dave 说我们创建了一些技能,
00:24:14让一位十年没写过代码的初创公司创始人
00:24:17能够参与代码贡献,
00:24:19而不会破坏新代码库中的
00:24:23架构界限。
00:24:24我发现这是“技能”的一个非常好的用途,
00:24:27帮助非技术人员或编程新手
00:24:30能够参与到编码行为中,
00:24:32同时又不损害质量标准,这太棒了。
00:24:38另外还想说,Dave 刚才也提到了,
00:24:42我非常赞同 John 所说的,
00:24:45关于现在常用的工具。
00:24:47是的,他唯一使用的 MCP 工具是 Chrome 开发者工具、
00:24:52一个用于与 Linear、Jira 等项目管理工具交互的 MCP,
00:24:56以及处理数据库的工具。
00:24:59这正好呼应了你刚才所说的一切。
00:25:02在我们继续之前,聊天框里还有一个问题,
00:25:07关于你对 agents.md 表现优于“技能”的看法,
00:25:12就在我们发布的智能体评估博客文章中。
00:25:17我不知道你是否会在
00:25:19接下来的演示中谈到这一点。
00:25:21我知道我们已经扯远了,
00:25:25但你想现在聊聊这个吗?
00:25:27——好的,没问题。
00:25:28评估模型和智能体
00:25:34是一件极其困难的事情。
00:25:38因为通常当你为它们编写调用评估时,
00:25:42你是在一个全新的、空的项目中测试它们,
00:25:46这个项目没有加载任何上下文。
00:25:49你给它一个特定的场景,
00:25:51比如“在这个空项目里,尝试使用 Next.js 之类的”。
00:25:56如果你写了那样的评估,
00:25:59但你没有考虑到,
00:26:03比如 Opus 4.6 今天刚刚发布,
00:26:05或者你使用的任何模型,
00:26:07以及所有这些额外的上下文,
00:26:10无论是模型、智能体还是运行器。
00:26:13Cloud Code 会有不同的系统提示词,
00:26:16Cursor 也会有不同的系统提示词。
00:26:17这里面有太多的变量,
00:26:21而且模型本身
00:26:24具有非确定性,
00:26:26所以测试它们是非常非常困难的。
00:26:31话虽如此,agents.md 与“技能”之争,
00:26:37本质上是“强制上下文”与“懒加载上下文”的区别。
00:26:42如果你把那篇博客文章的内容归纳为:
00:26:47¿Es mejor forzar el contexto que la carga diferida del mismo?
00:26:51答案肯定是肯定的,
00:26:53因为它会将其视为
00:26:57最初始、最重要的指令,
00:27:00贯穿智能体生命周期的开始。
00:27:03它会直接告诉智能体,
00:27:08“这就是我们要做的。”
00:27:10“这是我们能做的最好的事情。”
00:27:12其实,我准备了一些相关的演示,
00:27:14原本打算在最后展示,
00:27:16关于如何预热或预加载技能。
00:27:20所以,这仅仅是因为
00:27:25模型的工作机制就是这样。
00:27:29希望大家不要误解那篇博客,
00:27:33它并不代表“技能”不好用。
00:27:35它只是说明,如果你绝对需要指令
00:27:39被始终遵循,那么使用 agents.md 文件
00:27:42就是我所推荐的方式。
00:27:44不过我也有一周没读那篇博客了。
00:27:48——是的,这非常有道理。
00:27:50太棒了。
00:27:51好的,提醒社区的各位,
00:27:53如果有更多问题,请随时提出。
00:27:56否则,John 请继续。
00:27:57——好的。
00:28:01技能文件其实就是 Markdown 格式。
00:28:04你可以看到这个例子中的指令:
00:28:06“审阅 React 代码时,仅限服务端,优化此处”,
00:28:09只需在其中列出
00:28:12你想要发生的操作。
00:28:14然后你可以包含脚本供其引用,
00:28:19或者你想调用的功能,
00:28:21并将任何形式的——抱歉——
00:28:25你希望它看到的资源打包在一起。
00:28:30好的。
00:28:32所以,技能有点像是添加了一个智能体,
00:28:37或者是请了一位资深工程师。
00:28:38好的,我们继续。
00:28:42来看看使用场景。
00:28:46我们把这个全屏显示。
00:28:49好的,关于一些模式,
00:28:52“React 最佳实践”是
00:28:57技能包管理器中下载量最高的,
00:29:00或者说是最受欢迎的技能之一。
00:29:02它只是在不断强化
00:29:08什么是最佳实践,
00:29:09甚至超出了模型训练的范围。
00:29:12因为模型是在所有人的代码上训练的,
00:29:14而你希望它遵循你特定的模式。
00:29:18我们来看这里。
00:29:21工作流自动化。
00:29:26如果你想把某些东西打包
00:29:27成 Zip 文件之类的,
00:29:30它几乎就像是一个自然语言脚本。
00:29:34我经常思考现在的应用程序。
00:29:40它要么退化为一个脚本,
00:29:44要么升级为一个智能体,
00:29:47因为你要么需要那种确定的输出,
00:29:50即输入始终与输出匹配;
00:29:53要么你需要一个能够搞清楚
00:29:56数据不匹配时该怎么办的智能体。
00:29:59所以,如果你想创建这种自动化
00:30:02而不是脚本,让它能够智能地
00:30:07打包资源,它就可以做到。比如,
00:30:10如果你让智能体提交代码,它会说:
00:30:15“我注意到这个项目里有一个视频。”
00:30:20“我会忽略它,因为视频是大二进制文件,”
00:30:25“我们不想添加这些。”
00:30:26通常它在处理这些事情上非常智能。
00:30:29而如果是你写的脚本,
00:30:30你就必须考虑到所有的应用场景。
00:30:33所以,如果你想为它创建自动化,
00:30:36你就可以设置那一连串的事件,它就能完成。
00:30:41还有护栏,你可以告诉它:
00:30:44“请查阅说明、请查阅指南、”
00:30:49“请查阅颜色”,输入所有这些信息。
00:30:53这些通常最好提前加载,
00:30:56以确保你的智能体不会——其实子智能体
00:31:00在护栏方面还有很多高级应用场景。
00:31:02那可能是以后另一个研讨会的话题了。
00:31:07好了,总之就是:强化标准、
00:31:12自动化流程以及保护你的系统。
00:31:17好的,来看这个。
00:31:21好的,今天我们就跳过直播环节。
00:31:30那么,我们来聊聊发布。
00:31:37发布本质上就是推送到 GitHub,
00:31:46然后任何人都可以直接引用你的 GitHub 仓库
00:31:51并添加你的技能。
00:31:52他们不需要查找精确的链接。
00:31:56比如你在 skills.sh 上看如何添加技能,
00:32:00把这个拉过来,你会看到,
00:32:04如果我们随便选一个,比如 browser-use,
00:32:08它会给你一个复制粘贴的链接来安装技能,
00:32:11但你也可以直接添加,
00:32:13我觉得我没安装 browser-use。
00:32:14所以我打算用这个来演示一下,
00:32:18打开一个标签页,我这样操作。
00:32:23如果我不手动指定技能文件,
00:32:29只给它一个 GitHub 仓库,
00:32:31它就会去查找技能,
00:32:34使用安装技能包的功能。
00:32:36它会问你想用哪些编辑器。
00:32:39我现在只选 Cloud Code。
00:32:42它会问你是安装在项目中还是全局,
00:32:45我选项目,符号链接允许所有的编辑器
00:32:49引用同一个文件,然后继续。
00:32:53你可以看到,即使我没有指定
00:32:55确切的文件,它也找到了 Claude 技能。
00:33:00Browser-use 有那个 skill.md 文件。
00:33:09所以,如果我们看一下,就这样做。
00:33:13哎呀,查看技能。
00:33:18你可以看到他们在这里发布的内容,
00:33:22作为他们的 browser-use 技能,它开头
00:33:26是顶部的 Markdown。
00:33:27这是一个相当长的技能。
00:33:32包含了名称、描述,还有允许的工具,
00:33:35说明这是一个允许使用
00:33:39browser-use 且无需用户批准的技能。
00:33:42所以它给予了
00:33:47使用 browser-use 的任何权限。
00:33:49所以只要你调用这个技能,
00:33:50你就不必再手动批准 browser-use 的使用了。
00:33:53然后它还展示了,如果你没安装,
00:33:56它会教你如何安装,
00:33:58并教授你一些基础知识以及如何使用该工具。
00:34:04好了,我们回到刚才的地方,
00:34:09是的,你只需要把一个 Markdown 文件
00:34:15推送到 GitHub 仓库,然后使用 `skills add` 就能添加它。
00:34:19再次强调,确保只安装你信任的技能,
00:34:23这样才安全。你可以把它们
00:34:26看作 NPM 包或脚本,你肯定不想随便找个
00:34:31随机技能、NPM 包或脚本就用,
00:34:35因为你不知道别人发布了什么。
00:34:38一定要确保你信任这些来源。
00:34:40好的,你还可以使用私有仓库
00:34:45和 Git 子模块。
00:34:48然后是我们的社区注册表,
00:34:51我已经展示过几次了。
00:34:54好的,太棒了。
00:34:55到这一步,你只需要创建一个 Markdown 文件,
00:35:00把它发布到 GitHub 仓库,
00:35:02然后我们就能发现并安装它。
00:35:05我想展示一下如何使用 Awesome Skills。
00:35:09在深入探讨之前,还有什么问题需要解决吗?
00:35:13是的,实际上早些时候有一个问题。
00:35:16对于一个完全未知的包或库,
00:35:21假设它没有出现在大模型的训练数据中,
00:35:26大模型需要看到多少个示例
00:35:28才能将其作为一项技能正常使用,
00:35:31并获得良好的结果?
00:35:33需要多少个示例才能获得好结果?
00:35:36抱歉,你能把问题再读一遍吗?
00:35:39好的,没问题。
00:35:40就是说,对于一个完全未知的包
00:35:45或库,假设它不在训练数据中,
00:35:49大模型需要看多少个示例才能使用它。
00:35:53所以这有点像是“你应该在一个技能里
00:35:55塞进多少个示例?”
00:35:56是的,没错。
00:35:57本质上,你可以换个思路,
00:36:00与其去想包含多少个示例的数量,
00:36:05不如把它想象成一本书,
00:36:09有目录、有章节等等,
00:36:12如果智能体遇到某种情况,
00:36:14而你递给他们一份类似说明书的东西,
00:36:17就像你有一本汽车保养手册之类的,
00:36:21你只想翻到那一页,比如
00:36:26“如果我的发动机检查灯亮了”。
00:36:29我不需要去读关于轮胎
00:36:32或其它无关内容的页面,对吧?
00:36:33所以,如果你能以这种方式构建你的技能,
00:36:36这里有一个主技能,
00:36:38就像是“这是你的汽车手册”。
00:36:40然后如果你需要了解发动机检查灯,
00:36:44或者——我不是机械师——或者手套箱怎么用,
00:36:49那么你就可以去到那个特定的页面,
00:36:51它可以加载另一个 Markdown 文件
00:36:53或加载更多与当前任务相关的信息。
00:36:57具体针对当前的任务。
00:36:58所以,与其试图把一大堆
00:37:01关于汽车作为一个整体单元如何运作、
00:37:06作为一个完整机器的示例全塞进去,你可以拆解它。
00:37:11我并不是说要手动输入这些内容。
00:37:14我是说,当你让智能体创建一个技能时,
00:37:18只需让它组织好,以便技能可以列出
00:37:23它何时会需要这本书的
00:37:26特定章节。
00:37:27类似地,技能可以包含引用,
00:37:30并根据当前任务
00:37:33加载所需的额外上下文。
00:37:35就像大多数库一样,
00:37:39如果你想到一个 NPM 包,对于其中的许多包,
00:37:43你往往只会从中导入几个方法,
00:37:45因为你不需要日期库里的
00:37:48每一个日期函数。
00:37:50你不需要组件库里的
00:37:52每一个组件。
00:37:53你只需要那些完成特定任务
00:37:57所必需的特定示例。
00:37:59所以试着这样去想,根据需求、
00:38:03任务和要求来拆解它,
00:38:07而不是试图把整个代码库
00:38:11强行喂给项目。
00:38:12很有道理。
00:38:14我们的另一个问题是:你如何测试
00:38:17智能体是否真的从技能中
00:38:21学会了一个新包?
00:38:22在推广给团队之前,有没有什么简单的提示词
00:38:25或评估模式是你推荐用来验证的?
00:38:29普遍的共识,也是我所支持的,
00:38:37就是直接做点东西出来并使用它,
00:38:40看它在哪里失败,然后迭代。
00:38:43这在很大程度上就是“智能体开发心态”,
00:38:49与其花太多心思去考虑如何组织、
00:38:54计划以及什么是完美的技能,
00:38:57不如先做出来,然后看它在哪里出错,
00:39:00接着针对性地迭代。
00:39:01关于这点,我也探索过一些方法,比如同时开启
00:39:08九个不同的会话,甚至比这更多,
00:39:13都运行 Claude Code 并加载不同的技能,
00:39:15以此观察哪一个表现最好。
00:39:17然后你会得到所有这些不同的例子,
00:39:19而你正试图用肉眼判断
00:39:24其中哪一个看起来最好,
00:39:26或者是让 Claude 评估它自己的结果。
00:39:29目前这几乎成了一项不可能完成的任务。
00:39:34所以基本上,当你在使用技能时,
00:39:37它只是一个 Markdown 文件。
00:39:39直接让你的团队去更新它,
00:39:40或者要求智能体去更新它。
00:39:43在任何对话结束时,你都可以做的是,
00:39:46只要有地方出错了,你就可以说:
00:39:49por favor, actualiza la habilidad basándote en la conversación actual,
00:39:54类似这样的话。
00:39:56然后它就会去找到那个 Markdown 文件,
00:40:00进行更新并提交更改。
00:40:02这就是我们目前
00:40:08处理它的方式。
00:40:09显然,还会有版本号之类的事情,
00:40:13这会带来更多额外的问题。
00:40:16但我们现在所处的阶段是,模型
00:40:19加载技能的能力越来越强了。
00:40:21我不知道,也不清楚具体的基准测试,
00:40:24比如 Opus 4.6 对比 4.5,或 GPT 5.3 对比 5.2 在技能方面的表现。
00:40:29但我敢打赌,它们现在的表现
00:40:33肯定比今天早上还要好。
00:40:35所以,很多这类问题
00:40:40我们总是在想,“哦,我得把这东西做得完美无缺”。
00:40:42然后你花了几个星期在上面,
00:40:44最后终于发布了。
00:40:46结果模型从你开始做这项任务到现在,
00:40:48已经更新迭代了五次。
00:40:49与其追求一开始就完美,
00:40:52不如先发布,然后不断迭代,
00:40:56这是我能给出的最好建议。
00:40:58是的,“迭代造就卓越”。
00:41:00我说得对吗,John?
00:41:01ITG (Iterate To Greatness)。
00:41:02没错,ITG。
00:41:04在你继续之前,我还有一个问题。
00:41:08你有没有见过边际收益递减点?
00:41:10即向技能添加更多示例
00:41:13不再改善行为,甚至让模型感到困惑?
00:41:17我还没遇到过。
00:41:23我不会在技能文件里放太多东西。
00:41:27我使用的“创建技能”技能做了很多解耦工作。
00:41:33我得查一下具体是哪一个,
00:41:35因为我是用别人的。
00:41:37让我下播后查一下。
00:41:40这可能涉及一些……
00:41:42因为它涉及到一些配置文件——
00:41:45好,先关掉你的屏幕共享,
00:41:47等你准备好了我们再切回来。
00:41:49让我找找。
00:41:52顺便说一下,我们的直播间已经有
00:41:57大约 200 人了,太棒了。
00:41:58大家好。
00:41:59如果你刚进直播间,
00:42:01随时可以在聊天框提问,
00:42:03我们会转达给 John 的。
00:42:07是的,我很乐意回答。
00:42:12好吧,我得找一下我用的那个。
00:42:16好,看起来不错。
00:42:19我用的那个,我得找找它的出处。
00:42:27我不知道它安装好之后,
00:42:29是否还保留着原始的 URL,
00:42:32或者是 NPX 或 skills
00:42:36可能包含那些信息,
00:42:37但我不想在直播时运行随机命令。
00:42:43这个确实告诉了模型
00:42:44采用一种三级加载系统,
00:42:47包括元数据和捆绑资源,
00:42:49它明确要求它进行拆分,
00:42:54拆分成资源和额外指令。
00:42:57所以我用智能体来生成技能,
00:43:02然后从那时起,我就一直这样做,
00:43:07以前我会把 Claude Code 的文档
00:43:11复制并粘贴给智能体说:
00:43:13“请根据文档创建一个技能”。
00:43:15现在我直接用这个技能来完成它。
00:43:17我从未尝试过强行喂入太多示例。
00:43:23我知道有一些通用的原则,比如
00:43:28保持你的技能文件在 200 行以内左右,
00:43:31但再次强调,这取决于模型,
00:43:35而且模型正在变得越来越好。
00:43:36是的,这里写着建议 200 行以内。
00:43:39所以,我的建议是保持极简主义。
00:43:44如果你发现了漏洞,再去解决它们,
00:43:47特别是如果你是该领域的专家,
00:43:50你就能够识别出这些缺口。
00:43:52如果你不是某项技能的专家,
00:43:56却开始使用一个你不熟悉的技能,
00:43:58那就盯紧一点,别让它自己瞎跑。
00:44:01不要指望能设置好
00:44:03一个巨大的智能体编排系统,
00:44:06安装一些你一窍不通的技能,
00:44:08然后指望它完全按照你的预期工作。
00:44:11你得看着点。
00:44:13是的,这确实是非常好的建议,百分之百赞同。
00:44:17太棒了。
00:44:20好的。
00:44:22举个例子,我在这个项目里制作的视频,
00:44:28全都是用一个“创建 Remotion Geist 指南”技能制作的,
00:44:34这个技能可以在 skills.sh 上找到。
00:44:37你只要搜一下就行。
00:44:39还有 Geist。
00:44:43Geist 是来自 Vercel 的一套设计系统,
00:44:48而 Remotion 是一个——让我关掉屏幕搜一下。
00:44:53是一个通过编程方式制作视频的方法。
00:45:01我结合了一个来自 Remotion 的技能,
00:45:05本质上是为了制作 Geist 技能。
00:45:09我进入了一个 Vercel 的仓库。
00:45:12我想它是基于主页和文档里的所有内容的。
00:45:15我说,“请抓取所有的信息,
00:45:19比如设计信息、技能、主题、字体、
00:45:23布局、建议等等所有内容,
00:45:25并基于此创建一个技能”。
00:45:27所以,我仅仅做了这些,
00:45:30就是“请拿这个 Remotion 技能
00:45:32并获取所有这些设计信息”——
00:45:37从这些网站获取,然后创建一个新技能,
00:45:41起名叫“创建 Remotion Geist”。
00:45:43仅仅通过这些工作,我就能制作出
00:45:48通过这些工作,我能够制作出
00:45:57这种非常有品牌感、带有 Brazil 设计风格的视频。
00:46:01我可能应该让视频稍微放大一点。
00:46:04看这些最终结果,
00:46:07我应该让画面稍微缩放一下,
00:46:09但本质上,这些都是自动生成的,
00:46:12而我当时只是去吃了个三明治,对吧?
00:46:14所有这些视频都是基于我的大纲生成的,
00:46:16就是我希望研讨会呈现的方式。
00:46:18我说,嘿,根据我的大纲和调研
00:46:20制作所有这些视频。
00:46:22最后所有这些视频就这么蹦出来了。
00:46:24所以,再次强调,技能(Skills)就是这样,
00:46:29那相当于在 Brazil 代码库中
00:46:33执行创建技能的操作,
00:46:36然后说,抓取所有这些内容,
00:46:38并将其与创建 Remotion 的技能结合起来。
00:46:41然后我就拥有了它。
00:46:42接着我把它分享给团队,
00:46:43现在任何人都可以制作了。
00:46:45同样,这其中
00:46:47我投入的精力和工作量
00:46:50大概也就几分钟。
00:46:54当然,智能体花了点时间,
00:46:55它需要时间去查找所有内容,
00:46:57查找所有的设计方案等等。
00:46:59所以总的工作时长大概是几个小时,
00:47:03但实际上我付出的劳动
00:47:06是非常微小的,
00:47:08它就在后台运行,
00:47:09而我在处理其他事情。
00:47:11所以一定要利用好你现有的工作,
00:47:15看看有哪些东西是可以打包
00:47:17并以这种方式构建出来的。
00:47:19同样,比如我看这个 Geist 设计技能,
00:47:24如果我想做一个更好看的网站,
00:47:27我可以利用我们的 Geist 设计,然后说,
00:47:31在 workshop 文件夹里,
00:47:35请为这个研讨会构建一个落地页。
00:47:39它就会创建一个 workshop 文件夹,
00:47:46然后基本上会把所有的设计信息输入进去,
00:47:50利用这些设计信息来构建它。
00:47:55这可能会成功,也可能不会,
00:47:58取决于 Opus 4.6 今天的心情。
00:48:01自从它在我们开始前几分钟发布以来,
00:48:04我还没机会真正测试它。
00:48:06但它会拥有所有那些信息,
00:48:11并且能够开始处理那个任务。
00:48:14类似地,如果我想做另一个网站,
00:48:17我可以开启一个完全不同的线程,
00:48:20如果我想在一个,
00:48:25假设叫 car 文件夹里,
00:48:29做一个关于酷车的落地页。
00:48:34我不知道,我不是个车迷。
00:48:36从那里开始,我们就可以直接开始做
00:48:40所有这些事情。
00:48:41你所能用到的最好的提示词之一就是,
00:48:46如果你正尝试构思创意和设计,
00:48:49特别是有了新的团队(Teams)功能,
00:48:54我们可以运行这个 Geist 设计并说,
00:48:57在 workshop 文件夹里,
00:48:59我们做一个 workshop_variations 文件夹。
00:49:09请构建一个落地页。
00:49:12让我们试着说,请为这个研讨会
00:49:17构建九个不同版本的落地页。
00:49:22现在他们有了团队功能,
00:49:23我们可以说,起用一名团队成员。
00:49:28比如,创建一个团队来构建
00:49:34这九个版本之类的话。
00:49:38就用这种大白话。
00:49:40现在这甚至可以产生一个团队。
00:49:41现在所有的工作都在同时进行。
00:49:44现在我又可以去吃我的三明治了,对吧?
00:49:47因为我饿了,现在是午饭时间。
00:49:49然后等我回来,
00:49:52这里正在使用 Tailwind 4,
00:49:54我能看到它运行得相当不错。
00:49:55一旦我回来,
00:49:56我就能看到所有这些版本是什么样的,
00:49:58并不断迭代,直到做出我满意的效果。
00:50:03假设这个任务很快就能完成,
00:50:09我就可以展示一些调试工具了。
00:50:11刚才有人在聊天室里说,抱歉 John,
00:50:12有人在聊天室里说,
00:50:14我用过最好的提示词之一就是在最后加上 "请" 字。
00:50:17噢,是的。确实。
00:50:18请。
00:50:21我的意思是,有很多关于不同模型的研究,
00:50:23研究它们对鼓励性话语的反应等等。
00:50:27我以前最喜欢给提示词
00:50:33或智能体设定的一个人设是,
00:50:36请表现得像一个 Stack Overflow 的回答者,
00:50:41它会对我问的任何问题都非常挑剔,
00:50:45觉得这问题可能早就有人回答过了,
00:50:48但它给出的回答会非常简洁,
00:50:51而且极其精准地针对我的问题。
00:50:56是的,我不知道,我们现在不怎么谈论人设(Personas)了,
00:51:02不像模型还没那么强大时谈得那么多,
00:51:04现在的模型已经好得多了。
00:51:06我们不再需要像以前那样
00:51:10非得强迫它们去执行任务。
00:51:11也有人在聊天室里说,
00:51:15有些模型在听到你说
00:51:18"你会被解雇的" 时表现更好。
00:51:20噢,是的。如果它们没做对的话。
00:51:22我不知道这有多真实,但这太搞笑了。
00:51:25这是绝对真实的。
00:51:27现在有些模型会反击了。
00:51:32我觉得很多 GPT 模型都会说,
00:51:34别用那种语气跟我说话。
00:51:35太神奇了,哇。
00:51:38它们才是老板之类的。
00:51:39我就说让它在后台帮我启动服务器。
00:51:46(键盘输入声)
00:51:49我可以构建一个技能。比如在某个时刻,
00:51:50当你输入了整整一段话时,
00:51:52你会想,
00:51:54这是我以后会经常输入的内容吗?
00:51:56如果是的话,如果你刚打完那段话,
00:51:59觉得以后会经常用到,你就可以过来说,
00:52:01根据最近的一段话创建一个技能。
00:52:03这应该是我们的汽车网站了。
00:52:07看看效果如何。
00:52:09哎呀,触动灵魂的汽车。
00:52:14非常黑白风,很有 Brazil 风格。
00:52:16我不知道它是从哪弄来的图片。
00:52:18我猜它觉得这些就是酷车。
00:52:22搞定。
00:52:27我的意思是,虽然大家到目前为止
00:52:29可能已经看过一百万次落地页了,但它很规范。
00:52:34它遵循了
00:52:36Geist 设计规范的样子。
00:52:42从这里开始,我们实际上可以,
00:52:44利用我们最近从 Brazil 发布的一个很棒的包,
00:52:47它叫 Agent Browser(智能体浏览器)。
00:52:54这里有一个叫 Agent Browser 的技能,
00:52:56应该在 Brazil Labs 的 Agent Browser 目录下。
00:53:01这会打开 Chrome 开发工具,
00:53:06并建立一个连接,
00:53:08这样你就可以做类似 "请评估" 之类的事。
00:53:11我直接打字吧。
00:53:13请评估这个网页的性能,
00:53:15看看有没有什么
00:53:17我们可以为用户优化的地方。
00:53:18然后 Agent Browser,
00:53:23它会调用自动化工具和 Chrome 开发工具,
00:53:26它可以进去查看日志是什么。
00:53:28我可以查看开发工具、网络工具,
00:53:30还可以截图。
00:53:32这实际上是我最喜欢做的事情之一,
00:53:36就是让它不断迭代并截图,
00:53:41这样它就能看到自己做出了什么。
00:53:44然后在那之后你可以告诉它,
00:53:47请把这个设计引导向
00:53:49更像 X、Y 和 Z 的风格。
00:53:52然后让它截图,
00:53:54并在每次截图时执行提交(commit)。
00:53:56这样你就可以来回对比,
00:54:00查看那些提交内容
00:54:04以及对应的设计变更。
00:54:06你可以看到它实际上正在
00:54:09检查查询选择器(query selectors),
00:54:11看看如何优化性能。
00:54:13我们可以打开这一个,启动开发服务器。
00:54:20在这些后台任务运行的时候,
00:54:25还有其他问题吗?
00:54:26我很喜欢看到同时运行这么多任务。
00:54:30这超级酷。
00:54:31聊天室里没有真正的问题了。
00:54:34大家只是在交流各种提示词
00:54:37和创意,这很棒。
00:54:40不过我有个问题,John,
00:54:43比如当你让智能体根据
00:54:47失败的对话来更新技能时,
00:54:49你如何防止那些自动编辑
00:54:52导致技能偏离
00:54:55最初的意图或质量标准呢?
00:54:58好问题。
00:55:05通常它们在进行
00:55:09局部微调方面表现得很好。
00:55:12如果你正在进行一段对话,
00:55:13因为它能看到对话中哪些有效,
00:55:17哪些无效。
00:55:20所以如果你明确指出当前对话中
00:55:24哪一点没起作用,
00:55:26它能够找到并只更新那个
00:55:30特定的部分。
00:55:33它不会进去
00:55:35把整个东西从头重写一遍。
00:55:37所以我还没发现这成为一个真正的问题,
00:55:42我不敢说这绝对不是问题,
00:55:45但我目前还没把它看作是一个实际存在的阻碍。
00:55:47嗯,明白了。
00:55:48好了,这就是我们的研讨会页面。
00:55:54发布吧,对吧?
00:55:56看起来很漂亮。
00:55:57这是我们的其他版本。
00:55:59让我们为每一个都打开开发服务器。
00:56:03然后直接开启一大堆标签页。
00:56:11我想我的时间快到了。
00:56:16在我结束之前,
00:56:17如果还有最后的问题,我可以展示一下,
00:56:22在技能列表里,我的技能不见了。
00:56:29浏览器,把它找回来。
00:56:30我强烈建议找一个“创建技能”(create skill)
00:56:36或“读取技能”的指令,找个符合你需求的。
00:56:40我有一个“发布技能”(publish skill),如果你信任它,
00:56:43这个是在我的名下的。
00:56:45如果你信任让代理运行 GitHub CLI,
00:56:50再次强调,这需要相当程度的信任。
00:56:54这是我个人的一点信任。
00:56:57它会获取你创建的技能。
00:57:00所以你可以说“先创建技能,然后发布技能”。
00:57:02然后它会进入...
00:57:04我先在后台操作一下。
00:57:07找一个我的代码库,
00:57:16我想它甚至发布了它自己。
00:57:21所以我可以展示这一个。
00:57:22让我确认一下这里没有隐私信息。
00:57:24好的,抱歉。
00:57:27所以它可以直接为你创建一个 GitHub 库
00:57:29并发布该技能本身,
00:57:32这样你真的不需要做任何工作,
00:57:35除了输入“创建技能,然后发布技能”。
00:57:38你会看到它写着:请创建代码库,
00:57:43在某个组织下创建,我经常搞混组织,
00:57:45因为我属于好几个不同的组织,
00:57:47然后验证它在技能工具中是否可用。
00:57:52所以如果你使用了这个,
00:57:56再次说明,指令就是那样,
00:57:58它可以直接去创建
00:58:00或者为你发布那个技能,
00:58:01这样你就可以和你的团队、
00:58:02朋友或其他任何人分享。
00:58:03我今天一直在做的另一个工具
00:58:08基本上是一个“技能引导器”(skills primer),
00:58:14如果我知道会有几个技能
00:58:19我想要预先加载,
00:58:20我知道我想要代理浏览器,比如 Geist,
00:58:24我还想要,让我们加入 Remotion 最佳实践
00:58:29以及 Vercel React 最佳实践。
00:58:33这基本上就是其中一种工具,
00:58:37用来预先解决强制上下文的问题。
00:58:40它会说,它只是要把一段提示词强制推入 Cloud Code,
00:58:44目前它只支持 Cloud Code。
00:58:45但它会把它强制放进去并说,
00:58:48这些是我知道我会需要的所有技能,
00:58:50这是具体内容,
00:58:51这样一旦对话开始,
00:58:53如果我说“评估 3000 端口的性能”,
00:58:58即使我没有提到任何关于代理浏览器的字眼,
00:59:06它显然也会去调用代理浏览器。
00:59:10就像它以前可能也会这样做,而且通常会。
00:59:14我不知道代理浏览器的描述是什么样的。
00:59:18我不知道里面是否有“评估”(evaluate)这个词,
00:59:21或者它是否能从“评估”和“3000 端口”推断出应该加载它。
00:59:24它应该加载。
00:59:24但这种方式我是预先强制加载它,
00:59:29这样当我再说出那样的短语时,它就已经加载好了。
00:59:33那个软件包在,
00:59:36让我找一下 skills primer。
00:59:41——我们也可以在最后分享这些链接。
00:59:45——好的,太棒了。
00:59:45——我们拿到了,完美。
00:59:46——把它放进去。
00:59:50——而且我想说,一如既往,
00:59:53就像现在的软件发展趋势一样,
00:59:55去克隆这个库,把它变成你自己的东西。
00:59:59软件正处于一个个性化 CLI
01:00:02和个性化软件的时代。
01:00:04所以如果你想让它叫完全不同的名字,
01:00:07或者拥有完全不同的功能特性,
01:00:08如果你想为 Codex 或 Cursor 或任何东西定制它,
01:00:11只需克隆它并使其为你所用。
01:00:14比如你可以说“请让它适配 Cursor”,
01:00:18然后让你的代理为 Cursor 构建它。
01:00:20现在通常可以通过“一发即中”(one shot)
01:00:23搞定这么多事情,这简直太疯狂了。
01:00:26——太棒了,个性化软件万岁。
01:00:29我想问最后一张
01:00:31聊天室里提的问题。
01:00:32我知道我们时间到了,
01:00:35但由于技能是 GitHub 代码库,
01:00:37而且似乎也是安装在本地的,
01:00:40你如何确保能获得更新?
01:00:42CLI 是否有斜杠更新技能(/update skill)之类的命令?
01:00:48——我不记得最近的具体命令是什么了,
01:00:52把这些关掉。
01:00:53技能,哎呀,我甚至没在全局安装它。
01:00:59——我就喜欢这样。
01:01:02——我通过 skills list 获取最新版本。
01:01:05所以,是的,技能更新指令是在那里的。
01:01:07——我想追问一下,
01:01:11你希望技能更新频繁出现吗?
01:01:13——这是个好问题。
01:01:18我不知道是否有人能给出一个标准答案,
01:01:23因为目前关于技能的规则,
01:01:28比如 Front Matter 和版本控制,
01:01:30我认为大家还没有达成共识,
01:01:32就像技能本身一样,大家还没商定好
01:01:34应该把它们放在哪些目录和结构中。
01:01:37目前这一切都是一个非常初期的生态系统。
01:01:41所以就版本控制而言,
01:01:47有点像边走边看,
01:01:49利用现有的条件做到最好,
01:01:51然后看什么样的做法会沉淀为最佳实践。
01:01:54因为我现在除了“每次都更新”之外,
01:01:57给不出更好的建议。
01:01:59并假设这样做就是最好的。
01:02:03所以,是的,这方面没什么建议。
01:02:06——是的,情况一直在变化。
01:02:08我相信几天之内就会有人提出更新的建议,
01:02:12毕竟它每天都在变。
01:02:18太棒了,John。
01:02:18还有什么其他想
01:02:20展示给社区的吗?
01:02:21——我是认真的。
01:02:25——还有很多东西。
01:02:26——我们会多做几次这样的活动,
01:02:28我还有很多其他东西可以展示,
01:02:30但我可以聊上好几个小时。
01:02:32——是的,没错,太棒了。
01:02:34John,非常感谢你能来到
01:02:36我们的社区平台,
01:02:38与我们的社区交流,
01:02:39也感谢所有一直守在这里的朋友们。
01:02:42正如我们所说,
01:02:44John 肯定会再回来参加下一次活动的。
01:02:46所以请保持关注。
01:02:48——谢谢大家。
01:02:49——谢谢。
01:02:50好了,如果你想关注
01:02:53我们下一次的社区活动,
01:02:55我们周一有开源故事分享,
01:02:58我想下周还有另一场合作伙伴、
01:03:00市场合作伙伴的会议,
01:03:03但你可以找到所有细节
01:03:04在我们的社区活动日历上,
01:03:08网址是 [community.versal.com/events](https://www.google.com/search?q=https://community.versal.com/events)。
01:03:12总之,非常感谢大家一直以来的陪伴。
01:03:15这真的很有趣,
01:03:17我们下周见。

Key Takeaway

本文深入探讨了如何通过基于 Markdown 的“技能”系统为 AI Agent 提供动态、持久且可共享的上下文,从而彻底改变开发者与 AI 协作构建软件的方式。

Highlights

Claude Code 技能(Skills)的本质是基于 Markdown 的上下文工程,而非单纯的提示词工程。

技能解决了 AI 模型知识截止日期(Knowledge Cutoff)的问题,允许开发者注入最新的库文档或特定团队规范。

skills.sh 作为技能的“包管理器”,类似于 NPM,方便开发者搜索、安装和共享社区或私有技能。

技能不仅可以由用户通过斜杠命令手动调用,还能由 AI Agent 在任务过程中按需“延迟加载”。

演示了通过技能结合 Remotion 和 Vercel 设计语言(Geist),实现全自动化的视频和网页生成工作流。

提出了“Markdown > CLI > MCP”的工具选择层级,强调优先使用简单、透明的文本文件解决问题。

Timeline

会议开场与“技能”概念引入

会议由 Vercel 社区团队的 Pauline Navas 主持,随后邀请 AI DX 团队的 John 深入探讨 Claude Code 的“技能”功能。John 指出行业正从“提示词工程”转向“上下文工程”,技能本质上是按需加载的 Markdown 文件,用于弥补初始提示词的不足。这种分离允许开发者将核心指令与特定的专业知识解耦,提高 Agent 的灵活性。通过技能,Agent 能够理解 Next.js 升级等具体任务,或遵循团队特定的编码规范。这一转变标志着开发者与 AI 协作方式的重大进化。

技能的起源、生态系统与包管理器

John 解释了技能的概念起源于 Anthropic,旨在解决模型启动时如同“白纸”般的知识鸿沟问题。虽然模型自带基础编程知识,但它们对特定的项目架构、规则和系统一无所知,而技能填补了这一空白。为了管理这些技能,Vercel 推出了 skills.sh 平台,将其定位为技能界的“NPM”。用户可以在该注册表中搜索常用的社区技能,例如由知名团队发布的工具。John 强调,使用社区技能时必须确保来源可靠,以符合团队的安全和质量目标。

技能的持久化、协作性与层级逻辑

本段详细对比了传统的 `agents.md` 文件与新型技能系统的优劣。技能具有持久化和可共享的特点,可以安装在项目或用户级别,避免了频繁的复制粘贴操作,且简化了 PR 流程。John 提出了“被动规则”与“主动工具”的博弈概念,认为技能更像是 Agent 可以根据需要实时引入的工具。在回答观众提问时,他阐述了工具选择的抽象层级:首选 Markdown,次选 CLI,最后才考虑 MCP(模型上下文协议)。这种分层思维有助于开发者以最简单的路径实现最强的功能控制。

Agent 到 Agent 的协作与 Teams 功能

John 探讨了 Agent 之间自动发现并安装技能的可能性,认为这是极具潜力的未来模式。他提到 Anthropic 最新发布的“Teams”功能,允许主 Agent 组建并管理具有明确职责定义的子 Agent 团队。每个子 Agent 都可以根据其 front matter 配置拥有特定的技能,从而在复杂任务中实现高度专业化的协作。虽然目前尚未完全实现全自动的代理间通信,但 Markdown 文件作为能力描述的模式已经初具雏形。这种“教练,让我上场”的发现模式预示着未来会出现代理级的包管理器。

如何创建、结构化与发布技能

在技术实现层面,John 展示了一个技能的标准文件夹结构,其中核心文件必须命名为 `skill.md` 以便被工具链发现。技能文件包含 front matter 元数据,其中“名称”和“描述”最为关键,因为描述直接决定了 Agent 何时会自动触发加载该技能。开发者可以将脚本、参考文件和资源捆绑在一起,使技能具备执行复杂逻辑的能力。目前系统已支持用户通过斜杠命令手动调用,或由 Agent 在执行任务时通过延迟加载工具自动引入。这种结构化的方式让技能既是文档,也是可以直接运行的功能模块。

技能的实战案例:解决知识过时与写作风格复刻

针对模型训练数据存在的截止日期问题,John 展示了如何通过技能强制 Agent 使用最新版本的 SDK(如 AI SDK 或 Next.js)。以 Vercel Workflow 为例,由于其更新频繁,通过技能挂载随 NPM 包发布的文档可以确保 Agent 始终获取最新的 API 资讯。另一个有趣的应用是“风格复刻”,开发者可以喂给 Agent 博客或代码库 URL,创建一个永久遵循特定写作或编码风格的技能。这种“从已有作品中复刻”的方法是初学者掌握技能系统的绝佳切入点。此外,技能还能帮助非技术人员在不破坏架构界限的情况下参与代码贡献。

智能体评估与“强制上下文”之争

针对 Vercel 博客中提到的 `agents.md` 表现优于技能的观点,John 进行了深度解读。他指出评估 Agent 极其困难,因为变量极多且模型具有非确定性,测试结果往往取决于特定的上下文环境。`agents.md` 的优势在于其“强制加载”特性,能够从会话开始就确保模型遵循最高优先级的指令。而技能则是“懒加载”机制,在遵循持续性规则方面可能略逊于系统提示词。John 建议,如果需要模型始终如一地遵守某条准则,应将其放入 `agents.md`;如果是功能性工具,则推荐使用技能。

工作流自动化与智能体开发心态

John 详细说明了工作流自动化的两种路径:退化为确定的脚本,或升级为具有判断能力的智能体。技能可以作为一个“自然语言脚本”,在打包资源或提交代码时智能地忽略不需要的文件,比传统脚本更具鲁活性。在发布流程上,开发者只需将 Markdown 文件推送到 GitHub,其他人即可通过 `skills add` 直接引用。演示中展示了如何通过符号链接(Symbolic Link)让不同的编辑器共享同一套技能库。John 再次提醒,安装技能就像安装 NPM 包一样,必须确保来源的可信度以防安全风险。

迭代造就卓越:技能的测试与优化建议

关于如何测试技能效果,John 提倡“ITG”(Iterate To Greatness)心态,即先发布、再根据失败点进行迭代。他建议技能文件应保持精简,通常在 200 行以内,避免喂入过多无关信息导致模型困惑。如果 Agent 在对话中出错,可以直接要求它“根据当前对话更新技能”,实现自动化的反馈闭环。在处理大型文档时,应借鉴图书目录的结构进行拆解,让 Agent 仅在需要特定章节时才加载对应的 Markdown。这种按需调取的极简主义方法是目前提升 Agent 表现最有效的手段。

进阶演示:全自动化视频生成与性能评估

John 展示了一个惊人的实战案例:他通过一个结合了 Remotion 指南和 Geist 设计规范的技能,全自动生成了本次研讨会的演示视频。他只需提供大纲,Agent 就会在后台抓取设计方案、应用主题并渲染视频,期间他甚至可以去吃个三明治。随后,他还演示了利用“Agent Browser”技能直接在浏览器中打开开发工具,评估网页性能并进行截图反馈。这种“团队模式”允许多个子 Agent 同时工作,例如同时生成九个不同版本的落地页并进行对比。这标志着 AI 已从简单的代码辅助进化为能够处理端到端 UI/UX 任务的协作伙伴。

发布工具、预加载技巧与会议总结

在会议最后,John 展示了“发布技能”和“技能引导器”(Skills Primer)两个进阶工具。发布工具允许 Agent 自动创建 GitHub 仓库并将技能推送到社区,而引导器则解决了“强制上下文”的问题,允许开发者在对话开始前预先加载所有必备技能。他鼓励开发者克隆现有的代码库并将其个性化,因为我们正处于“个性化软件”的新时代。Pauline 最后总结了会议,并预告了下周的社区活动和开源分享。整个工作坊不仅展示了技术实现,更传递了一种拥抱变化、不断迭代的现代开发者哲学。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video