芥末
发布于 2026-03-23 / 0 阅读
0
0

用 Skill 把 AI Agent 训练成可靠业务执行者:SOP、Checklist 与门禁设计

AI Agent 已经能写代码、查资料、跑测试、生成报告,单看能力很强。但把它真正放进复杂工作流后,经常会出现一种尴尬情况:它不是完全不会做,而是做得不稳定。

它可能能点页面,却漏掉隐藏入口;能生成报告,却只生成最显眼的 HTML 文件;能写脚本,却选择一条在当前 Shell 环境里会失败的命令;能输出结果,却把关键结构悄悄压缩掉。

这类问题的根源不是模型“笨”,而是通用模型默认具备的是通用能力,不是岗位能力。

通用能力解决的是:

  • 能理解大概需求;
  • 能生成一份像样的结果;
  • 能根据上下文临时推理。

岗位能力解决的是:

  • 在当前业务里,什么才算真正完成;
  • 哪些步骤不能跳;
  • 哪些细节过去最容易出错;
  • 交付物应该长什么样;
  • 失败后如何自检、修正、重跑。

Skill 的价值就在这里:把业务经验、执行步骤、质量标准、失败教训和验收规则,沉淀成 AI Agent 可以重复执行的岗位 SOP(标准作业程序)。

一句话概括:

Skill 不是让模型变聪明,而是让模型在指定业务里变可靠。

Skill 到底是什么

在 AI Agent 工作流里,Skill 可以理解为一组可复用的能力包。它通常不只是几句 Prompt,而是包含主说明、参考模板、检查清单、输出规范和门禁规则的一整套执行约束。

一个比较实用的 Skill 结构可以长这样:

web-testing/
├── SKILL.md
├── references/
│   ├── checklist-template.md
│   ├── report-template.md
│   └── ui-ux-checklist.md

各文件职责如下:

文件作用
SKILL.md主控文件,定义触发条件、执行阶段、必须遵守的规则、失败模式和门禁
references/checklist-template.md执行过程中的进度控制表,用来防止漏步骤
references/report-template.md最终报告的结构契约,规定 Markdown 和 HTML 必须包含哪些模块
references/ui-ux-checklist.mdUI/UX 审查标准,例如可读性、对齐、表单反馈、状态提示等

如果只写一个很长的 Prompt,AI 可能一开始会照做,但任务一复杂、上下文一变长,就会开始丢细节。Skill 的设计重点不是“说清楚一次”,而是把任务拆成可执行、可检查、可阻断的流程。

为什么复杂任务里 AI 会“失忆”

大模型的上下文窗口是有限的。即使窗口很大,也不代表它会稳定记住所有约束。

复杂任务里常见的退化现象有四种:

现象表现后果
约束被稀释前面写过的规则,后面执行时不再严格遵守漏步骤、漏文件、漏检查
细节被压缩输出越来越短,只保留看起来最重要的部分报告结构缩水
成果优先偏差优先生成最像最终结果的产物只交 HTML,不交 Markdown 或站点地图
自检缺失认为“看起来完成”就是“完成”隐藏问题难以被发现

所以,复杂任务不能只靠一句“请认真检查”。更可靠的写法是:

当页面存在 Tab、展开行、子表格、分页、弹窗、蓝色链接或可点击文本时:
1. 必须切换或展开后重新扫描 DOM;
2. 必须枚举所有候选链接;
3. 必须逐个验证是否进入新页面或触发新状态;
4. 如果仍存在未验证入口,禁止结束页面发现阶段。

这种规则由四部分组成:

触发条件 + 必做动作 + 自检方式 + 不通过后果

这才是 Skill 中真正有约束力的 SOP。

一个 web-testing Skill 的目标

web-testing 为例,它的目标是:输入任意网站链接,让 AI Agent 自动完成深度探索、测试、报告生成,甚至进一步驱动修复与回归验证。

理想流程如下:

flowchart TD
    A[输入网站 URL] --> B[站点探索与页面发现]
    B --> C[生成 sitemap]
    C --> D[UI/UX 审查]
    C --> E[功能测试]
    C --> F[CRUD 链路测试]
    D --> G[问题归类与严重程度评估]
    E --> G
    F --> G
    G --> H[生成 Markdown 测试报告]
    H --> I[生成 HTML 测试报告]
    I --> J[人工确认]
    J --> K[AI 根据报告修复问题]
    K --> L[重新执行测试验证]
    L --> G

报告通常需要包含:

  • 总评分;
  • 站点地图;
  • 页面层级;
  • 每个页面截图;
  • UI/UX 审查结果;
  • 功能测试结果;
  • CRUD(创建、读取、更新、删除)链路测试;
  • Bug 列表;
  • 严重程度分级;
  • 修复建议;
  • Markdown 文件;
  • HTML 文件。

这个任务看起来只是“自动测试网站”,实际复杂度很高。因为 AI 不仅要会操作浏览器,还要知道哪些入口必须穷举、哪些结果必须记录、哪些文件必须生成、哪些结构不能省略。

Skill 训练闭环

Skill 不是一次写完的。更可行的方式是让 AI 在真实任务里运行,然后把失败沉淀成新规则。

flowchart LR
    A[执行真实任务] --> B[发现失败或遗漏]
    B --> C[定位失败类型]
    C --> D[分析根因]
    D --> E[补充 Skill 规则]
    E --> F[加入 Checklist 和门禁]
    F --> G[重新执行验证]
    G --> A

关键点不在“重新执行”,而在中间的规则沉淀:

  • 把错误写成规则;
  • 把经验写成 SOP;
  • 把 SOP 写成 AI 自己也能检查的门禁。

坑一:AI 不是不会点击,而是不知道哪些入口必须点

Web 自动化测试的第一关是页面发现。页面没发现全,后面的 UI 审查、功能测试、问题归类都不可能完整。

一个常见失败场景是:某个深层页面入口藏在版本详情页的 Tab 里,Tab 内容区又有表格,表格里还有蓝色链接。AI 可能已经看到了 Tab,也看到了链接,但没有把这个链接当成“必须递归验证的新页面入口”。

它的问题不是没有能力点击,而是靠主观判断停下来了。

错误规则通常长这样:

请认真检查页面,不要遗漏入口。

这句话太抽象。AI 很难知道“认真”具体意味着什么。

更好的 Skill 规则应该写成:

页面发现阶段规则:

当页面出现以下任一结构时,必须进入递归扫描:
- Tab;
- 折叠面板;
- 展开行;
- 子表格;
- 分页;
- 弹窗;
- 蓝色链接;
- 带 hover 状态的文本;
- 图标按钮;
- 操作列中的查看、详情、编辑、配置、部署等入口。

执行要求:
1. 页面必须滚动到底部后再结束扫描;
2. 每切换一个 Tab,必须重新枚举 DOM 中的链接和按钮;
3. 每展开一行,必须扫描展开区域里的链接;
4. 每个候选入口都必须实际点击或打开验证;
5. 发现新 URL、新路由、新弹窗或新状态时,必须加入 sitemap;
6. 只要存在未验证候选入口,禁止结束页面发现阶段。

这条规则把“仔细”拆成了可执行动作。

页面发现可以按这样的流程控制:

flowchart TD
    A[进入页面] --> B[滚动到底部]
    B --> C[扫描 DOM]
    C --> D{是否存在 Tab/表格/展开行/弹窗/链接}
    D -- 否 --> H[记录页面并结束扫描]
    D -- 是 --> E[逐个触发交互]
    E --> F{是否产生新 URL/新状态/新弹窗}
    F -- 是 --> G[加入待探索队列]
    F -- 否 --> C
    G --> C

这种规则适合所有需要“穷举”的场景。AI 天然倾向于根据语义判断重要性,但测试任务需要的是系统性穷举,而不是主观取舍。

坑二:AI 会优先生成最像成果的交付物

复杂任务经常有多个交付物。例如测试任务可能要求同时输出:

sitemap.md
test-report.md
test-report.html

AI 很容易只生成 test-report.html,因为 HTML 最像最终成果,也最复杂、最显眼。上下文变长后,模型会优先保住它认为最重要的东西,而忽略朴素但必需的文件。

解决方式不是补一句“记得全部生成”,而是把交付顺序和验收动作写死。

报告生成阶段必须按以下顺序执行:

1. 生成 sitemap.md;
2. 检查 sitemap.md 存在且大小大于 0;
3. 生成 test-report.md;
4. 检查 test-report.md 存在且大小大于 0;
5. 生成 test-report.html;
6. 检查 test-report.html 存在且大小大于 0;
7. 读取文件列表并确认三份文件全部存在;
8. 任一文件缺失或为空,禁止宣布任务完成。

对应的门禁可以写成脚本化检查:

test -s sitemap.md || { echo "sitemap.md missing or empty"; exit 1; }
test -s test-report.md || { echo "test-report.md missing or empty"; exit 1; }
test -s test-report.html || { echo "test-report.html missing or empty"; exit 1; }

复杂任务里,顺序本身就是质量控制。没有顺序,AI 会根据自己的注意力分配做取舍;有了顺序和门禁,它才会按交付契约执行。

坑三:AI 不一定懂当前环境里的工程约束

AI 生成方案时,有时会选择“看起来最省事”的做法。例如为了生成带截图的 HTML 报告,它可能用下面这种方式拼接长脚本:

python3 -c "非常长的一段 Python 代码,里面还包含大量 HTML 和 base64 图片数据"

这类写法有几个问题:

  • Shell 命令长度有限;
  • 超长字符串难以调试;
  • base64 图片会让 HTML 急剧膨胀;
  • 失败后很难定位是哪一段内容导致的;
  • 同一个命令在不同环境里稳定性不同。

Skill 里必须明确工程边界,而不是默认 AI 会自动选择可维护方案。

工程约束:

禁止:
- 使用 python3 -c 生成长报告;
- 使用超长 echo 写入大文件;
- 在 HTML 中内嵌大量 base64 图片;
- 把多页报告拼进单条 Shell 命令。

必须:
- 将 Python 逻辑写入独立脚本文件后执行;
- HTML 中的截图使用本地相对路径引用;
- 大文件分步骤生成;
- 每一步生成后检查文件存在性和大小;
- 命令失败时保留中间文件,便于定位问题。

更稳定的写法是先生成脚本文件:

cat > generate_report.py <<'PY'
from pathlib import Path

html = """<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Web Testing Report</title>
</head>
<body>
  <h1>Web Testing Report</h1>
  <img src="screenshots/home.png" alt="home page screenshot">
</body>
</html>
"""

Path("test-report.html").write_text(html, encoding="utf-8")
PY

python3 generate_report.py
test -s test-report.html || { echo "HTML report missing or empty"; exit 1; }

Skill 不只是业务手册,也应该是 AI Agent 的工程生存指南。否则业务逻辑可能没问题,最终却死在命令行长度、文件写入、路径引用这类基础工程约束上。

坑四:最危险的不是没生成,而是看起来生成了

报告生成阶段还有一种更隐蔽的问题:文件存在,内容也像报告,但关键结构被压缩掉了。

例如早期报告中每个页面都有独立模块:

  • 页面截图;
  • UI/UX 审查;
  • 功能测试明细;
  • 本页问题汇总;
  • HTML 中的 page-card 结构。

后续迭代中,AI 可能因为上下文消耗过多,在生成最终报告时进入“节约模式”,把逐页面详细模块压缩成一个整体问题列表。表面看报告还在,问题列表也在,但报告已经不满足交付契约。

这种错误最危险,因为它很容易通过粗略验收。

解决方式是给报告结构加门禁:

报告结构完整性 Checklist:

- [ ] sitemap 中的页面数已统计;
- [ ] Markdown 报告中的页面模块数 = sitemap 页面数;
- [ ] HTML 报告中的 page-card 数量 = sitemap 页面数;
- [ ] 每个页面都有截图;
- [ ] 每个页面都有 UI/UX 审查;
- [ ] 每个页面都有功能测试结果表;
- [ ] 每个页面都有本页问题汇总;
- [ ] 总问题汇总表存在;
- [ ] 严重程度分级存在;
- [ ] 修复计划表存在;
- [ ] 数据清理记录存在;
- [ ] 任一检查失败时,禁止宣布报告完成。

也可以让 AI 执行简单的结构校验:

from pathlib import Path
import re

sitemap = Path("sitemap.md").read_text(encoding="utf-8")
report_md = Path("test-report.md").read_text(encoding="utf-8")
report_html = Path("test-report.html").read_text(encoding="utf-8")

# 假设 sitemap 中页面行使用 "- /path" 格式
page_count = len(re.findall(r"^- /", sitemap, flags=re.M))

md_page_modules = len(re.findall(r"^## 页面:", report_md, flags=re.M))
html_page_cards = report_html.count('class="page-card"')

errors = []

if md_page_modules != page_count:
    errors.append(f"Markdown 页面模块数不匹配:{md_page_modules} != {page_count}")

if html_page_cards != page_count:
    errors.append(f"HTML page-card 数量不匹配:{html_page_cards} != {page_count}")

required_sections = ["问题汇总", "严重程度分级", "修复计划", "数据清理记录"]
for section in required_sections:
    if section not in report_md:
        errors.append(f"Markdown 缺少章节:{section}")

if errors:
    for error in errors:
        print(error)
    raise SystemExit(1)

print("报告结构检查通过")

复杂任务不能只验收“有没有文件”,还要验收“结构是不是完整”。没有结构门禁,AI 很容易从完整交付滑向表面完成。

把失败写回 Skill:一套可复用方法

训练 Skill 可以按四步走。

1. 先跑真实任务,再写规则

不要一开始就闭门设计一大份 Skill。更有效的方式是让 AI Agent 先跑 3~5 次真实任务,然后观察它怎么失败。

重点记录这些问题:

观察点示例
漏了什么漏掉 Tab 下的深层页面
跳了哪一步没有生成 sitemap
哪些结果只是看起来完成报告存在,但缺少逐页面模块
哪些错误重复出现每次都忘记检查文件大小
哪些方案不适合当前环境使用超长 python3 -c

没有真实失败,很难写出有用规则。Skill 应该从执行结果里长出来,而不是从想象里写出来。

2. 把要求改写成 SOP

抽象要求对 AI 的约束力很弱。写 Skill 时,要尽量把形容词改成动作。

弱规则强规则
请仔细检查页面页面存在 Tab、展开行、表格、弹窗时,必须逐个触发并重新扫描 DOM
请保证报告完整页面模块数必须等于 sitemap 页面数,HTML 中 page-card 数量也必须等于页面数
请自查结果每个阶段结束前必须执行 checklist,失败则回到对应阶段修复
请生成所有文件按固定顺序生成文件,每生成一个就检查存在且大小大于 0

强规则的格式建议统一成:

规则名称:
触发条件:
必做动作:
自检方式:
不通过后果:

例如:

规则名称:Tab 内容递归扫描

触发条件:
页面存在 Tab 或类似分栏切换组件。

必做动作:
逐个切换 Tab,并在每次切换后重新扫描 DOM 中的链接、按钮、表格操作列和弹窗入口。

自检方式:
记录已访问 Tab 数量、每个 Tab 中发现的候选入口数量、已验证入口数量。

不通过后果:
如果存在未验证入口,禁止结束页面发现阶段。

3. Checklist 和门禁必须同时存在

Checklist 解决“检查什么”的问题,门禁解决“不检查会怎样”的问题。

只有 Checklist,没有门禁,AI 可能知道要检查,但为了节省上下文直接跳过。

只有门禁,没有 Checklist,AI 不知道具体怎么判断通过或失败。

一个阶段控制模板可以这样写:

# 阶段门禁表

## 阶段 1:页面发现

- [ ] 已访问首页
- [ ] 已滚动到页面底部
- [ ] 已扫描导航菜单
- [ ] 已扫描 Tab
- [ ] 已扫描展开行
- [ ] 已扫描表格操作列
- [ ] 已验证所有候选链接
- [ ] 已生成 sitemap.md
- [ ] sitemap.md 文件存在且大小大于 0

门禁:
任一检查项未完成,禁止进入阶段 2。

阶段之间的关系可以设计成阻断式:

flowchart TD
    A[阶段 1:页面发现] --> B{页面发现门禁通过?}
    B -- 否 --> A
    B -- 是 --> C[阶段 2:UI/UX 审查]
    C --> D{UI/UX 门禁通过?}
    D -- 否 --> C
    D -- 是 --> E[阶段 3:功能与 CRUD 测试]
    E --> F{功能测试门禁通过?}
    F -- 否 --> E
    F -- 是 --> G[阶段 4:报告生成]
    G --> H{报告结构门禁通过?}
    H -- 否 --> G
    H -- 是 --> I[任务完成]

4. 让 AI 参与 Skill 复盘

AI 不应该只是执行者,也可以成为 Skill 的共同维护者。每次执行失败后,可以让它基于结果分析根因,并直接输出应该补充到 Skill 里的规则。

可复用指令如下:

请基于本次执行结果,对当前 Skill 做一次复盘:

1. 哪些输出没有达到预期?
2. 每个问题属于哪一类:
   - 页面发现
   - 交付完整性
   - 工程约束
   - 报告结构完整性
   - 消费场景适配
3. 根因是什么:
   - 规则缺失
   - 规则不明确
   - 缺少 checklist
   - 缺少门禁
   - 上下文过长导致细节被压缩
   - 当前执行环境约束未声明
4. 请给出应该补充到 Skill 中的具体规则,必须包含:
   - 触发条件
   - 必做动作
   - 自检方式
   - 不通过后果
5. 直接输出修改后的 Skill 片段。
6. 说明这次修改预期解决什么问题。

这样可以把一次失败转化成长期规则。Skill 的质量会随着真实执行次数增加而提高。

一个可落地的 SKILL.md 片段

下面是 web-testing Skill 主控文件可以采用的写法示例:

# web-testing Skill

## 触发条件

当用户提供网站 URL,并要求进行页面探索、UI/UX 审查、功能测试、CRUD 测试、测试报告生成或自动化质量审查时,启用本 Skill。

## 总目标

对目标网站进行完整探索和测试,输出:
1. sitemap.md
2. test-report.md
3. test-report.html
4. screenshots/ 目录
5. 问题汇总与修复建议

## 阶段 1:页面发现

### 必做动作

- 访问首页;
- 扫描导航菜单;
- 滚动到页面底部;
- 扫描 Tab、折叠面板、展开行、表格操作列、分页、弹窗;
- 对所有候选入口进行点击或打开验证;
- 发现新 URL、新路由、新弹窗、新状态时,加入 sitemap;
- 递归处理所有新页面,直到不存在未验证入口。

### 门禁

只有满足以下条件,才能进入阶段 2:

- sitemap.md 已生成;
- sitemap.md 文件大小大于 0;
- 不存在未验证候选入口;
- 每个页面都已记录页面类型:
  - 只读页面
  - 表单页面
  - CRUD 页面
  - 配置页面
  - 详情页面

## 阶段 2:UI/UX 审查

对 sitemap 中每个页面执行 UI/UX 审查,检查:
- 布局一致性;
- 视觉层级;
- 表单可用性;
- 错误提示;
- 空状态;
- 加载状态;
- 响应式表现;
- 可访问性基础问题。

门禁:
每个页面都必须有 UI/UX 审查记录。

## 阶段 3:功能与 CRUD 测试

对可操作页面执行功能测试。
如果页面包含创建、读取、更新、删除能力,必须执行完整 CRUD 链路。

门禁:
每个可操作页面都必须有测试结果表。
如果无法测试,必须说明阻塞原因。

## 阶段 4:报告生成

必须按顺序生成:

1. sitemap.md
2. test-report.md
3. test-report.html

每生成一个文件,必须检查:
- 文件存在;
- 文件大小大于 0;
- 内容包含必需章节。

报告结构门禁:
- Markdown 页面模块数 = sitemap 页面数;
- HTML page-card 数量 = sitemap 页面数;
- 每个页面都有截图、UI/UX 审查、功能测试结果、本页问题汇总;
- 总问题汇总表存在;
- 修复计划存在。

任一检查失败,禁止宣布任务完成。

这种写法比“请完整测试网站并生成报告”更长,但它能显著降低 AI 自由发挥带来的不确定性。

Skill 适合什么场景,不适合什么场景

场景是否适合 Skill原因
自动化测试适合流程长、交付物多、容易漏步骤,需要门禁
代码审查适合可以沉淀规则、检查项、严重程度分类
线上故障排查适合需要固定排查路径、日志采集规则、升级条件
数据分析报告适合输出结构固定,适合模板化和质量检查
临时闲聊问答不太适合任务短、复用价值低
一次性创意发散不太适合过强规则可能限制探索空间
需求极不稳定的早期探索谨慎使用可以先积累失败案例,再沉淀 Skill

判断是否值得写 Skill,可以看三个问题:

  1. 这个任务会不会重复执行?
  2. 失败是否有规律?
  3. 交付结果是否需要稳定验收?

如果三个答案都是“是”,就值得把流程沉淀成 Skill。

常见误区

误区问题改法
把 Skill 当长 Prompt只描述目标,不约束过程写执行阶段、检查项、门禁
只写正向流程没有覆盖失败模式把真实翻车写成规则
只让 AI 自觉检查上下文变长后容易跳过Checklist 后必须加阻断条件
不声明工程环境限制AI 可能选不稳定方案写清命令长度、文件写入、路径引用等约束
一次写完后不再维护业务变化后规则过期每次失败后复盘并更新 Skill

可靠 AI Agent 的核心不是上限,而是下限

业务里最怕的不是 AI 偶尔不够惊艳,而是交付质量不稳定:

  • 这次页面发现完整,下次漏掉深层入口;
  • 这次三份文件齐全,下次只交一份 HTML;
  • 这次报告结构完整,下次悄悄压缩;
  • 这次截图路径正确,下次全部失效。

Skill 解决的就是下限问题。它把“靠模型状态发挥”变成“靠机制稳定交付”。

一个成熟的 Skill 至少要具备四类内容:

业务流程:任务分几个阶段,每个阶段做什么
执行动作:遇到具体场景时必须怎么做
质量门禁:做到什么程度才允许进入下一阶段
复盘机制:失败后如何把经验写回 Skill

把 AI Agent 当作一个聪明新人来训练,会更容易理解 Skill 的设计方式。新人不是只听一句“认真点”就能稳定交付,他需要流程、样例、检查表、验收标准和失败反馈。AI Agent 也一样。

Skill 的最终目标不是让 AI 看起来更会说,而是让它在真实业务中做到:

  • 知道流程;
  • 记住教训;
  • 会自检;
  • 过门禁;
  • 稳定交付。

评论