DLAI-Anthropic-智能体技能笔记-全-
DLAI Anthropic 智能体技能笔记(全)
001:课程介绍

在本节课中,我们将要学习智能体技能的基础概念,了解其工作原理、核心构成以及如何利用它们来扩展智能体的能力。
欢迎来到这门关于智能体技能的课程。本课程由Anthropic合作开发,并由回归讲师El Showe主讲。

技能为Claude及其他智能体提供了执行任务的新能力。我很高兴能再次与大家一同教学。感谢Andrew,我也很高兴能回来,并与大家共同探讨这个主题。
技能是一种扩展智能体能力的指令集合,它包含了专业化的知识。在本课程中,你将学习技能的工作原理、创建技能的最佳实践,并为不同的用例构建技能,包括编码、研究、数据分析等。
技能的令人兴奋之处在于,它们现在是一个开放标准。这意味着它们拥有标准化的格式,可以与任何兼容技能的智能体协同工作。因此,你可以一次性构建技能,并将其部署到多个智能体产品中。

任何技能都应包含一个名为 skill.md 的Markdown文件,该文件包含了技能的名称、描述和主要指令。主要指令也可以引用其他文件,例如脚本、额外的Markdown文件以及模板和图片等资源。

技能是逐步向智能体披露的。这意味着技能的名称和描述始终存在于智能体的上下文窗口中,但智能体只有在使用请求与技能描述匹配时,才会将指令的其余部分加载到上下文中。此时,如果需要,智能体可能还会加载引用的文件和资源文件。
为了使用技能,你的智能体需要一套基本工具:文件系统访问权限以读写文件,以及 bash 工具来执行代码。这些工具使你的智能体能够执行技能所需的任何命令。
你的智能体可以将技能与MCP和子智能体结合,以创建强大的智能体工作流。例如,它可以利用MCP从外部源获取数据,然后依靠技能来了解如何处理这些数据或如何高效地检索数据。它也可以将任务委托给具有独立上下文的子智能体,而子智能体本身可以使用技能来获取专业知识。
在本课程中,我们将从Cloud AI开始,为营销活动创建一个技能,并将其与预构建的Excel和PowerPoint技能结合。然后,我们将为内容创建和数据分析工作流创建两个技能,并通过Cloud API进行尝试。
之后,我们将使用Claude Code中的技能来审查和测试代码。最后,我们将使用Claude Agent SDK构建一个研究智能体,该智能体利用一个技能来整合研究成果。
我要感谢来自DeepLearning.AI的Harrison Salami对本课程的贡献。
那么,你如何知道何时该使用技能呢?假设你有一个需要反复要求智能体执行的工作流。与其每次都解释相同的工作流,你可以将其打包成一个技能,这样你的智能体就能自动知道该做什么。

这正是你将在第一课中与El一起学习的内容。请继续观看下一个视频以了解更多信息。

本节课中我们一起学习了智能体技能的基本定义、其作为开放标准的优势、核心文件结构、逐步披露的工作原理,以及技能如何与工具、MCP和子智能体结合来构建复杂工作流。我们还预览了整个课程的学习路径。
002:为什么使用技能——第一部分 🧩
在本节课中,我们将要学习什么是“技能”,并通过一个具体的营销数据分析场景,来理解为什么将重复的工作流程打包成技能会如此有用。我们将看到,技能如何帮助我们节省时间、统一标准,并更高效地利用AI的上下文窗口。
技能是什么?
技能是一组指令的文件夹,它将重复的工作流程、专业知识或新能力打包给你的智能体。
如果你发现自己经常在不同的对话中键入相同的提示词,就应该考虑将其转化为一个技能。接下来,我们将通过一个使用Claude AI的场景来探索如何做到这一点。


场景演示:营销数据分析


在深入探讨技能的具体构成和工作原理之前,我们先通过一个场景来展示技能的实用性。
初始数据分析
这里,我有一份CSV格式的营销活动数据,需要对其表现进行分析。数据包含日期、活动名称、展示量、点击量和转化量。
在我的第一个提示中,我附上了这份数据,解释了输入数据的结构,并要求Claude检查数据质量、进行漏斗分析,并计算一些关键指标,如点击率和转化率。在提示末尾,我还指定了期望的输出格式。




Claude读取了CSV文件,执行了数据质量检查和漏斗分析,并返回了活动表现分析报告。报告显示了总记录数、缺失数据以及存在的异常。进一步查看漏斗分析与基准数据的对比,我们可以清楚地看到哪些方面表现良好,哪些方面有待改进。这些信息对于调整营销活动和制定下一步策略非常有价值。
计算效率指标
接下来,我们要求Claude计算额外的营销效率指标,包括广告支出回报率、单次获取成本和净利润等,同样指定了输出格式。
我们看到效率分析的结果,再次明确了哪些有效、哪些无效,并获得了相应的解读。从投资组合表现和总净利润来看,我们正在盈利,但显然还有更多可以优化的空间。
预算重新分配分析
第三步,我们引入了一份额外的数据文件:预算重新分配规则。这份文件包含了大量关于如何在不同营销渠道间分配预算的规则,用于决定在哪些渠道增加、维持或减少预算。
这同样是大量针对我们特定用例的数据。虽然Claude知道如何处理决策和分析营销指标,但这里我们指定了具体的执行方式。这要求我引入外部文档,找到正确的规则,即使我对这个领域不是最了解的,也希望操作正确。
Claude根据规则进行了分析,我们可以看到哪些规则通过、哪些未通过,并提出了预算重新分配的建议,释放了一些预算,并分析了表现良好的渠道以分配额外预算。
传统方式的挑战
以上我们看到的是一个逐步进行的过程,它要求我们作为用户,每次都要输入必要的文档并具备预先的知识。
不仅如此,我输入的所有信息都会立即被添加到AI的上下文窗口中。如果我想进行其他类型的对话或询问不同的问题呢?这些信息并非总是必要的。
技能的解决方案:打包工作流
现在,我们来看看如何将这些信息打包成一个“技能”。技能是一个独立的资产(本质上是一个文件夹),它包含了如何执行活动分析的指令,同时可以精细控制哪些信息进入上下文窗口,哪些不进入。
我们刚才演示的是一个每周都要进行的活动表现分析。我不希望每周都重复复制粘贴相同的提示词。将其预打包成一个可以随时使用、与团队成员共享并根据需要编辑的技能,会是更好的选择。
技能文件剖析
那么,一个技能具体长什么样呢?它需要一个名为 skill.md 的Markdown格式文件,这个文件包含了执行我们之前所见任务的核心指令集。
在这个Markdown文件中,我包含了与之前提示词中非常相似的信息:
- 输入要求
- 数据质量检查
- 带有历史基准的漏斗分析和指标
- 效率分析
- 期望的输出格式
最后,我还有一个关于预算重新分配的说明,它仅在用户询问预算重新分配时,才会引用另一个文件。这是技能能更高效利用上下文的一个例子:只有用户需要时,才会读取和使用那个特定文件。
技能元数据:YAML头部
为了让技能按预期工作,我需要在文件开头添加一段YAML格式的数据。每个技能都必须包含一个名称和一个描述。
name: 技能名称,用于在需要时引用它,并在界面上显示是否正在使用。description: 技能描述,至关重要,它帮助AI模型理解何时应该使用这个特定技能。
name: analyzing-marketing-campaign
description: Performs weekly marketing campaign analysis including data quality checks, funnel analysis, efficiency metrics, and budget reallocation recommendations.
引用外部文件
技能还可以引用其他文件,只要它们都在同一个父文件夹内。例如,我们的 skill.md 中引用的预算重新分配规则文件,其内容就是我们之前在对话中直接输入的那些规则。
这样,我们就从在对话中直接输入指令,转变为将指令放入一个结构化的文件夹中。
创建技能文件夹
现在,我已经有了技能文件和相关的外部文件,接下来需要创建一个新的文件夹来存放它们。
- 创建一个文件夹,并以技能名称命名,例如
analyzing-marketing-campaign。- 命名规则:使用小写字母,单词间用短横线连接,避免使用“Claude”或“Anthropic”等保留关键词。
- 在该技能文件夹内,创建另一个名为
references的文件夹。这是技能开放标准中用于存放技能所引用的外部文件的特定目录。 - 将
budget-reallocation-rules.md文件放入references文件夹。 - 将
skill.md文件放在技能文件夹的根目录下。
最终,文件夹结构如下所示:
analyzing-marketing-campaign/
├── skill.md
└── references/
└── budget-reallocation-rules.md
上传并使用技能
创建好文件夹后,将其压缩成ZIP文件,然后上传到Claude AI。

- 进入Claude AI的设置,找到“能力”部分。
- 在“能力”页面底部,找到“技能”版块。
- 点击“添加”,上传你创建的ZIP文件。
- 上传完成后,可以看到技能的名称和描述。

现在,让我们看看技能的实际应用。开始一个新的聊天,附上同样的CSV数据文件,并输入一个与之前类似的提示,询问活动分析和预算重新分配。
如果一切正常,Claude会自动识别并应用我们上传的“每周营销活动分析”技能。它将按照技能文件中的指令执行任务,而我们不再需要来回复制粘贴大量的提示词。
我们可以看到,Claude读取了技能文件以确保遵循正确的指令。技能的名称和描述正是Claude能够识别并启用它的关键。由于我们询问了预算重新分配,它还会去读取技能中上传的那个额外文件。
分析结果与我们之前手动操作时类似:分析了各渠道表现(例如TikTok可能面临挑战),指出了有效和无效的方面,并给出了重新分配建议。但这一次,我们无需自己添加所有提示。
技能的扩展价值
这个技能可以在许多不同平台间共享。由于技能是一个开放标准,它在其他编码环境(如Cursor、GitHub Copilot等)中也得到支持。
我们不仅创建了一种将数据和分析流程打包到中心位置的方法,还更高效地利用了上下文窗口,其可移植性极具价值。
结合内置技能生成报告
最后,我们可以要求Claude根据分析结果创建一份带有特定信息和颜色编码的Excel报告。
实际上,创建电子表格和执行必要代码的能力,存在于Claude的一个内置技能中。因此,我们会看到底层技能被调用,代码运行以创建Excel文件,并最终输出符合我们要求的报告。
现在,我们得到了生成的电子表格,其中包含执行摘要、漏斗分析和效率分析。我们可以直接在Google Drive中打开或下载这个表格。
通过使用我们自定义的数据分析技能,结合Claude内置的电子表格生成技能,我们可以将CSV数据转化为有意义、可操作的见解,并以多种文件格式输出。
总结

本节课中,我们一起学习了“技能”的概念及其重要性。我们通过一个完整的营销数据分析案例,演示了将重复、复杂的工作流程打包成技能的过程。这包括创建 skill.md 文件、添加YAML元数据、组织引用文件、上传技能并最终应用它。技能不仅提升了效率、保证了分析的一致性,还通过智能管理上下文和提供卓越的可移植性,极大地扩展了AI助手的能力边界。下一节,我们将更深入地探讨技能的详细结构及其在整个AI生态系统中的位置。
003:为何使用技能(第二部分)🚀
在本节课中,我们将深入学习智能体技能的本质、其作为开放标准的特性,以及它如何通过提供领域专业知识、可重复工作流程和新能力来增强智能体。我们将探讨技能的构成、可组合性以及其独特的“渐进式披露”机制。
在上一节课中,我们学习了如何在 Claude 中创建技能,以及如何将包含数据的提示转化为可在不同对话中复用的技能包。
现在,让我们深入探讨技能究竟是什么,以及驱动它们的开放标准——类似于模型上下文协议。
技能:一个开放标准 📜
技能本身是一个开放标准,可以跨多种不同的人工智能应用使用。


虽然技能最初由 Anthropic 创建,但它现在已成为一个拥有特定规范的开放标准,被包括 Claude、Gemini、Cloud Code、OpenCode 等在内的众多平台采用。
基于这一点,我们来谈谈它的工作原理。
技能的文件系统结构 📁
当我们构建人工智能应用以使用特定技能时,我们需要利用某种文件系统。在使用 Cloud AI 或 Cloud Desktop 等工具时,我们会在该文件系统中加载包含 .skill.md 文件的文件夹,以及可以被引用的子文件夹或文件。
以下是我们之前操作的确切结构示例:
技能文件夹/
├── .skill.md # 技能主定义文件
└── 其他资源文件/ # 可被引用的脚本、文档等
同时,技能本身不仅可以包含其他 Markdown 文档,还可以包含可执行的脚本。
例如,我们有一个用于处理 PDF 文档的技能。我们需要将 PDF 转换为图像、从表单字段中提取信息,甚至用注释填充 PDF 表单。这需要执行代码,而这些需要执行的代码可以从 .skill.md 文件中引用。
因此,当我们开始探索自定义技能和内置技能时,重要的是要认识到技能不仅仅是引用其他文本文件的文本文件,而是可以引用脚本、说明其功能以及何时需要执行的文本文件。
技能还可以包含图标、图像和其他资源。当我们开始思考创建自定义样式和品牌时,技能真正大放异彩的地方在于那些 Claude 可能不完全了解你或你公司具体运作方式的领域。
你可以想象设计新闻稿、创建品牌指南等任务,Claude 对其有大致概念,但不知道你公司或团队的具体做法。


为何在构建智能体时引入技能?🤔
为了更清楚地理解为何在构建自己的智能体时要引入技能,我们需要回顾一下构建智能体思路的演变。
我们过去构建智能体的方式,是围绕具有单一目的的智能体展开的,例如编码、研究、金融、营销等。这些领域特定的智能体拥有一套特定的工具和完成任务所需的上下文。
但随着我们构建了更多单一目的的智能体,我们开始意识到,在底层,它们真正需要的只是一个简单的脚手架、底层工具(如 Bash 和文件系统)来查找、编辑、修改、执行和完成任何必要的任务。

这些更简单的智能体更容易评估、理解和扩展。
但这些智能体所缺乏的,是可靠完成工作所需的底层上下文和领域专业知识。
上下文可以通过模型上下文协议来提供,而领域专业知识正是技能的用武之地。
我们希望金融智能体以特定的方式进行财务分析。
我们希望研究智能体拥有必要的研究领域专业知识,并以我们期望的方式进行研究。
我们希望能够在许多不同的生态系统和智能体之间移植这种能力。
这就是我们拥有智能体技能的原因。
技能的核心优势 💪
这些技能为我们提供了程序性知识和用户特定的上下文,它们可以按需加载。

除了领域专业知识,技能还可以在非确定性系统中提供可重复的工作流程。在非确定性系统中,我们并不总是确切知道模型的输出会是什么,因此很难找到可重复的方法来产生相同的输出。
技能允许我们做的是,通过提供具有非常清晰步骤或指令的可重复工作流程,使智能体能够执行我们可以开始更准确预测的任务。
技能还引入了新能力的概念。这些是智能体开箱即用不知道如何做的事情,甚至是 Claude 完全不知道如何操作的数据。当我们引入这些新能力时,我们只需最少的额外上下文,就能为我们的智能体释放整个生态系统和新的功能。
当我们思考领域专业知识时,我们希望依赖那些 Claude 可能不知道如何做,或者知道如何做但不适用于你特定领域的事情。
Claude 可以进行数据分析,可以进行法律审查,但它如何按照你、你的团队或公司希望的方式去做呢?
我们之前看到了执行每周营销活动回顾的能力,我们希望这种能力在不同的个人和团队之间是可预测的。

当我们开始思考一些这些新能力时,比如生成演示文稿、Excel 电子表格、PDF 报告,以及在必要时执行脚本来完成这些操作,这正是智能体技能可以大放异彩的地方。
技能的可移植性与可组合性 🔗
我们之前在没有技能的情况下看到的是描述指令、尝试预测工作流程以及一次性将所有必要文件和上下文捆绑在一起的做法。
我们稍微谈到了技能的可移植性。虽然到目前为止我们是在 Cloud AI 中看到技能,但技能可以以完全相同的格式使用,不仅跨 Cloud Code、智能体和 API,而且由于智能体技能是一个开放标准,你可以在越来越多的智能体产品中使用它。
你可以在一个环境中创建技能,然后在许多不同的环境中使用、分享和扩展它们。
当我们说技能是可组合的时,这我们已经看到了。我们可以将像分析营销活动这样的自定义技能,与创建 PowerPoint 演示文稿、PDF 或 Excel 电子表格等内置技能结合起来。
我们不仅可以一起使用多个技能,还可以将它们组合起来构建复杂且可预测的工作流程。我们可以引用必要的技能、必要的步骤,并开始在一个非确定性系统中创建可预测的输出。


技能的渐进式披露机制 ⚙️
在底层,技能可以包含相当多的信息。我们看到了包含额外 Markdown 文件的例子,甚至看到了包含可执行脚本的例子。
你的系统中可以有数百个技能,而我们将要看到更多。但为了保护上下文窗口,技能是渐进式披露的。
渐进式披露的理念是只加载必要的数据。我们不希望用可能不需要的数据污染上下文窗口。技能引入了渐进式披露的概念。
当技能从文件系统加载时,只有技能的名称和描述被添加到上下文窗口中。这至关重要,这样 Claude 或任何其他系统才知道技能是什么以及如何触发它。
一旦该技能被触发,底层的 .skill.md 文件就会被加载。这是将数据加载到上下文中的下一个阶段。根据所需内容,如果需要加载和执行额外的文件或脚本,它们将被渐进式地加载。


这些额外的资源可以根据需要加载。如果有需要加载的脚本,这些脚本会被单独加载和执行,以避免用不必要的额外令牌污染上下文窗口。


通过使用 Bash 和文件系统等工具,Claude 可以只加载必要的信息,只执行必要的脚本和文件读取,并有意地只将必要的内容添加到上下文窗口中。
总结 📝
本节课中,我们一起深入探讨了智能体技能。我们了解到技能是一个开放的、可移植的标准,它通过提供领域专业知识、可重复的工作流程和新的能力来增强智能体。技能具有可组合性,能够构建复杂的工作流程。其核心机制“渐进式披露”确保了上下文的高效利用,只在需要时加载必要的信息和资源,从而在非确定性系统中实现更可预测的输出。

在下一节课中,我们将继续讨论技能,特别是它们如何与模型上下文协议、子智能体、底层工具等其他技术一起使用。
004:技能、工具、MCP 与子智能体

在本节课中,我们将探讨技能如何融入智能体生态系统,并与 MCP、工具和子智能体等其他技术协同工作。我们将确保理解这些组件如何在现有应用中共同发挥作用。
概述
我们将学习如何将技能与工具、模型上下文协议和子智能体结合,以创建强大的智能体工作流。我们会逐一剖析每个组件,了解它们如何协同工作,并明确各自的适用场景。
技能与模型上下文协议的对比
上一节我们介绍了技能的基本概念,本节中我们来看看技能与模型上下文协议的关系。
模型上下文协议将我们的智能体或AI应用与外部系统和数据连接起来。这些外部数据可能来自数据库、Google Drive或各种其他系统。当需要模型本身不了解的外部数据和上下文时,模型上下文协议就非常有帮助。
您拥有的技能可以利用模型上下文协议提供的底层工具和数据,来教导您的智能体如何处理这些数据。可以将模型上下文协议视为引入我们所需的所有底层工具,而技能则是一套指令,用于将这些工具组合起来,构建可重复的、能产出您所需数据的特定工作流。
当我们考虑利用外部数据来计算指标、进行研究或计算数据时,所有这些底层工具都可以通过模型上下文协议从外部提供。
技能与工具的对比
接下来,我们思考一下技能与工具的区别。我喜欢用一个类比:工具更像是较低层级的组件。
您可以想象拥有像锤子、锯子和钉子这样的工具,而技能则像是“如何建造一个书架”。工具本身是访问系统、为智能体提供完成任务所需能力的基本方式。
实际上,工具在底层被用来驱动生成技能、读取技能的能力,甚至为执行代码和加载这些技能生成文件系统。技能通过引入需要执行的额外文件和脚本来扩展能力,但执行这些底层脚本和文件的能力是由工具提供的。
某些智能体生态系统内置了工具,我们也可以编写自己的工具,或通过模型上下文协议加载工具。工具定义始终驻留在上下文窗口中,而技能则在需要时逐步加载。
当我们思考这些如何协同工作时,技能允许我们创建可预测的工作流,而这些技能可以引入可执行的脚本,类似于按需使用的工具。如果我们有一个不需要在每次对话中都使用的工具,我们可以通过技能和渐进式披露仅在需要时使用它。
子智能体的角色
现在,让我们看看子智能体如何融入这个组合。首先,我们定义一下什么是子智能体。
我们有一个主智能体,它可以生成或创建子智能体,子智能体可以向父智能体报告。这些子智能体可以通过 Cloud Code 或 Agent SDK 等生态系统创建,我们也可以自己创建。
当我们思考子智能体提供的价值时,主要考虑的是拥有一个具有细粒度权限的隔离上下文,以及并行执行任务的能力。关于子智能体能访问什么,我们有受限的工具权限,并且可以指定每个子智能体可以访问哪些技能。
因此,虽然主智能体可以作为协调器,并可以利用任何必要的技能,但子智能体也可以遵循类似的思路,使用特定的技能。
子智能体与技能配合得非常好。例如,我们可以有一个特定的子智能体,如代码审查员,其唯一任务是分析和审查代码库,并利用那些明确规定您、您的团队或您的公司如何进行代码审查的技能。
综合应用:客户洞察分析器示例
当我们把所有组件放在一起时,可以提供一个“客户洞察分析器”的类比。让我们思考这一切如何协同工作。
我们有一个主智能体,它被赋予一组工具。这些工具可以由 MCP 服务器提供。我们可以引入数据、资源和执行任务所需的工具,以派遣子智能体来分析客户。
我们可能会分析客户访谈或客户调查,并在隔离的环境中并行处理它们,以便更快地获取数据。当我们思考如何实际分析客户洞察、如何分类反馈、总结发现、如何分析访谈和调查,以及如何确保我们以可预测的方式、在正确的时间加载正确的工具来完成这些工作时,这就是技能发挥作用的地方。
我们从外部引入数据,如果需要并行执行并在单独的线程和上下文窗口中运行,则利用子智能体,并且我们引入技能,以可预测、可重复和可移植的方式消费所有这些信息。
总结与要点
本节课中我们一起学习了AI生态系统中的许多不同组成部分。
当我们思考构建AI应用时,从根本上说,我们有提示词。提示词是对话中最基本的原子单位,是我们与模型沟通的基础工具。但提示词本身在团队和公司间的扩展性并不好。

为了捆绑这些底层的提示词、对话、代码和资产,我们可以利用技能。被委派任务的子智能体可以使用技能,这些子智能体随后可以从主智能体那里消费必要的工具,这些工具是通过模型上下文协议定义的。
当我们思考这些特定功能旨在解决什么问题时,我们希望非常谨慎地考虑如何加载这些信息以及它们最适合用于什么场景。考虑到上下文窗口是一种公共资源,我们希望有意识地决定何时使用子智能体来帮助我们最小化主上下文窗口中的内容,以及MCP如何加载必要的数据,技能如何在需要时逐步加载。
当我们讨论持久性以及如何考虑将事物存入长期记忆时,对于子智能体,我们可以在子智能体和父智能体的多次会话中保持持久性;对于技能,我们可以在用户与AI应用的多次对话中保持持久性。
因此,在思考每个步骤的用途时,我们希望将技能用于程序化的、可预测的工作流,而将子智能体仅用于必要的、专门任务的完整智能体逻辑。

在下一课中,我们将看看 Claude 附带的一些预构建技能,深入研究这些技能的代码仓库,深入探讨一些技能 Markdown 文件,并讨论一个非常有用的技能——“技能创建器”,这样我们就不必从头开始手动创建所有技能了。
005:探索预构建技能
在本节课中,我们将学习 Anthropic 提供的预构建技能,了解它们如何融入整个 AI 生态系统,并探索如何将这些技能与我们自己创建的技能以及 MCP 服务器结合,构建一个完整的数据分析和演示文稿生成工作流。
预构建技能概览
在第一节课中,Claude AI 使用了 Excel 技能来创建展示营销结果的电子表格。Excel 技能是 Anthropic 的预构建技能之一,其他预构建技能还包括 PowerPoint、Word 和 PDF 技能,以及一个技能创建器技能。
现在我们已经了解了技能在整个 AI 生态系统中的位置,接下来让我们看看一些开箱即用的预构建技能。这些技能可以在 Claude AI 和 Claude Desktop 中使用,你也可以通过像 Claude Code 这样的工具自行安装,这些工具位于 GitHub 上的 anthropic/skills 代码库中。
让我们查看技能文件夹,看看有哪些内置技能。所有这些技能都已准备好用于生产环境,我们在之前的课程中已经看到了 Excel 技能的使用案例。
需要注意的是,这个技能列表虽然由 Anthropic 创建,但实际上分为两个不同的部分。用于 Microsoft Docs、PDFs、PowerPoints 和 Excel 的技能被称为文档技能。这些是内置的,并且总是在像 Claude AI 这样的工具中使用。其余的技能是我们创建的示例,你可以在 Claude 中开启或关闭,但默认情况下,除了技能创建器,其他都是关闭的。
分析 PowerPoint 技能
首先,让我们从分析 PowerPoint 技能开始。
我们可以像查看其他结构一样,看到一个 skill.md 文件以及其他引用的文件和文件夹。在这个 skill.md 文件中,我们有相同的 YAML 前置元数据,其中包含名称和描述。
你在这里看到的是 GitHub 如何渲染这个 Markdown 文件,但底层代码看起来与我们之前创建的非常相似。如果你熟悉 Markdown 文件,可以以这种方式查看。我将切换回预览模式,因为它看起来更美观一些。
当我们查看这个技能的工作原理和功能时,我们有一个概述。用户可能会要求创建、编辑、分析 PowerPoint 文件的内容。这是它的样子,这是你阅读它的方式。如果有需要完成的特定任务,有底层的脚本来执行。请记住,这些不是开箱即用的,只有在必要时才会加载和执行。
我们可以用 PowerPoint 演示文稿做很多事情,包括颜色、版式。正如你所想象的,这就是我们如何开始制作看起来更美观、更像真实世界演示文稿的东西。
我们有一些设计原则、必要的要求,以及当用户未指定时,可以让 Claude 选择的调色板。
这个 skill.md 文件相当长,因为我们可以用 PowerPoint 演示文稿做很多事情,但在本课后面,我们将看到如何实际使用这个技能,将现有数据转化为美观的演示文稿。
探索技能创建器技能
接下来我想向你展示的技能有点“元”概念,它叫做技能创建器。技能创建器是一个技能,其目的是以编程方式为你创建技能,而不是从头开始创建必要的文件和文件夹结构,技能创建器可以为你完成这些工作。让我们看看 skill.md 文件,看看这里发生了什么。
与其他技能类似,我们有一个名称和描述。实际上,我将查看底层代码,因为它更容易理解。
在这个 skill.md 文件中,我们指定了什么是技能,它提供什么,然后我们包含了一些与技能相关的最佳实践。我们将在下一课深入探讨这些最佳实践,但你可以想象,当 Claude 以编程方式为你创建技能时,我们希望利用其中一些最佳实践。
当我们查看技能创建过程时,我们对这里的步骤极其明确。因为我们想使用这个技能来创建一个可预测的工作流,所以我们希望非常明确步骤是什么,如何遵循它们,以及仅在某种原因存在时跳过什么。我们从具体示例开始,规划可重用的技能内容。在这里,你可以开始看到一些非常有用的示例,当你想创建一个技能时,Claude 可以进行模式匹配。
当我们在这里初始化技能时,我们运行底层的 Python 脚本来执行必要的任务。让我们看看这些脚本做了什么。
在 scripts 文件夹中,我有三个 Python 文件:一个用于初始化技能并提供底层文本的脚本,一个用于打包该技能的 Python 文件,以及一个用于验证该技能的脚本。
让我们看看这个底层代码如何初始化一个技能。我们获取一个现有的模板,其中包含一些 YAML 前置元数据和一些占位符及待办事项,然后根据传入的数据填充它。这个底层脚本允许我们在制作技能时创建必要的文本文件。
一旦我们生成了必要的文件,我们就可以打包它。在这里你可以看到,我们引入了必要的模块来压缩我们的技能,并确保我们在正确的文件夹和文件结构中完成此操作。
最后,我们还有一个脚本用于执行技能的验证,确保 skill.md 存在,验证一些 YAML 前置元数据,并确保我们放入文件夹和文件中的内容是正确的。
我们将利用这个技能创建器技能,将我们拥有的现有内容打包成可重用和模块化的脚本。现在,让我们继续将注意力转回 Claude,看看如何将内置技能、我们自己的技能与 MCP 服务器结合成一个可预测的工作流。
在 Claude 中配置和使用技能
回到 Claude,让我们去看看并确保我们启用了正确的技能,以及这些技能位于何处。
回到设置中的功能部分。我们之前看到可以在这个部分创建技能。我想向你展示我们拥有的示例技能,这应该看起来很熟悉。这就是我们在 GitHub 上看到的。
默认情况下,这些技能是关闭的。如果我们想开启它们,我们完全可以这样做。默认开启的技能是我们刚刚看到的技能创建器。
需要注意的是,虽然技能创建器在创建底层技能和必要结构方面非常有效,但我们仍然需要对我们提供的提示和将要制作的技能中输入的数据保持有意识。
我们现在要做的是将所有关于技能、MCP 和提示的想法结合起来。首先,我们将修改之前创建的用于分析营销活动的技能,使其不使用 CSV 获取数据,而是使用 BigQuery。如果你不熟悉,BigQuery 是由 Google 提供支持的数据存储。为了引入必要的工具和上下文来使用 BigQuery,我们将连接一个 MCP 服务器。因此,我们将使用技能创建器技能来修改我们之前的营销分析技能以使用 BigQuery。
然后,我们将使用技能创建器创建另一个技能。这将用于品牌指南的目的。我们将包含一个指定指南的文件以及徽标,并为自己构建另一个技能来执行该任务。
最后,我们将采用我们用于提取和分析数据的两个技能,以及利用品牌指南,并将它们与用于创建 PowerPoint 演示文稿的内置技能结合起来,创建一个利用提示、技能和模型上下文协议的工作流。
在我们开始之前,你可能想知道我们之前看到的 Excel、PowerPoint 和其他文档技能位于何处。这些是内置在 Claude AI 中的,不是可以开启和关闭的东西。
构建完整工作流
考虑到这一点,让我们开始这个工作流。在我们修改分析营销活动技能以使用 BigQuery 之前,我们还要注意,我们在这里使用 Claude Desktop 来连接到本地 MCP 服务器以利用 BigQuery。
所以让我们看看那个 BigQuery 服务器是如何配置的。我将转到设置、开发者部分,在这里我们可以查看特定项目的底层命令和参数以及环境变量,以及我的凭据所在的位置。
对于这个例子,我们不必使用 BigQuery。你可以使用数据库或其他外部数据存储,但我们只是想展示技能和 MCP 服务器协同工作的样子。
如果你有兴趣查看那个底层配置文件,这就是它的样子。在这个配置文件中,我们指定要连接的服务器以及 Claude Desktop 启动时运行的底层命令。
考虑到这一点,让我们继续修改我们之前的技能,现在使用 BigQuery 而不是 CSV 进行数据访问。
为了确保这正常工作,首先让 Claude 列出 BigQuery 中的表。
这存在。这将利用我们拥有的 MCP 服务器,我们将允许这个操作。
我们应该会得到表的列表,在这个例子中,我们只有一个。
所以在这里我们可以看到,有一个名为 marketing 的数据集包含一个表。
现在我们将让 Claude 显示这个表的模式。
希望 Claude 能纠正那个小的拼写错误,我们应该就能继续了。
在这里,我们指定了表的样子,这看起来很好,当我们继续更新分析营销活动技能时,我们将利用这个模式。
我们现在要做的是让 Claude 更新我们的分析营销活动技能,使其不是从 CSV 上传获取数据,而是从 BigQuery 拉取。我们指定来自 BigQuery 表的数据,特别是我们上面刚刚看到的模式,因为我们都在一个对话中,Claude 应该没有问题查看模式是什么。我们为此指定了一些要求。
就像在我们现有的技能中一样,我们要确保对我们预算重新分配规则的引用不会被修改。
正如我们之前谈到的,技能创建器技能非常有帮助且高效,但我们仍然需要提供必要的上下文。
注意这里,它要做的第一件事是分析必要的技能结构,并使用我们的技能创建器技能来修改现有技能并遵循最佳实践。
我们现在将继续创建更新后的技能,并生成一个新的 skill.md 文件。
在这里,我们可以开始看到一些与我们之前的技能相似的东西。但是,它添加了 BigQuery 而不是 CSV 上传。在底层,我们使用文件系统和 bash 工具为我们创建必要的文件和文件夹结构。
我们在这里看到的是,我们使用 BigQuery 而不是 CSV,并且我们遵循了将 MCP 服务器与技能结合使用的最佳实践,我们指定了服务器和工具的名称。技能创建器正在遵循最佳实践来修改我们现有的技能。
因此,正如我们指示技能创建器时,当我们指定我们的必需输入时,我们现在正在实践中看到这一点。最佳实践是不要使用模糊的日期范围或整个范围,所以我们要求用户澄清,当我们展示查询示例时,我们指定一个日期范围。所以我们放入的一些工具和要求在我们更新这个技能时被直接应用。
所以我们的技能看起来状态很好。为了确保这个技能被保存到后续的对话中,让我们继续复制这个技能。
创建品牌指南技能
现在我们将转换方向,创建一个新的品牌指南技能,我们将与这个技能一起使用,以创建一个引人注目的数据驱动的 PowerPoint 演示文稿。
所以让我们继续开始一个新的聊天,我们将让 Claude 从我们上传的文件中创建一个品牌指南技能。我要做的第一件事是上传一个包含我的品牌指南的文件,以及一些将在演示文稿中使用的徽标。
在我们继续创建这个技能之前,让我向你展示这些品牌指南是什么样子。我有一个调色板、支持颜色、版式。Claude 知道如何设计东西,但技能真正闪耀的地方在于,你可以告诉 Claude 你希望为你的公司如何精确地完成事情,包括徽标、颜色、字体。这是一个很好的例子。现在,让我们继续从这些文件中创建一个技能,我们可以将其应用于未来的演示文稿和文档。

我们将在这里再次看到技能创建器技能在行动。我们利用现有的工具和技能来使用最佳实践,以及指南和徽标来制作一个可重复和可移植的技能。
我们将分析其他现有技能,看看它们使用什么模式,并确保我们正在创建的这个新技能可以补充它们。这非常有价值,因为我们将把它与 PowerPoint 演示文稿一起使用。
现在我们对需要做什么有了很好的了解,让我们运行之前看到的那个初始化技能 Python 脚本。这将创建底层技能,现在我们可以开始将我们的资源添加到技能的 assets 文件夹。

我们将开始看到颜色填充、强调色、字体、版式,稍后,我们将拥有一个技能,当我们需要进行设计时,可以开始将其添加到所有未来的对话中。
我们的徽标被引入,Word 文档和 PDF 被指定,演示文稿布局按照我们希望的方式设置。
技能创建器已经运行完成。在这里,我们有一个遵循最佳实践创建的 skill.md 文件,带有名称和描述,以及包含必要数据和徽标的底层文件夹。
我们需要再做一步来确保这个技能被添加到未来的对话中。为了确保这个技能被保存到后续的对话中,让我们继续复制这个技能。
一旦完成,我们应该在已创建技能列表中看到这个技能。
结合技能生成演示文稿
现在我们已经更新了我们的技能,从 CSV 迁移到 BigQuery,并为我们的品牌指南创建了一个新技能,让我们将它们结合起来,与内置的 PowerPoint 演示文稿技能一起构建一个工作流,首先分析我们的数据,然后生成一个演示文稿。所以我们将首先分析 BigQuery 中不同星期的营销数据,看看每个渠道的表现如何,然后基于这些数据,使用我们的品牌指南生成一个演示文稿。让我们看看这看起来怎么样。
首先,我们将继续读取相关的技能文件,这包括我们的营销活动分析,并将包括我们的 BigQuery 指南。
我们将继续确保我们拥有正确的 PowerPoint 演示文稿技能,以及我们用于样式设计的品牌技能。
在底层的 PowerPoint 演示文稿技能中,有关于演示文稿创建的额外文档。
首先,我们将从 BigQuery 开始。我们将查询必要的数据。
我们可以查看正在编写的底层 SQL,就像我们之前看到的那样,以及我们正在寻找的日期范围。
现在我们有了数据,我们将使用这些指标继续生成一个 PowerPoint 演示文稿。我们将使用我们在品牌样式中建议的样式设计来完成这个任务,并将其转化为 PowerPoint 演示文稿。可以在这里看到为我们的幻灯片编写的底层 CSS 和 HTML。
然后,我们将依赖内置技能来创建底层演示文稿。
现在我们有了正确的 HTML 文件,让我们继续创建我们的演示文稿。
在这里,我们使用原生的 PowerPoint 技能,并编写必要的代码来创建演示文稿。
我们可以看到,即使存在特定问题,模型也会返回,编辑任何必要的内容,并依赖确切的工作流,不仅用于运行必要的代码,还用于验证需要完成的工作。
模型具有回溯和遵循特定模式的能力,这使我们能够创建没有内置问题的演示文稿,这些问题需要我们立即纠正。所以我们看到 Claude 已经完成了验证,幻灯片看起来很好,现在它将继续生成那个底层的 PowerPoint 演示文稿。
我可以在 Google Drive 中打开它并用作 Google Slides,或者我可以直接下载。
在这里,我们可以看到我有一些非常好看的幻灯片,带有我特定公司想要的颜色、字体、徽标和一切。我们有我们的效率分析、漏斗分析,以及突出显示需要审查的内容和表现良好的内容的执行摘要。
我可以下载这个演示文稿。我可以继续在此基础上构建,并再次在 Google Drive 中打开它以与队友分享。我可以继续提示和处理这个演示文稿。
但我们在这里看到的是一个底层的 PowerPoint 演示文稿,它由内置技能与我们制作的两个技能结合创建,同时通过 MCP 服务器从 BigQuery 拉取数据。
在下一课中,我们将探讨一些关于创建技能的最佳实践,并查看我们创建的另外两个自定义技能,看看我们是否遵循了最佳实践。
总结

在本节课中,我们一起学习了 Anthropic 提供的预构建技能,包括文档技能和技能创建器。我们深入探讨了如何利用技能创建器来修改现有技能(例如将数据源从 CSV 迁移到 BigQuery)和创建全新的技能(如品牌指南技能)。最后,我们成功地将内置的 PowerPoint 技能、我们自定义的营销分析技能和品牌指南技能与 MCP 服务器结合,构建了一个从数据分析到生成品牌化演示文稿的完整、自动化的工作流。这展示了如何通过组合不同的工具和协议,让 AI 智能体执行复杂、多步骤的现实世界任务。
006:创建自定义技能 📚

在本节课中,我们将深入学习智能体技能的结构以及创建技能的最佳实践。然后,我们将应用所学知识分析两个具体示例:一个用于根据讲义生成练习题,另一个用于分析时间序列数据的特征。

技能结构与最佳实践概览 🔍
上一节我们介绍了技能的基本概念,本节中我们将详细探讨技能的内部结构。

每个我们创建的技能都必须包含一个 skill.md 文件,其开头是 YAML 格式的“前言”部分。这部分需要包含名称和描述。在 skill.md 的主体内容中,我们编写技能的核心指令,并可以引用仅在必要时加载的脚本或其他文本文件等资源。
名称与描述的最佳实践 ✨

以下是关于为技能命名和撰写描述的核心要点:
- 名称:最多64个字符,只能包含小写字母、数字和连字符。最佳实践是采用“动词+名词”的形式,例如
generate-questions。 - 描述:最多256个字符。描述不仅要说明技能做什么,还要说明何时使用它。如果某些特定关键词会触发智能体使用此技能,务必在描述中强调它们。
可选的元数据字段 📄

除了必需的字段,智能体技能规范还允许一些可选字段。
这些可选字段可能包括许可证信息、兼容性说明以及在元数据中任意添加的键值对。需要注意的是,虽然存在智能体技能的标准规范,但你可能会遇到一些技能(包括Anthropic内置的或其他开发者创建的)并未完全遵循此规范。这些技能和规范本身都处于积极开发中,因为我们需要适配众多不同的模型提供商和智能体工具生态系统。

编写技能主体内容 📝
当我们越过YAML前言,进入技能的主体内容部分时,对于格式没有硬性限制。
然而,为了构建可预测的工作流,确保你提供了分步指令。正如我们在其他技能(尤其是技能创建器技能)中看到的,明确指定边界情况和分步指令非常重要。如果某一步可以跳过,必须清楚说明原因。通常,将内容保持在500行以内是最佳实践,因为我们总是可以在必要时引用外部文件、资源或脚本。保持清晰和简洁很有价值。使用正斜杠 / 作为路径分隔符至关重要,即使在Windows系统上,也要确保技能能在多种不同环境中运行。
在创建技能时,你需要思考给予该技能多大的自由度。

我们应该允许通用的方法和方向,还是专注于特定的操作序列?对于遵循最佳实践的技能,我们可能希望自由度较低;而对于需要创造性输出的技能(如涉及多种颜色、样式、字体),则可以允许较高的自由度。
当我们开始考虑包含多个技能的更复杂工作流时,将任务分解为连续的步骤,总是比创建一个试图包办一切的、非常庞大的单一技能更有价值。这些系统可以处理100多个技能,确保它们命名恰当、不易混淆并能以可预测的模式被调用至关重要。
可选的目录结构 📁
在规范中,为可选目录预留了空间。
正如我们在许多不同技能中看到的,常见的子文件夹包括 scripts、refs 和 assets。
以下是这些目录的用途:


scripts:包含任何需要读取和执行的代码。你还需要确保代码包含错误处理和清晰的文档。refs:包含额外的文档或参考文件。通常,如果参考文件很长,指示技能读取整个文件会很有价值。assets:包含底层资源,例如输出模板、徽标、数据文件、模式等。
需要指出的是,scripts、refs 和 assets 这些目录遵循的是智能体技能的标准。但你可能会遇到许多尚未完全遵循该特定标准的技能。标准在快速演变,技能也在快速演变。因此,展望未来,我们期望新创建的技能遵循此标准,但你可能会遇到一些使用不同文件夹命名和约定的技能。
技能示例分析:生成练习题 🧑🏫
现在我们已经很好地理解了最佳实践、可选目录以及如何编写生产级技能,让我们看看两个我们创建的技能示例。
第一个是生成练习题技能。其描述是“根据讲义生成教育练习题以测试理解力”。想象你是一名教师或讲师,希望为输入和输出提供特定格式,并生成全面的问题来测试理解力。
让我们逐步分析这个技能。首先,它定义了支持的输入格式,指定了要使用的特定库以及要提取的文本。接着,它详细说明了问题结构,明确指定了生成问题的确切顺序(从判断题开始,一直到现实应用题)。对于每种问题类型,下面都有子指导原则。我们可以看到这个技能没有超过500行代码,但如果需要扩展,我们总是可以引用底层文件。
当我们查看判断题、编程题等示例时,可以看到我们对这些特定问题的范围、结构和所需输出都非常明确。在深入输出格式时,我们指定它取决于用户请求,并且没有给出每种输出的直接示例,而是引用了 assets 文件夹中的模板。例如,对于Markdown或LaTeX,我们精确指定了它们的外观。如果你发现自己需要特定类型的输出格式,不要全部放在 skill.md 中,而是将其引用到外部资源或文件中。请记住,这些模板文件仅在必要时加载,因此我们可以通过仅加载所需数据格式的特定文件来高效利用令牌和上下文窗口。

如果需要外部资源或特定领域的示例,我们也可以链接到它们,就像在 refs 文件夹中所做的那样。我们遵循“渐进式披露”的概念,只加载绝对必要的内容,仅在需要时引用外部文件。
技能示例分析:分析时间序列数据 📈
我们要看的第二个技能是分析时间序列数据技能。我们将提供一个CSV文件,并希望在预测之前理解数据的特征。
需要注意的是,在这个特定技能中,我们希望有一个非常确定的、可预测的工作流程。我们使用了几个不同的Python脚本来执行特定操作。首先,我们有一个用于可视化数据的Python脚本,可以绘制时间序列图、直方图、滚动统计、箱线图等。对于自相关分析,我们也有可以绘制的图表。同样,对于分解也是如此。
查看我们的诊断脚本,它包含了用于分析所处理数据的基础功能。虽然这里有很多函数,但我想请大家注意最后运行诊断时的操作:我们利用这些函数来分析数据质量、分布、平稳性检验、季节性、趋势、自相关性,最后给出转换建议。
我们这里有一个每次都想以特定顺序运行的可预测工作流。让我们回到技能本身看看具体是如何实现的。首先,我们从输入格式开始,对应该查找的内容、列名和特定数据类型非常明确。接下来,我们将进入此技能最重要的部分之一:工作流。请注意,我们在这里对步骤的描述极其明确,告诉我们的特定技能和Claude在开始诊断时运行这个确切的脚本。然后,我们可选择生成必要的图表并向用户报告数据,获取数据,在摘要文件中查找内容并呈现相关图表。我们还可以看到,为了回答一些可能需要的问题,我们有一个解释指南文件。
查看一些脚本选项,我们可以在必要时添加额外的标志。当我们考虑输出内容时,可以精确指定输出的文件树、文本文件、图像等。我们希望输入的数据、执行的操作以及最终的输出都极其可预测。一如既往,如果有外部参考资料,我们可以确保在这里列出。鉴于我们有依赖于Python库的脚本,我们需要确保明确指出这些依赖项是什么,并确保它们已安装,以便这些脚本正确运行。
使用技能创建器评估技能 ✅
现在我们已经查看了这两个自定义技能,让我们看看当通过技能创建器技能运行它们时表现如何,并判断我们是否遵循了最佳实践。


我们可以在几个环境中进行此操作。一个非常有用的方法是使用Claude Code及其技能。我们将安装必要的技能创建器技能,然后使用两个并行子代理来评估我们的“分析时间序列”和“生成练习题”技能。这是开始评估我们编写这些技能效果的一个非常有帮助的方式。
在Claude Code中,我们需要从市场添加Anthropic的Claude技能仓库并安装技能创建器技能。安装并重启后,我们可以使用 /ss 命令查看可用技能,并确认技能创建器技能已就绪。接着,我们要求Claude Code使用技能创建器技能来评估这些技能遵循最佳实践的情况。为了更快完成,我们使用并行子代理,每个子代理评估一个自定义技能。技能创建器技能会成功加载,读取必要文件,并分派子代理根据最佳实践检查这些技能。

评估结果显示,“生成练习题”技能得了9分(满分10分),在简洁性方面可以改进,并获得了一些不错的建议。“分析时间序列”技能表现更好,在避免重复、前言质量和简洁性方面都做得非常出色。通过这个内置了最佳实践的技能创建器来评估你的技能,是一种非常好的方法。
为技能编写测试 🧪
我们已经通过技能创建器分析了技能在底层 skill.md 及相关文件方面对最佳实践的遵循情况,但如何确保技能能按预期工作呢?
以下是一个我们可以围绕其构建测试框架的示例,思考如何为我们的技能编写单元测试,就像为软件编写单元测试一样。
首先,对于“生成练习题”技能,评估可能涉及几个不同的查询:生成问题并保存到Markdown文件、LaTeX文件、PDF。我们可以确保传入正确格式的正确文件。然后,我们可以确保预期行为符合要求:对PDF输入使用正确的库、按指定提取学习目标、生成不同类型的问题并遵循其指导原则、使用正确的输出结构、使用我们在资源文件夹中看到的正确输出模板、确保在某些数据格式(如LaTeX)中成功编译,最后确保问题生成到正确的文件并以正确的格式保存。在此过程中,我们还希望确保收集人工反馈,并跨我们计划使用的所有不同模型进行测试。
对于第二个“分析时间序列”技能,我们使用了三个不同的Python脚本。因此,我们假设已经用传统的单元测试和软件测试方法测试了这些Python脚本,假设这些脚本能按我们期望的方式工作。现在,让我们测试一切是否以正确的顺序、使用适当的输入和输出以及预期的行为发生。这里的查询可能是“分析某些时间序列数据并生成图表”。我们希望传入一些可能的CSV文件,确保我们展示的可视化和诊断Python脚本正确运行,更重要的是,确保工作流中的所有步骤顺序正确。如果我们要求生成图表,要确保包含该可选步骤。然后,我们希望返回摘要,解释这些发现,最后创建一个包含所有必需文件且位置正确的文件夹。如果你还记得,在输出中,我们对不同的文件、文件夹和底层资源有非常具体的位置规定。与我们的其他技能类似,我们希望获得人工反馈,并在我们使用的模型上进行测试。
总结 🎯

本节课中,我们一起深入探讨了智能体技能的结构,学习了创建技能在命名、描述、内容组织和目录结构方面的最佳实践。我们通过“生成练习题”和“分析时间序列数据”两个具体示例,剖析了如何编写清晰、可预测且高效的技能。我们还介绍了如何使用技能创建器技能来评估自定义技能的质量,并探讨了为确保技能可靠运行而进行测试的基本思路。掌握这些知识,将帮助你创建出更加强大、稳定且易于维护的智能体技能。
007:通过 Claude API 使用技能
在本节课中,我们将学习如何通过 Claude API 来使用我们之前创建的自定义技能。我们将重点介绍代码执行工具和文件 API 的作用,并通过实际代码演示,将技能集成到程序化的工作流中。
概述:技能与 API 环境
在第一课中,我们看到了技能如何在 Cloud AI 中工作。现在,我们将通过 Claude API 来测试上一课中制作的两个技能。
要通过 API 使用技能,我们需要用到代码执行工具和文件 API。这将为 Claude 提供文件系统访问权限(用于读写文件)以及执行代码的能力。
技能的可移植性与环境差异
我们已经讨论了技能的工作原理以及如何创建它们,也简要介绍了技能在 Claude 生态系统及其他智能体应用中的可移植性。
我们首先在 Cloud AI 和 Claude Desktop 中了解了技能,现在我们将探讨如何通过 Claude Messages API 来使用技能。
有两点需要注意:
- 在 Cloud AI 和 Claude Desktop 中创建的技能不会自动在 Claude API 或 Claude Code 中共享。
- 为了让技能正常工作,Claude 需要能够执行代码、创建和编辑文档、演示文稿、PDF、数据报告,并能操作文件系统。在使用 API 时,我们需要手动配置这些功能;而在 Cloud AI 和 Claude Desktop 中,这些功能是默认启用的。
在 Cloud Desktop 或 Cloud AI 的设置中,可以看到“代码执行和文件创建”部分。这允许 Claude 执行代码、创建文档、电子表格、演示文稿等。本质上,这为 Cloud AI 和 Claude Desktop 提供了一个执行代码和完成技能所需任务的虚拟机环境。
代码执行工具与文件系统
现在,让我们深入了解一下代码执行工具和文件创建的工作原理,因为在使用 API 时,我们需要手动启用这些功能。
在使用 Cloud Code 和 Claude 智能体等工具时,你可以直接访问文件系统。而使用 Claude API 时,我们则需要一个容器来执行代码和一个文件系统来操作。在 Cloud AI 和 Claude Desktop 中,这个容器化环境和文件系统是直接提供的,无需自行实现。
归根结底,功能是相同的,但我们利用技能的方式略有不同。技能本身的格式不会改变,但根据你所在的环境,使用技能的方式可能会稍有差异。
代码执行工具详解
当我们开始探索 Messages API 时,我们将使用代码执行工具。该工具允许 Claude 运行 Bash 或 Shell 命令,以执行我们在使用技能时看到的所有操作:在沙盒环境中创建、查看、编辑文件和编写代码。
代码执行工具为我们的应用程序提供了在一个独立的专用容器中执行代码和操作文件系统的能力。正如你所见,这对于读取技能、在其中执行代码以及处理我们可能想要编辑、查看和创建的其他文件至关重要。
为了让你更直观地理解,当我们包含代码执行工具时,我们为 Claude 提供了一个执行沙盒或容器。当我们要求 Claude 创建和执行文件时,这些操作都在一个安全、隔离的环境中进行。该环境对 RAM、磁盘、CPU 等资源有限制,更重要的是不提供互联网连接,但会预装一些开箱即用的库。因此,它并非适用于所有类型的编码环境,需要注意这些限制。
同时,我们还可以访问一个文件系统,并可以向其中添加目录。在 Cloud Desktop 和 Cloud AI 中工作时,你可能已经看到了这方面的提示。没有互联网连接这一限制是 Messages API 在使用代码执行工具时的特定情况。在 Cloud AI 或 Cloud Desktop 中使用代码执行工具时,我们确实可以访问互联网,并能下载和安装软件包。
文件 API 的作用
代码执行工具与 Claude API 允许我们使用的另一组 API——文件 API——配合得非常好。
可以想象,当我们处理文件、添加、创建、写入、修改文件时,我们需要某种机制来实际存储这些底层文件。Claude API 包含一组称为文件 API 的接口,用于上传和下载可以在容器内运行和处理的文件。
例如,用户可以要求总结某个输入并将摘要保存到文本文件中。我们上传该输入文件,将其发送到容器,然后使用文件 API 下载生成的文件。我们很快将在代码中看到从上传和下载文件返回的 ID,以及它如何与技能、代码执行工具良好地协同工作。而这正是技能发挥作用的地方。
我们在 Cloud AI 等工具中开箱即用的技能库,或者如果我们愿意也可以通过 API 包含的技能,都存在于容器中的一个目录中。当我们开始从这个技能目录读取、向技能添加信息或使用这些底层技能创建可以下载或上传的新文件时,技能就派上了用场。我们将看到,在使用 API 时,如果我们想使用技能,也需要使用代码执行工具。
实战:在 Jupyter Notebook 中使用技能
现在我们已经很好地理解了代码执行工具和文件 API 允许我们做什么,让我们看看如何在实际中使用它们。
我们将回顾之前构建的两个自定义技能:生成练习题和时间序列分析。

让我们进入 Jupyter Notebook 并开始探索。这里我有两个之前使用过的自定义技能,还有一个用于分析时间序列数据的data文件夹,以及一个包含讲座笔记的文件夹,我将在使用生成练习题技能时用到它。
首先,我将加载所需的环境变量,以及一个帮助我从目录中查找特定文件的辅助函数。当我们开始使用技能时,会看到它的作用。
使用“生成练习题”技能
首先,我将开始使用我的“生成练习题”技能。让我们看看需要做的第一步。
上传技能目录
我需要上传技能目录。这里可以看到我们使用了来自辅助函数的文件以及技能所需的 Beta 请求头。完成后,我应该能看到创建的技能 ID。
这些 Beta 请求头是在向 Messages API 发出请求时添加的特定头部信息,它们会在底层转换为请求头,以确保我获得正确的数据并与 API 进行适当的通信。
查看所有技能
为了查看我拥有的所有技能,我可以使用.list方法,并传入source=‘custom’参数,这样我们就不会加载所有内置技能,而只是确认我按预期创建了技能。
在这里,我可以看到标题以及我即将使用的唯一技能 ID。
上传输入文件
为了让这一切按预期工作,我们需要使用包含讲座笔记的 LaTeX 文件来生成练习题。
在这里,我将使用文件 API 上传这个特定的 LaTeX 文件,确保它被设置为可读,然后获取一个文件对象。我将结合必要的技能使用这个文件对象,以确保一切按预期工作。
发送请求
我在这里使用sonnet模型,并传入必要的 Beta 请求头,不仅是为了技能,而且为了确保在与模型对话时技能能按预期工作,我还需要确保包含代码执行的 Beta 头。由于我在这里发送了一个文件,我们还必须确保有文件 API 的请求头。
在使用技能时,这些技能通过一个名为container的关键字参数设置,在这里我传入技能列表。这些可以是自定义的,也可以是内置的。随着我创建技能的不同版本,我可以引用特定的时间戳,或者只使用我拥有的最新版本。
在与模型通信时,我要求它生成练习题,然后指定我正在处理的文件。这个文件对象是我之前上传 LaTeX 文件时创建的。最后,我们确保引入了正确的代码执行工具,并向我们的 API 发送消息。
分析响应
现在让我们看看返回的响应。我们可以看到这里使用了多个不同的部分:服务器上的工具、代码执行、使用了额外的工具,最后是 Bash 代码执行结果。
为了让查看更清晰,让我们添加一些漂亮的格式,以便我们可以逐步查看和分析不同的文本响应和工具使用情况。
我们将在这个特定的序列中逐步查看发生了什么。当我们查看响应(包括我们的文本、工具使用和工具结果)时,模型首先告诉我们,它可以帮助从这些笔记中生成问题,并将开始读取技能文件和检查讲座笔记。
请注意,它在这里检测到了需要使用的技能,但它只读取了技能文件(skill.md)。稍后我们将看到,如果需要读取其他文件,将会利用渐进式披露。我们还将审查我们的输入,即那个 LaTeX 文件。
接下来,我们将继续查看这些文件中的底层数据。这是我们之前见过的 YAML 前置内容,以及来自 LaTeX 笔记文件的内容。
然后,我们将检查要使用的 Markdown 模板,以确保输出结构正确,因为我们希望输出是 Markdown 格式。在这里,我们将更多地利用渐进式披露。
我们将读取assets文件夹中的 Markdown 模板文件(markdown_template.md)。我们将得到已读取的响应,现在将根据我们传入的讲座笔记生成问题。
我们将使用代码执行工具创建一个特定的文件。我们将为该文件提供 Markdown 格式的文本,并获取该文件的结果。
我们将把它复制到输出目录,并使用文件 API 获取一个文件 ID,以便稍后下载。
一旦我们得到那个结果,我们就可以查看已生成的底层文件,并利用那个文件 ID 以编程方式下载它。
我们可以看到它已被保存并准备使用。
下载生成的文件
使用上面看到的文件 ID,让我们下载该文件。我们将检查这个响应,确保我们正确提取了文件 ID。如果我们有它(我们期望如此),我们应该能够下载那个特定的文件。
我们将写入一个名为notes.md的文件,内容包含文件 ID 以及与 API 通信所需的 Beta 请求头。
我们可以看到我们已经下载了那个notes.md文件。这是通过文件 API 和代码执行工具,全部由模型和技能生成的。
在我们下载的这个文件中,我们可以看到我们遵循了技能中定义的确切部分:从判断题开始,然后是解释性问题、编码问题,最后是应用案例。
我们可以用 Markdown 预览来看看效果,这里我们可以看到我们的应用案例,所有必要的内容。
评估输出
现在是评估这个特定输出的好时机。我们是否完全按照技能的要求做了?看起来不错。但如果引入一些单元测试,可以真正将其提升到一个新的水平。如果需要,我们可以像之前看到的那样,使用 API、代码执行工具和文件 API 返回并修改技能。
我们还可以以编程方式删除技能。要删除一个技能,首先必须找到与该技能关联的所有版本,然后删除它们。一旦这些版本被删除,我们就可以删除底层的技能。
结合使用“分析时间序列”技能与内置技能
接下来,我们将继续使用我们的“分析时间序列”技能以及另一个技能。这将与我们上面看到的非常相似,所以让我们逐步完成这些步骤。
上传技能
首先,我们将上传我们的自定义技能,获取技能 ID,并确认我们按预期完成了。在这里,我们还可以看到我们不仅加载了自定义技能,也看到了内置技能。这些看起来应该很熟悉,因为我们在 Claude AI 中也见过它们。
上传输入文件
接下来,我们将上传我们的输入文件,这将是我们的零售销售 CSV 文件。
构建请求消息
我们将构建一条消息发送给 API。和之前一样,我们将使用我们的技能,但在这里我们还将包含文档(DocX)技能。我们使用这个是因为我们想创建一个总结结果和图表的 Word 文档。
所以在这里,我们看到了自定义技能(使用我们拥有的技能 ID 和版本)与 Anthropic 内置技能(本例中是 DocX 技能)的结合。
我们传入了之前必须传递的相同请求头:技能、代码执行和文件 API。
分析响应
现在运行完成后,我们可以检查得到的响应类型。我们将看到与之前类似的情况,但这次发生的事情稍微多一点。
让我们通过漂亮的格式来看看底层发生了什么。
模型将回应帮助我们分析时间序列数据。和之前一样,我们将开始读取这些技能文件的全部内容:我们将读取我们的自定义技能以及我们需要使用的内置 DocX 技能。我们可以看到这些结果包括从文件开头开始并包含整个技能文件的内容。
接下来,我们将检查数据以运行时间序列分析。我们将查看这个 CSV 的前 20 行,以检查列名和我们正在处理的数据类型。
由于这按预期工作,我们将继续运行诊断并创建可视化。我们需要运行的这些特定命令直接来自我们的技能。在这里,我们将读取那些底层文件,执行代码,并将其交还给 Claude 处理。
我们将得到这些执行的结果,包括诊断和可视化的结果。
然后,我们将读取摘要和诊断结果,这些是我们脚本运行后生成在名为summary.txt文件中的结果。
创建 Word 文档
一旦我们创建了那个特定的文件,我们就可以继续创建 Word 文档。内置的 DocX 技能包含了如何处理 Word 文档的正确内容。
我们将看看如何最好地生成该文档,并在这里利用渐进式披露。我们不需要 DocX 技能中的所有内容,只需要一种获取 Markdown 文件的方法。一旦我们有了这些,我们将使用必要的技能创建全面的 Word 文档,执行代码来实现这一点,并生成底层的 Word 文档。
一旦我们有了那个 Word 文档,我们将把它复制到输出目录,就像我们之前看到的那样,获取一个文件 ID,如果我们想下载这个 Word 文档就可以使用它。
下载并查看结果
我们可以看到这些数据的摘要,现在我们可以下载该文件。类似地,我们将找到那个文件 ID(如果存在的话)。我们将下载那个特定文件,其必要内容作为一个.docx文件。
如果我们看看这个文件的样子,我们现在有了一个包含我们发现的 Word 文档:概述、统计数据。我们可以看到我们引入了那些图表和可视化,以及我们请求的统计分析。
这不仅是评估我们所做的是否符合技能预期的好时机,也是评估我们是否以可预测的方式进行的好时机。随着我们继续评估,我们总是可以根据需要修改这个技能,但所有这些数据都来自技能以及 DocX 技能,以创建这个单独的文件。
和之前一样,如果我们想删除这个技能,我们可以列出所有版本并删除它们,一旦这些版本被删除,就删除底层技能。
总结
在本节课中,我们结合了对 Messages API、代码执行工具、文件 API 和技能的理解,以编程方式使用我们的自定义技能。我们看到了如何上传技能、处理输入文件、结合使用自定义技能与内置技能,并最终下载生成的结果。


在下一课中,我们将转向 Cloud Code,看看如何在 .cloud 文件夹中添加我们自己的自定义技能,并构建一个更复杂的命令行应用程序。
008:在 Claude Code 中使用技能
在本节课中,我们将学习如何在 Claude Code 环境中使用技能进行代码生成、审查和测试。我们还将学习如何设置子智能体,并为它们配备特定的技能,以实现更高效、更结构化的开发工作流。
概述
我们将从一个命令行待办事项管理应用项目开始。该项目使用 Python 和 typer 框架构建,数据存储在 JSON 文件中,并使用 uv 进行依赖管理。我们的目标是向该应用添加一个 edit 命令,并在此过程中演示如何使用技能来确保代码遵循一致的约定和最佳实践。
项目结构与 claude.md 文件
首先,让我们了解一下项目的基本结构。在 Claude Code 中,你可以创建一个 claude.md 文件。这个文件可以通过 /a init 命令创建,也可以由用户手动创建。它始终位于你的项目上下文中,用于指定关于代码库、技术栈以及 Claude 在每次对话中需要了解的通用信息。
我们的项目是一个使用 Python 的命令行任务管理应用。架构遵循以下模式:
- 入口点位于
src/task/__main__.py。 - 每个命令都有自己独立的 Python 文件。
- 数据模型定义在
models.py。 - 存储逻辑(序列化/反序列化)位于
storage.py。 - 终端显示逻辑位于
display.py。 - 此外还有常量文件和测试文件。
claude.md 文件包含了这些信息,帮助 Claude 理解项目结构和约定。
演示应用功能


在深入技能之前,我们先快速演示一下现有应用的功能。
- 激活虚拟环境:
source .venv/bin/activate - 同步依赖:
uv sync - 查看可用命令:
task --help。可以看到有add、done、list等命令。 - 添加一个任务:
task add “write the final report” --priority high --due 2024-12-01 - 列出任务:
task list。可以看到新添加的任务。 - 标记任务为完成:
task done <task_id> - 再次列出任务(使用
--show-done标志):task list --show-done。可以看到已完成的任务。
我们的计划是为应用添加一个新的 edit 命令,用于编辑现有任务的标题和优先级。
技能定义与存放
技能定义在项目根目录下的 .claude/skills 文件夹中。你也可以在用户主目录下创建技能,供所有项目使用。本节课我们专注于项目特定的技能。
我们的项目准备了三个技能:
- 添加 CLI 命令 (
adding-cli-command.md) - 生成 CLI 测试 (
generating-cli-tests.md) - 审查 CLI 命令 (
reviewing-cli-command.md)
让我们逐一深入了解这些技能的设计。
技能一:添加 CLI 命令
这个技能指导 Claude 如何遵循特定模式创建新的命令行命令。
以下是该技能的核心要点:
- 工作流:技能明确了创建新命令的步骤,包括在正确的目录(
src/task/commands/)中创建文件,以及在__init__.py中注册命令。 - 模式匹配:对于编码任务,明确告知 Claude 应遵循的具体模式和风格至关重要。例如,技能中指定了参数类型注解应使用的现代约定(
Annotated)。 - 用户交互:技能要求使用项目中的
display对象来调用success()、info()等方法,以确保向用户显示正确的信息。 - 标志与帮助文本:技能规定了命令行标志的简写、长格式以及帮助文本的格式。
- 子命令与危险操作:技能还提供了处理子命令的示例,以及对于像“清除”这样的危险操作,应如何添加确认步骤。
- 注册约定:技能详细说明了如何在
__init__.py中注册单个命令或命令组。 - 通用性:技能使用通用名称(如
cli_app),因此可以轻松适配到任何遵循类似约定的 CLI 项目。
这个技能的价值在于,它为一系列任务(添加命令)提供了可预测的工作流和一致的代码风格,而不是将这些约定分散在 claude.md 或整个代码库中。
技能二:生成 CLI 测试
在添加新命令后,我们需要确保其功能正确。这个技能指导 Claude 如何为 typer 命令生成 pytest 测试。
以下是该技能的核心要点:
- 触发条件:技能明确说明了何时使用它,例如当用户要求“为我的 CLI 编写测试”或“增加测试覆盖率”时。
- 使用 Fixtures:技能强调利用
pytest的 fixtures 来为每次测试安排(Arrange)数据,例如设置临时存储和示例数据。 - 测试结构:技能规定了测试应遵循 Arrange-Act-Assert 模式。
- 示例与模式:技能提供了具体的测试代码示例,展示了我们期望的测试模式。
- 边界情况:技能包含了一个检查清单,提醒考虑无效输入、状态确认、未找到项等情况。
- 运行测试:技能指定了如何运行测试,包括详细模式和针对特定文件运行。
技能三:审查 CLI 命令
最后一个技能用于在命令编写完成后,对其代码质量进行审查。
以下是该技能的核心要点:
- 审查范围:技能不仅检查代码结构(位置、装饰器、注册),还检查具体实践,如类型注解、参数标志等。
- 正反示例:技能提供了正面和反面代码示例,例如展示正确的
Annotated用法和应避免的旧式用法。 - 检查清单:技能包含一个详细的检查清单,用于确认所有最佳实践都得到遵循。
- 输出格式:技能要求审查输出必须包含总结和建议的修复方法。
- 作用:你可以将此技能视为对其他技能(如添加命令、生成测试)产出的“评估”。它确保我们构建的功能是生产级的,有测试支持,并遵循最佳实践。
整合技能:添加 Edit 命令
现在,让我们将所有这些技能结合起来,为我们的应用添加 edit 命令。
首先,我们需要确认技能已正确加载。在 Claude Code 中输入 /skills,可以列出当前可用的项目技能及其占用的令牌数。
注意:在 Claude Code 中创建新技能后,需要关闭并重新打开 Claude Code 实例,新技能才能被识别和加载。
现在,我们要求 Claude 添加一个新的 edit 命令,允许用户编辑任务的标题和优先级,并确保遵循创建新 CLI 命令的约定。

请为我们的任务应用添加一个 `edit` 命令,用于编辑现有任务的标题和优先级。请遵循项目约定。
Claude 识别到应使用“添加 CLI 命令”技能。它会:
- 读取现有文件以理解约定。
- 参考其他命令(如
add,done)的示例。 - 在
src/task/commands/目录下创建edit.py文件。 - 在
src/task/commands/__init__.py中注册新的edit命令。 - 运行一些命令来测试新功能是否按预期工作。
这个过程是有效的,但测试环节(步骤5)可能会在对话中反复进行,占用大量上下文窗口,对于大型系统来说可能非常耗时。
使用子智能体优化工作流
为了解决上述问题,我们可以利用 Claude Code 的子智能体功能。我们可以创建专门的子智能体来负责代码审查和测试生成,而让主智能体专注于开发。这样,每个子智能体都在自己的上下文窗口中运行,主智能体可以更高效地整合它们的反馈。
重要提示:子智能体不会从父智能体继承技能。我们需要为每个创建的子智能体明确指定其可用的技能。
创建代码审查子智能体
我们使用 /agents 命令来创建新智能体。选择“手动配置”。
- 名称:
code-reviewer - 提示词:一段指导其进行代码审查的文本,强调提供具体、可操作的见解。
- 描述:
当需要审查代码质量、安全性等问题时使用。 - 工具:我们限制其工具集,只提供必要的
bash、glob(查找文件)、read(读取文件)。 - 模型:继承自父智能体。
- 颜色:紫色(用于在界面中区分)。
- 技能:最关键的一步,在技能字段中指定
reviewing-cli-command。
保存后,我们就在项目的 .claude/agents 文件夹中创建了一个代码审查子智能体。当这个子智能体被调用时,它会加载整个 reviewing-cli-command.md 技能文件。
创建测试生成/运行子智能体
同样,我们创建第二个子智能体。
- 名称:
test-generator-runner - 提示词:指导其生成和运行测试的文本。
- 描述:
当用户要求测试或运行测试时,运行测试并在缺失时生成测试。 - 工具:除了
bash、glob、read,还需要edit和write权限来创建或修改测试文件。 - 模型:继承自父智能体。
- 颜色:黄色。
- 技能:指定
generating-cli-tests。
实战:使用子智能体工作流
现在,我们用新的工作流来完善 edit 命令。
-
代码审查:我们调用
code-reviewer子智能体来审查刚创建的edit.py文件。@code-reviewer 请审查 src/task/commands/edit.py 文件。子智能体会使用其技能对代码进行审查,并输出警告、问题及修复建议。主智能体可以接收这些反馈。
-
生成测试:我们调用
test-generator-runner子智能体为edit命令生成测试。@test-generator-runner 请为 src/task/commands/edit.py 生成测试。子智能体会使用其技能创建测试文件(如
test_edit.py),并运行测试以确保通过。
通过这种方式,主智能体的上下文保持了简洁,专注于开发任务,而审查和测试这些消耗上下文的任务则由专门的子智能体高效完成。
综合案例:修复不符合规范的 Clear 命令
假设团队中有人添加了一个 clear 命令文件 (clear.py),但没有遵循最佳实践,也未使用我们设置的技能。
我们可以用我们的子智能体工作流来修复它:
- 代码审查:调用
@code-reviewer审查clear.py。审查结果会指出一系列问题,例如未使用正确的display方法、标志格式错误、退出码不正确等。 - 主智能体修复:主智能体根据审查报告,修改
clear.py文件,并确保在__init__.py中正确注册。 - 生成测试:调用
@test-generator-runner为修复后的clear命令生成并运行测试。
最终,我们不仅修复了所有代码质量问题,还为该功能添加了完整的测试覆盖,确保了功能的可靠性和一致性。
总结




在本节课中,我们一起学习了在 Claude Code 中利用技能和子智能体构建高效开发工作流的方法。
- 我们首先了解了
claude.md文件 的作用,它是项目的持久化上下文。 - 然后,我们深入探讨了技能的创建,它能够为特定任务(如添加命令、生成测试、代码审查)提供可预测、一致的工作流和模式。
- 接着,我们引入了子智能体的概念。通过创建专门的子智能体(如代码审查员、测试运行器)并为其配备特定技能,我们可以将复杂任务分解,让主智能体更高效地工作,同时保持上下文整洁。
- 最后,我们通过完整的实战演示,展示了如何综合运用这些工具,以标准化、高质量的方式为应用添加新功能,并修复不符合规范的现有代码。

这种结合技能和子智能体的模式,极大地提升了在 Claude Code 中进行复杂编码任务的效率、一致性和代码质量。在下一节课中,我们将把视角从 Claude Code 转移到 Claude 智能体 SDK,学习如何在构建自己的智能体时使用同样的技能框架。
009:使用 Claude Agent SDK 构建技能 🛠️

在本节课中,我们将学习如何使用 Claude Agent SDK 构建一个研究型智能体。这个智能体将利用技能,基于开源工具的文档、GitHub 仓库和网络搜索,为其创建一份学习指南。
概述
我们将创建一个通用的研究型智能体。主智能体能够从多个来源研究信息并综合成摘要。它将派遣三个不同的子智能体,分别用于分析文档、分析和下载仓库,以及通过网络搜索研究信息。
智能体架构设计
上一节我们介绍了项目的目标,本节中我们来看看智能体的具体架构和提示词设计。


主智能体提示词
主智能体是协调者,它拥有三个可用的子智能体,具备以下能力:
- 从文档中查找信息
- 分析仓库结构
- 查找文章、视频和社区内容,并将所有信息整合在一起。
在这个特定的应用中,我们提到如果提供了技能,我们希望智能体遵循特定的模式。我们构建的应用可能提供也可能不提供技能,但在本例中,我们将提供一个。如果技能与用户请求匹配,则需要精确遵循该技能的指令。由于我们是从头开始构建这个智能体应用,因此需要明确当提供技能或未提供技能时该如何处理。
以下是高级别的委托指南,用于指导如何生成子智能体以及在收到结果后如何综合所有信息。

子智能体提示词
现在,让我们简要了解一下子智能体的提示词。
文档研究员可以访问网络搜索和网页抓取工具。我们提供了一个流程来定位文档、特定的输入格式、指南,以及以特定方式返回研究结果的输出格式。

仓库分析器同样可以使用网络搜索来查找仓库、使用 bash 命令运行 Git,以及读取和查找文件及文件内的数据。类似地,我们也提供了流程、输入格式、指南和输出格式。
网络研究员也使用网络搜索和网页抓取工具。这允许我们搜索与主题相关的内容,并从主智能体接收提取指令。我们还提供了指南以及必要的输出格式;如果未指定输出格式,则遵循默认结构。
所有这些提示词将在我们设置使智能体工作所需的代码时一起使用。
技能设计
上一节我们介绍了智能体的架构,本节中我们来看看将要用到的技能。
我们有一个名为 学习一个工具 的技能。这个技能的目的是指导主协调器。我们不会在单个子智能体中使用这个技能,而是将其作为一种创建可预测模式的方式,以便主智能体知道理想的工作流程以及如何派遣子智能体。
我们为技能指定了名称和描述。在本例中,我们希望为编程工具创建学习路径,以确定应研究哪些信息,并指定从研究开始到创建全面学习路径的最佳方法。
我们有一个非常具体的工作流程:
- 从研究阶段开始,我们为负责官方文档的子智能体指定具体要查找的内容。
- 对于仓库分析器,采用类似的方法。
- 对于我们的网络研究员,方法也非常相似。

因此,我们使用这个技能为主智能体拥有的子智能体提供一个恒定且可预测的最佳协作工作流程。
一旦数据收集完毕,我们就会将这些内容组织成渐进式的级别。这里我们使用渐进式披露,加载另一个 Markdown 文件作为渐进式学习文件的真实来源。在这个渐进式学习文件中,我们可以看到从概述和动机,到安装、核心概念、实践模式,再到后续深入方向等各个级别。这种渐进式学习允许我们构建级别,以便我们知道如何从基础开始,并最终知道如何深入。
虽然这个初始技能对于学习工具很有用,但您也可以想象,根据我们处理的数据,我们可能还会有其他技能,例如比较一个工具与另一个工具。
随着我们进入使用此技能的后续阶段,我们获取数据,指定结构,然后指定输出。我们对所使用的确切格式要求非常严格。


这里的目的是获得一个学习环境,该环境能提供概述、资源、路径和代码示例。目标是将所有子智能体的研究成果合并成我们想要的特定输出格式,并确保一致性和可预测性。
代码实现
现在我们已经从高层了解了要构建的应用,还有最后一部分需要添加。我们可以设想,我们希望获取输出并将其写入一个集中的位置,以便与团队成员分享,并且可能拥有更友好的界面。为此,我们将使用 Notion。为了连接到 Notion,我们将使用一个 MCP 服务器,并引入执行此操作所需的工具。
项目初始化与依赖
现在我们已经检查了主智能体、子智能体以及将要使用的技能的底层提示词,让我们开始运行 uv init 来初始化一个项目,并添加必要的依赖项,如 claude-agent-sdk、python-dotenv 和 asyncio。


安装这些依赖项后,让我们创建一个名为 agent.py 的文件。
在我们的 agent.py 文件中,我将添加必要的代码,以便使用 Claude Agent SDK 从一个简单的示例开始。
这里的样板代码引入了 asyncio 来运行此环境,dotenv 来加载环境变量,然后从我们的工具中引入 display_message 函数。
为了提供一些背景信息,display_message 为我们提供了一系列用于截断和格式化输入的辅助函数,并为我们提供了一种很好的方式来直观显示来自主智能体和子智能体的信息。这与我们使用 API 时看到的代码非常相似,当时我们为每个工具操作和迭代都获得了很好的输出。

基础智能体设置
首先,我们设置 Claude 智能体,传入一个系统提示(这里会更改),并传入允许的工具(这里也会更改),但我们只想从基础开始。



为了开始一个简单的对话,我们设置一个循环。接受一些用户输入,通过我们的模型运行它,获取响应并将其发送回用户。
让我们看看效果如何。我将再次打开终端,运行 uv run agent.py。

这将为我们提供一个终端环境,我们可以开始对话。我先问:“你好吗?” 在这种情况下,我不会得到太多有价值的信息,因为我只有一个乐于助人的助手。所以,我们现在要开始添加的功能是让我们的智能体能够访问 MCP 服务器和正确的工具。
添加工具与 MCP 服务器
让我们对主函数进行一些修改。如前所述,允许的工具将会改变。因此,我们将开始添加子智能体需要使用的工具,以便它们能按预期工作。
默认情况下允许只读工具,如 read、grep 和 glob。但是,当我们想要开始执行诸如写入文件、搜索网络和执行 bash 命令等操作时,需要显式传入这些工具。
所以,我们将引入正确的工具:bash 工具、web_search 和 web_fetch 工具。
我们之前看到,我们的子智能体将使用这些特定的工具:分析仓库的智能体需要 bash 来运行 git 命令和写入文件,而我们的文档研究员和网络研究员将使用搜索和抓取功能。
现在我们已经引入了这些工具,接下来要添加的是要连接的 MCP 服务器。
我们将使用 mcp_servers 关键字参数,并指定 MCP 服务器的名称,在本例中是 notion。我们将传入一些默认配置,并指定运行 Notion 服务器的命令以及我们拥有的 Notion 环境变量。
因此,在继续之前,我们需要确保从 .env 文件中加载我们的 Notion 令牌,并导入 os 模块以确保能够正确读取该文件。
现在我们已经正确加载了 MCP 服务器,我们需要使用 Notion 提供的工具。如果我们愿意,现在可以问 Claude:“你从这个 MCP 服务器获得了哪些工具?”或者我们可以显式地添加它们。
通过使用 mcp,后跟我们的服务器名称,再后跟工具名称,在本例中,我们将使用 Notion 提供给我们的所有工具。


我们需要确保这个 mcp_notion 存在于 allowed_tools 中,以便授予主智能体使用这组工具的权限。我们可以显式添加工具名称,或者在本例中,我们将直接包含 MCP Notion 提供的所有可用工具。
集成子智能体与技能
现在我们已经设置了 MCP 服务器和允许的工具,接下来让我们引入子智能体及其定义。
我们提到系统提示将会更改。首先,我们将加载所有已有的提示词。我们将引入一个常量和一个辅助函数来加载所有这些提示词。
我们将调用该函数来引入这些提示词到我们的主函数中。我们将利用这些 Markdown 文件来加载必要的文本,并将其传递给我们的智能体选项。
在更新主智能体之前,我们将添加一个字典来引用所有具有定义的智能体。我们引入了 AgentDefinition 类,需要确保正确导入。

在 AgentDefinition 中,我们可以看到子智能体的描述、指定智能体指令的提示词,以及我们希望该智能体使用的工具。这与我们在 Claude Code 中看到的配置类似。
这里我们仍然需要使用我们的主智能体提示词,以及这个智能体字典。

因此,我们将使用主智能体提示词更新系统提示,并确保传入一个额外的关键字参数 agents,该参数引用我们包含智能体定义的字典。
如您所见,我们的研究员、分析器和网络研究员也使用了我们在此定义的工具。重要的是要确保在 allowed_tools 中列出主智能体和子智能体需要使用的所有工具,否则即使在此包含了工具,子智能体也不允许使用它们。
添加任务与技能工具


现在我们已经设置了智能体,还需要确保包含非常重要的 task 工具,以确保我们可以派遣子智能体并向它们分配任务。
我们需要添加的最后一个部分是技能。好消息是,为了添加技能,我们只需要再添加一个工具,那就是 skill 工具。由于我们这里有一个可以执行代码的环境(使用 bash 工具),我们只需要添加这个 skill 工具,以便能够正确读取技能并了解如何最好地使用它们。
与 Claude Code 类似,技能定义在 .claude 文件夹内,后跟一个名为 skills 的文件夹。请确保您的 Markdown 文件是 skill.md,并且您的文件夹名为 skills(复数形式)。
现在我们已经添加了用于处理技能的工具,这里还需要传入一个关键字参数。我们需要指定在哪里找到这组特定的技能,我们通过一个名为 skill_sources 的关键字参数来实现。在这里,我们将指定我们希望在家目录(如果我们有技能的话)以及项目目录(我们为此特定应用程序加载技能的位置)中查找技能。
运行与测试
现在我们已经将所有部分整合在一起,让我们来测试一下我们的智能体。
我将再次打开终端,退出,然后运行我们已做更改的应用程序。
我们将从了解一点关于 minu 的知识开始。对于那些不熟悉的人来说,minu 是一个用于 PDF 提取的开源库。我们使用这个例子的原因是,Claude 可能从其初始训练数据中对此了解不多,这将需要外部研究、分析代码仓库、社区文档和其他来源。
我们将要求创建一个学习指南,然后先展示计划。
在这里,我们将开始看到技能被调用,输入是我们指定的参数所调用的名为“学习一个工具”的技能。
所以在这里,我们可以看到我们首先指定了计划。我们仍然需要运行子智能体将要执行的操作,但就像在 Claude Code 和计划模式中一样,我们可能希望在开始行动、消耗令牌和时间之前先看看计划是什么。
我们可以看到研究阶段,我们的不同研究员进行并行调查;我们可以看到根据技能所需的结构;最后是我们期望的输出。这看起来是个好计划。
所以我们就让它继续执行。它将开始生成文档研究子智能体、仓库分析器和网络研究员,并使用我们添加到允许工具中的工具(这些工具也已传递给我们的子智能体)并行执行这些任务。
我们可以看到,文档研究员正在前往文档,仓库分析器正在 GitHub 上查找,网络研究员正在搜索教程和 YouTube 指南。我们正在使用 bash 命令从 GitHub 仓库提取信息,同时搜索 YouTube 频道以获取视频演示。
这些智能体并行交互,从不同的数据源获取信息,将所有内容整合成一个引人入胜的教程。
现在子智能体已经完成了它们的工作,我们将创建全面的指南,根据我们已有的研究结果整合所有必要的文件。

按照仓库分析器的指示,我们已经克隆了 minu 的仓库并保存在这里,并开始为此构建文件夹结构。
在这里,我们可以看到我们有我们的 README 和资源,以及正在整合的代码示例。
在 README 文件中,它为我们提供了学习路径:我们将学习什么、如何使用本指南,以及重要的是,我们可能需要的时间估计。
在这里,我们可以看到它为我们创建了 README,资源部分和学习路径仍在进行中。在我们的资源中,我们有 minu 的链接和参考资料。让我们看看。
在我们的资源中,我们有文档、仓库、pip 包和该库的基础论文;我们有快速入门指南、文档和相关项目。
当我们从社区引入更多信息时,我们拥有各种文章和新闻报道的深度解析。

现在我们可以看到学习路径已经创建。

是时候创建代码示例了。让我们看看这个学习路径。

从概述和动机开始,它解决了什么问题?我们描述了该库的起源故事、之前存在的内容以及那些库的一些问题。
我们可以看到,这是一个相当深入的学习指南和路径。您可以想象,这将是一个需要很长时间才能掌握的内容,从几乎一无所知到成为使用该库的专家。
我们深入探讨了该库后端的一些独特功能,一直到代码示例和许多关于如何尽可能高效地使用它的特性。

我们开始看到我们的代码文件正在为“Hello World”示例、概念和模式编写。
对于我们的“Hello World”示例,我们有一个很好的 README 来开始一些第一步,简单的提取以了解如何开始使用这个库,以及安装步骤。
如果我们想为安装或模式使用特定的库,我们总是可以将其添加到我们的技能中,但现在这将为我们提供一个很好的起点来启动和运行这个库。

当我们查看一些核心概念时,这些概念目前正在创建中。

现在这些完成后,我们可以在 README 中看到下一步该去哪里。一旦我们启动并运行了该库,我们就可以开始查看该库拥有的一些基本概念,以及比较不同后端的速度。
最后,我们将使用第三个文件夹创建实践模式和示例。
我们可以看看这个文件夹,在这里我们可以看到真实世界的处理流程和生产用例。这包括某些模式的示例,以及使用该库的相当深入的代码示例,包含文档字符串、注释以及充分利用该库所需的一切。
我们将通过验证和创建摘要文档来结束,确保一切都已正确完成。我们可以查看输出,它为我们提供了一个完整的学习指南、技能中指定的目录结构、我们请求的级别的学习路径,以及关键功能和快速入门指南。
我们要做的最后一件事是将这个特定的文件 resources.md 写入 Notion 中的一个名为“资源”的子页面。这个页面已经存在,所以让我们看看它是什么样子,然后提示继续使用我们的 MCP 服务器进行必要的写入操作。

在这里,我们可以在 Notion 的“学习”部分下看到一个名为“资源”的子页面。这里的目的是使用 MCP 服务器将我们 resources.md 中的内容填充到这里。

所以,让我们要求我们的智能体将该文件写入 Notion 中的那个子页面。我们将明确说明我们在 Notion 中使用的工具,并允许它使用我们可用的工具。
我们找到了资源页面,我们将读取 resources.md 并将其转换为 Notion 中正确的格式,使用丰富的 Notion 块。

在这里,您可以看到我们使用了 Notion 的多个工具,分批进行,添加了快速入门指南、API 文档以及我们 resources.md 中的其余信息。
在这里的资源文件中,我们可以看到它正在根据文档和我们的 resources.md 动态更新。当这个过程完成时,我们将看到该文件中的所有内容出现在我们的 Notion 页面上。
现在它已经完成了,让我们看看我们的 Notion 页面是什么样子。
在这里,您可以看到我们有官方文档、教程、视频资源、社区频道,所有来自那个 Markdown 文件的数据现在都已写入 Notion。我们使用了技能、MCP 服务器、智能体和子智能体,所有这些都使用了 Agent SDK。
您可以想象为更复杂的工作流程添加更多技能,或添加更多子智能体来执行各种任务。

总结与展望
在本节课中,我们一起学习了如何使用 Claude Agent SDK 构建一个功能强大的研究型智能体。我们涵盖了从智能体架构设计、提示词编写、技能定义,到代码实现、工具集成(如 bash、web_search、web_fetch)和 MCP 服务器(如 Notion)连接的全过程。通过一个为开源 PDF 提取库 minu 创建学习指南的实例,我们看到了智能体如何并行协调多个子智能体,从文档、代码仓库和网络收集信息,并最终综合输出结构化的学习材料和资源。
我们刚刚开始触及功能的表面,并且仍然需要注意一些安全问题。首先,我们允许执行诸如写入和 bash 之类的命令,而无需用户许可。这里的下一步是构建一个类似于 Claude Code 的界面,确保允许用户确认他们希望为特定操作使用这些工具。

我们也刚刚开始为我们的智能体和子智能体添加类似 Claude Code 的中断功能。因此,我们为您提供了继续构建强大智能体应用的基础,我们迫不及待地想看到您接下来会构建什么。
010:总结 🎯
在本节课中,我们将对之前学习的内容进行总结,回顾创建智能体技能的核心要点与最佳实践。
恭喜你坚持学习到这里。你已经学会了如何创建技能,探索了相关的最佳实践,并看到了它们在不同平台上的实际应用。
上一节我们介绍了技能的实际应用与迭代,本节中我们来对整个课程内容进行总结。

以下是创建技能时需要牢记的几个关键步骤:
- 从基础开始:创建技能时,从基本的 Markdown 格式指令开始。
- 逐步扩展:随后遵循渐进式披露的原则进行扩展。
- 监控与迭代:在真实场景中监控你的智能体如何使用技能,并根据观察结果进行迭代优化。
- 提供清晰描述:确保技能描述包含足够的细节,以便你的智能体知道何时应该使用该技能。

另外,请记住,Claude 非常了解什么是技能。因此,你始终可以从一次简单的对话开始创建技能,然后利用“技能创建器”技能来遵循最佳实践。
感谢你与我一同完成这段学习旅程。我迫不及待想看到你运用智能体技能构建出精彩的应用。


本节课中我们一起学习了智能体技能的创建流程与核心原则,包括从基础指令起步、采用渐进式披露、持续监控迭代以及编写清晰的技能描述。掌握这些方法将帮助你有效地构建和优化智能体技能。


浙公网安备 33010602011771号