6.1 Skill 介绍#
在前面的章节中,我们已经围绕 RAG、Agent、LangGraph 、工具以及记忆机制,逐步搭建起了一个能够理解问题、调用工具、保存上下文并持续执行任务的智能体系统。到这里,一个新的工程问题也会自然浮现出来,当智能体需要反复处理某一类复杂任务时,是否每次都要重新编写提示词、重复加载规则,并在运行时临时组织流程?
如果答案是肯定的,那么智能体虽然具备了完成任务的能力,却仍然缺少稳定复用能力的方法。换言之,它会“做”,但还不够“会做同一类事”。因此,在现代 Agent 系统中,除了工具和记忆机制这类基础能力之外,还需要一种更高层次的组织机制,用来沉淀任务经验、封装执行规则,并在合适的时候按需加载,而这正是技能(Skill )所要解决的问题。
6.1.1 Skill 的必要性#
从表面上看,很多 Agent 任务似乎都可以通过一段提示词解决。例如,我们可以告诉模型“请根据素材撰写技术文章”,也可以要求它“先生成提纲,再逐节展开,最后统一润色”。在一次性任务中这种做法通常已经足够,但是,当任务开始变得复杂以后单纯依赖提示词会逐渐暴露出 3 个问题。
问题1:任务流程难以稳定复用。假设我们已经摸索出一套较好的文章写作流程,包括先阅读素材、再提炼主线、然后分节撰写、最后做术语统一。如果这些规则始终只停留在当前对话中,那么下一次执行相似任务时,就仍然需要重新描述一遍。
问题2:上下文容易持续膨胀。随着经验逐渐增加,我们往往会不断向提示词中追加规则、边界条件和参考资料。这样虽然能提高任务完成质量,但也会使提示词越来越长,既增加上下文负担,也不利于模型在不同任务之间快速切换。
问题3:经验无法工程化沉淀。一个成熟的 Agent 系统通常不只服务于一次对话,而是需要长期迭代、多人协作和跨任务复用。如果某类任务的最佳实践只能以自然语言散落在对话历史中,那么它就很难成为真正可维护、可共享的工程资产。
因此,Skill 的核心意义并不只是“多写一份说明文档”,而是把已经验证有效的任务方法沉淀为可重复使用的能力单元。这样一来,智能体在面对相似任务时,不必从零开始组织行为,而可以直接调用已经定义好的能力模块。
6.1.2 Skill 的定义#
从广义上看,Skill 可以理解为面向某类任务的专业化能力。它不是一个底层工具,也不是一个独立运行的智能体,而是一组围绕特定目标组织起来的说明、规则、流程和辅助资源。它的目标不是代替 Agent 本身做决策,而是在 Agent 需要时为其补充一套更具体的任务知识。它主要通过提示词驱动,但又不等同于一次性提示词,因为它强调的是能力的封装与按需启用,而不仅仅是当前这一轮如何提问。
进一步地,Skill 的重点并不在于把一段提示词单独保存下来,而在于把一类任务所需的方法、规则与支持材料组织成可复用的能力单元。也正因为如此,Skill 往往会以目录形式存在,并由规则文件、参考说明和辅助资源共同组成。
6.1.3 Skill 的核心组成#
从工程实现角度看,一个可用的 Skill 往往不是单一文件,而是一个围绕特定任务组织起来的目录结构。典型形式如下所示:
1 skills/
2 skill-name/
3 SKILL.md
4 scripts/
5 function.py
6 references/
7 references-style.md
8 assets/
9 template.md这个目录结构之所以重要,是因为它把规则入口、详细说明和辅助资源分开放置,从而使 Skill 既便于复用,也便于后续维护。
进一步来看,一个可用的 Skill 通常至少包括以下 3 个层面的信息:
第1层是元数据。SKILL.md 通常以 YAML frontmatter 开头,其中最关键的是 name 和 description 两个字段。name 用于标识这个 Skill,description 则用于告诉 Agent 这个 Skill 是做什么的、在什么情况下应该被启用。
第2层是正文指令。也就是 SKILL.md 中 frontmatter 之后的主体内容。这里通常会写明任务目标、执行步骤、决策条件、输入输出要求以及异常情况的处理方法。换言之,Skill 的正文不是普通介绍文字,而是面向 Agent 的操作说明。
第3层是支持资源(非必要)。当正文不足以承载全部细节时,就可以把补充材料拆分到独立文件中。例如,可以将引用规则写入 references/,将各类脚本放入 scripts/,将模板与示例等放入 assets/。
6.1.4 Skill 示例讲解#
下面,我们通过一个可视化讲解高中数学中常见函数性质的 Skill 来介绍一个实际可用 Skill 的内容结构。后续通过使用该 Skill,当我们输入类似“解释一下函数 f(x)=sin(x) 的性质” 这样的描述时,大模型能够为我们生成一个解释该函数性质的前端页面,如图6-1所示。
完整文件获取可参见 Code/Chapter06/high-school-function-showcase 目录。如下所示
high-school-function-showcase
├── SKILL.md
├── assets
│ └── function_page_template.html
├── references
│ ├── explanation-style.md
│ └── supported-functions.md
└── scripts
├── build_function_page.py
└── generate_function_data.py在上述目录结构中, SKILL.md 中的内容大致如下所示:
1 ---
2 name: high-school-function-showcase
3 description: 为高中数学中的常见函数生成可视化讲解页面。适用于用户希望查看某个函数的数学公式、函数图像、
4 基本性质和常见考点,或需要把这些内容制作成静态 HTML 教学页面的场景。使用时先调用脚本生成函数图像数据,
5 再调用脚本渲染 HTML 页面。优先使用本 skill 自带的标准库脚本、参考说明和页面模板,不依赖额外安装包或插件。
6 ---
7
8 # 高中函数可视化讲解器
9
10 ## 概述
11
12 使用这个技能为高中数学中的常见函数生成一页可直接打开的静态 HTML 教学页面。
13
14 页面默认同时展示:
15
16 - 函数公式
17 - 函数图像
18 - 基本性质
19 - 常见考点
20
21 ## 工作流程
22
23 1. 先识别用户给出的函数。
24 支持优先处理 `f(x)=sin(x)`、`f(x)=cos(x)`、`f(x)=tan(x)`、...等常见形式。
25
26 2. 先调用 `scripts/generate_function_data.py` 生成函数图像数据。
27 该脚本输出 `data.json`,其中包含公式、取点数据、性质摘要、详细性质和常见考点。
28
29 3. 再调用 `scripts/build_function_page.py` 把 `data.json` 渲染为静态 HTML 页面。
30 页面模板来自 `assets/function_page_template.html`。
31
32 4. 如果函数形式不在直接支持列表内,先阅读 `references/supported-functions.md` 判断是否能归类到已支持类型。
33 不能稳定归类时,不要臆造图像或性质。
34
35 5. 如果需要解释页面中的教学内容,阅读:
36 - `references/supported-functions.md`
37 - `references/explanation-style.md`
38
39 ## 典型用法
40
41 ### 1. 先生成 `sin(x)` 的图像数据
42
43 ```bash
44 python3 scripts/generate_function_data.py \
45 --function "f(x)=sin(x)" \
46 --output /tmp/math-sin-demo/data.json
47 ```
48
49 ### 2. 再生成可视化页面
50
51 ```bash
52 python3 scripts/build_function_page.py \
53 --data /tmp/math-sin-demo/data.json \
54 --output /tmp/math-sin-demo/index.html
55 ```
56 ...从这个结构可以看出,Skill 的重点不在于篇幅长,而在于行为明确。它需要告诉 Agent 应该做什么、先做什么、何时补充参考材料,以及最终输出应该满足什么标准。
在下一节内容中,我们再来介绍如何基于 LangChian 来加载和使用这个技能。
6.1.5 Skill 、Prompt 与 Tool 的区别#
理解 Skill 时,一个常见误区是把它与 Prompt 和 Tool 混为一谈。事实上,这三者分别位于不同层面。
首先,Prompt 主要解决“当前这一轮如何表达要求”的问题。它通常服务于一次性任务输入。而 Skill 更强调长期复用,它把多轮实践中沉淀出来的方法整理为稳定的能力说明。因此,可以把 Prompt 理解为一次提问,把 Skill 理解为一套可反复调用的做事方法。
其次,Tool 主要解决“执行什么外部动作”的问题。例如检索知识库、读写文件、访问 API、运行脚本等,都属于工具能力。Skill 则更像这些工具的组织说明书,它告诉 Agent 在什么情况下应该调用哪些工具、按照什么顺序调用、输出应该满足什么约束。换言之,Tool 凸显的是一个能力点,而 Skill 表现的则是将一系列能力组织成一个可复用的技能。
从工程角度看,可以将三者的关系简单概括为:
| 概念 | 主要作用 | 适用问题 |
|---|---|---|
| Prompt | 表达当前请求 | 这一轮需要模型如何回答 |
| Tool | 提供外部动作 | 需要检索、计算、执行脚本或访问系统 |
| Skill | 封装专门化能力 | 需要复用一套任务流程、规则和参考材料 |
6.1.6 小结#
本节围绕 Skill 的概念、结构与工作方式进行了介绍。可以看到,Skill 并不是对 Prompt 的简单封装,也不是 Tool 的替代品,而是一种位于更高层的能力组织机制。它把任务经验、执行步骤和支持资源沉淀为可按需加载的能力模块,从而让 Agent 在面对重复性复杂任务时,具备更稳定、更可维护的执行方式。
至此,我们已经完成了对 Skill 基本概念的介绍。后续内容将继续围绕 Skill 的实际组织方式与使用方法展开,使其真正成为 Agent 工程中的可复用能力单元。
参考资料#
[1] LangChain. Skills (Deep Agents). https://docs.langchain.com/oss/python/deepagents/skills
[2] LangChain. Skills (Multi-agent). https://docs.langchain.com/oss/python/langchain/multi-agent/skills