00:00:00在使用 Cloud Code、Codex 或任何其他代理工程工具时,有一个非常重要的
00:00:05概念,这些工具都支持它,你也应该理解并应用,那就是
00:00:12“代理技能”(agent skills)的概念。人们很容易忽视它们,因为它们只是一堆 Markdown 文件,或者
00:00:18设置起来可能很繁琐,但根据我的经验,这是值得的。就在几天前,
00:00:24Cloud Code 团队的一位成员(也就是 Anthropic 的员工)发了一篇帖子,分享了
00:00:31他们在内部使用的不同类型的技能,因为你确实可以区分
00:00:37想要创建的不同技能类型。虽然归根结底它们都只是 Markdown 文件,
00:00:42不过你还可以添加更多内容,我稍后会细说,但 Markdown 文件里的内容当然可以
00:00:49大不相同。现在,这张图片和这整篇帖子可能会让人感到不知所措,甚至导致
00:00:56你最终什么都不做,因为你觉得:“好吧,如果我要花一周时间来设置技能,那我干脆
00:01:02完全不用了。”这就是为什么我想在视频中提供一个替代方案。
00:01:08我认为你只需要关注三种核心技能类型,这就能带来更好的
00:01:15结果。顺便说一下,正如我提到的,所有这些工具都支持技能。我在各自的课程中讲解了
00:01:20如何设置、如何主动调用它们,以及如何为 Cloud Code 和 Codex 构建技能。
00:01:26如果你想获得这些课程,或者立即访问我的所有课程(包括未来课程),我目前
00:01:31正在进行促销。只要你拥有会员身份,就可以以极低的价格获得年度会员资格,
00:01:35让你畅学所有课程。链接在下方。但关于这些
00:01:41技能,它们只是 Markdown 文件,存储在一个特殊的地方。
00:01:46确切位置取决于你使用的工具,但最终它们是作为提示词模板或
00:01:52额外上下文存在的,可以注入到你的代理工程会话中。而
00:02:01第一种技能类型是“文档”或“知识”技能。
00:02:09这是什么意思呢?这里是我的 academy.com 项目,也就是我网站的项目,
00:02:15其中我准备了一堆代理技能,这些其实就是我向 AI 代理展示的
00:02:25各类文档或知识。例如,一些 TypeScript 知识,
00:02:33关于更高级 TypeScript 特性的知识,可能还有一些较新的特性,比如 “satisfies” 关键字,
00:02:40它并没出现十年之久。我想让 AI 代理意识到或被提醒这些内容,因为它可能
00:02:50不会第一时间想到这些,也许在它的训练数据中并没有见过太多这类内容。
00:02:58所以,这些内容你确实能在 TypeScript 官方文档中找到。问题是,
00:03:04除非你明确要求代理这么做,否则它很可能不会主动去查阅
00:03:11官方文档,它不会去看 TypeScript 文档。所以我宁愿拥有自己的技能,
00:03:17而这里的这个技能带有一些元数据。元数据非常重要,因为技能背后的核心理念是,
00:03:24并非所有可用技能都会每次都加载到上下文窗口中。相反,只有
00:03:30元数据会被加载到上下文窗口,然后 AI 代理可以根据你给出的提示词和任务,
00:03:37决定想要读取哪个技能的详细内容。你也可以根据使用的工具
00:03:43主动调用技能,但主要思路是代理根据元数据
00:03:47自行加载它们。所以在这里,我设置了一些元数据,试图让代理知道
00:03:55何时使用此技能。因此,这就是其中一类技能,即你提供额外的文档
00:04:02或代理可能不具备的知识,因为也许你正在使用某个库,
00:04:08由于它太新而不在训练数据中,或者你知道代理对它的了解
00:04:13不多,但你希望它能注意到。这就是我所说的第一种技能类型。
00:04:18第二种技能类型是“行为”、“最佳实践”、“方法”之类的内容。
00:04:29这里的想法是,当你开发一个项目时,你当然会对
00:04:37代码风格或某些功能的实现方式有特定的偏好。例如,我有这个“简洁现代
00:04:45React 代码”技能。它不怎么涉及 React 特性的文档,而是
00:04:50建立一些代理在编写 React 代码时应遵循的规则,以确保
00:04:59某些反模式不那么常见。至少对我来说,目前的 AI 代理生成的
00:05:08代码质量并不总是最高的。你可能会争论是否真的需要关心代码
00:05:13质量。我在另一个频道专门为此做了一个视频。但我认为
00:05:18这很重要,因为代码质量关系到代码的可评审性。它可能会影响
00:05:23性能,也会影响代码的维护或扩展难易程度。所以我认为它很重要。
00:05:29如果你希望代理使用某些特定行为或模式,那么这种
00:05:36“行为技能”就很有趣,在其中你可以告诉它如何编写优秀的 React 代码,它应该尽量避免
00:05:43使用 useEffect 以及如何避免。这种技能会非常有用。所以这里
00:05:50重点不在于提供额外的文档或知识,而在于指导行为。现在,
00:05:55这个技能有趣的地方在于,我这里有一些关联文件,其中一个文件包含了
00:06:02关于 useEffect 的更多细节。正如我所说,所有这些技能文件都是惰性加载的,
00:06:09你可以在技能文件中像这样引用 references 文件夹下的 useEffect.md 文件,
00:06:15然后只有当 AI 知道它正在处理 useEffect 相关的任务时,它才会决定加载
00:06:21该文件。这样,我在那里就准备了更多它应该注意的
00:06:27反模式详情。设置这类技能是非常值得的,
00:06:33因为我可以把它复制到任何 React 项目中,不需要每次都重写,
00:06:39它能让那里的代码更优秀。这就是我推荐的第二种技能类型,而且
00:06:45你不需要一次性想好所有想要描述的模式。相反,你可以循序渐进:如果你
00:06:52发现项目中 AI 代理总是在做一些你不想让它做的事情,
00:06:58那就添加一个技能,想出一个好的描述来增加该技能在合适时机被加载的
00:07:04几率,然后把你的指令放进去。用它来修复问题,随着时间的推移,
00:07:11你就会建立起一个拥有特定最佳实践和你想强制执行的行为的技能库,
00:07:17然后你就可以在未来的项目中使用它。所以不要把它看作是一个巨大的、令人望而生畏的前期
00:07:22任务,而是逐步建立起那个技能基础。现在谈谈第三种技能,
00:07:29这是一种不同类型的技能,它是“功能驱动型”技能。到目前为止我们讨论的是文档
00:07:37和强制执行特定行为。现在,像 Cloud Code、Codex 这样的代理工程工具,
00:07:43它们可以做各种事情。它们显然能写代码,但你的项目里并不局限于
00:07:49写代码。既然它们能写代码,只要你愿意,它们就能在你的电脑上做任何事。
00:07:55例如,你可以用它们来分析 PDF 文档,或者在我的系统中有一些全局技能,
00:08:03它们并不仅仅是针对编程的。虽然有些是,但并非全部。你可以设置一个技能来告诉
00:08:09代理如何生成图像。这是什么意思呢?
00:08:16当然,你可以使用各种服务或 API 来通过 AI 生成图像或视频,比如 fal.ai。
00:08:24顺便说一下,这不是赞助视频。还有 Replicate 以及各种不同的服务。现在,
00:08:29如果你想生成一张图像,比方说你的网站项目中需要一张占位图,或者
00:08:34为了完全不同的用途,比如一张你想打印出来挂在墙上的画。你可以利用这些
00:08:41服务。你可以使用 Codex、Cloud Code 或我非常喜欢的 Py Agent,要求它
00:08:49为你生成图像。默认情况下,它很可能会失败,因为这些代理工程工具
00:08:54本身并不内置图像生成功能。但如果你给它们一个正确的技能(这依然
00:09:00只是一个 Markdown 文件),你当然可以在里面描述如何与某个第三方
00:09:06API 交互来生成图像。现在,单纯描述这种交互可能是一种方法,但你可以
00:09:12更进一步。你的技能也可以附带脚本。并非所有技能都需要,但我的这个
00:09:18“生成图像”技能就带有一个。老实说,这个脚本是由 AI 编写的,是所谓的“氛围编程”(vibe coded),
00:09:26在这里,我有几个脚本可以与 fal API 进行交互,也就是那个图像生成
00:09:34服务。我基本上就是把它们的文档放进提示词里,然后告诉 AI 代理给我写
00:09:40一个工具,可以利用或调用 fal 的 API 来生成图像。于是就写出了一个小型的 CLI
00:09:49工具,一个可以调用该 API 并通过不同参数等方式生成图像的小脚本。
00:09:56然后那个 skill.md 文件只是解释了如何使用该脚本。它
00:10:02指向该脚本,并告诉代理如何执行它、要传入哪些参数等等。
00:10:08然后我这里有一个包含 fal 密钥的 .env 文件。当这个脚本通过 Bun 执行时(
00:10:18这是我在 skill.md 文件中告诉 AI 的),该 .env 文件会自动加载。所以我
00:10:23不需要把密钥给我的代理。我不需要对它说:“请生成一张图像,顺便说一下,
00:10:29这是密钥。”相反,我只需要告诉它生成图像。多亏了这段
00:10:34描述,它会在需要时加载这个技能,然后从中学到它只需要运行
00:10:39一个脚本,而不需要担心具体的实现细节。我认为这是另一种
00:10:45非常有趣的技能,不仅仅与编程有关。你当然也可以拥有一个
00:10:52脚本驱动的技能,比如格式化代码的技能,或者别的。但总的来说,
00:10:57因为你确实可以用这些代理做很多写代码之外的事情,所以
00:11:02这绝对是另一个值得关注的技能类别。但总而言之,我说不要把它搞得
00:11:08太复杂,但也别忽视它。相反,要逐步建立你的技能库。值得注意的是,
00:11:14当然也有像 skills.sh 这样的技能注册中心,你可以在那里浏览别人构建的技能。
00:11:21有两点重要的提示:这可能非常有用,但我不会做的是,比如:“好吧,我要
00:11:29开发一个使用了 Tailwind 和 Better Auth 等技术的 React 项目,所以我去搜索所有
00:11:35可能感兴趣的技能,并把它们全部安装到我的项目中。”这反而可能
00:11:40适得其反,因为你正在将越来越多的元数据加载到上下文窗口中,
00:11:47而其中一些技能可能根本不重要。所以这是一点需要注意的。我不会总是尝试
00:11:53添加理论上可以添加的所有技能。相反,你应该有选择性,专注于
00:11:57AI 经常出错的地方,或者你知道需要额外文档支持的地方。
00:12:04这是一点。关于这些注册中心的另一点当然是,你
00:12:09正在引入别人编写的技能。正如我们所知,这些技能其实就是提示词。如果
00:12:16其中一个提示词中含有恶意内容,那可能会是个问题。这可能导致提示词
00:12:22注入攻击,你应该意识到这一点。现在,据我所知,像 skills.sh 这样的一些注册中心
00:12:28会进行某种形式的扫描,以降低提示词注入的风险,但你永远无法保证 100%
00:12:36安全。因此,这是需要注意的地方。每当你使用别人编写的技能时,
00:12:40都要读一读它。它就在那儿等着你去阅读,看看里面是否有
00:12:47恶意内容。这只是一个提醒。但除此之外,去使用技能吧。不要觉得
00:12:54你需要构建什么超级复杂的系统。相反,多去尝试,并牢记这
00:13:00三类核心技能。