本节目标

  1. 理解渐进式信息披露(Progressive Disclosure)架构的设计理念

  2. 掌握条件 Skill 加载的三种策略(文件类型 / 任务类型 / 关键词触发)

  3. 学会 Skill Bundles 的组织方式(references / scripts / templates 子目录)

  4. 理解 Gotchas 章节作为最高信号密度的内容设计

  5. 掌握 Skill 测试、版本化和组合模式


核心知识点

1. 渐进式信息披露架构

传统的"全量加载"模式有一个致命缺陷:Skill 文件越长,模型越不认真看。渐进式信息披露(Progressive Disclosure)将 Skill 内容划分为多层,按需展开:

┌──────────────────────────────────────────┐
│ Layer 0: Skill 注册文件(metadata + 触发条件)│
│ 约 50-100 tokens,必定加载                 │
│ 内容:名称、描述、触发词、简要说明            │
├──────────────────────────────────────────┤
│ Layer 1: 核心指令(Core Instructions)     │
│ 约 500-1500 tokens,触发时加载              │
│ 内容:核心流程、关键规则、输出格式            │
├──────────────────────────────────────────┤
│ Layer 2: 详细参考(Detailed Reference)     │
│ 约 2000-5000 tokens,按需引用               │
│ 内容:完整 API 文档、最佳实践、代码模板       │
├──────────────────────────────────────────┤
│ Layer 3: 示例与模板(Examples & Templates) │
│ 不限长,仅在明确请求时加载                    │
│ 内容:完整项目示例、视频脚本、模板文件         │
└──────────────────────────────────────────┘

设计原则:每一层都是独立的、自包含的文件。Agent 可以先读取 Layer 0-1 就开始工作,需要细节时再深入 Layer 2-3。这避免了"一本 50 页的手册塞进 prompt"的低效模式。

实际目录结构:

skills/
├── python-patterns/              # Skill 名称
│   ├── SKILL.md                  # Layer 0-1:核心内容
│   ├── references/               # Layer 2:详细参考
│   │   ├── type-hints-guide.md
│   │   ├── async-patterns.md
│   │   └── dependency-injection.md
│   ├── templates/                # Layer 3:模板
│   │   ├── fastapi-crud.py.tmpl
│   │   └── service-layer.py.tmpl
│   └── scripts/                  # 辅助脚本
│       └── check-coverage.sh

2. 条件 Skill 加载

不是所有 Skill 每次对话都需要。条件加载机制让系统自动判断"这个 Skill 现在该不该加载"。

策略 1:文件类型触发
# 在 SKILL.md 的 frontmatter 中定义
---
triggers:
  file_patterns:
    - "*.py"              # 编辑 Python 文件时加载
    - "*.pyi"             # Python stub 文件
    - "pyproject.toml"    # Python 项目配置
  file_content_patterns:
    - "from fastapi"      # 检测到 FastAPI 导入
    - "@pytest.mark"      # pytest 标记
    - "async def"         # 异步函数
---
策略 2:任务类型触发
---
triggers:
  task_types:
    - "code_review"       # 用户说"/review"或"审查代码"
    - "refactoring"       # 用户说"重构"
    - "testing"           # 用户说"写测试"或"运行测试"
    - "deployment"        # 部署相关操作
---
策略 3:关键词触发
---
triggers:
  keywords:
    # 精确匹配
    exact: ["数据库迁移", "database migration", "Alembic"]
    # 模糊匹配(正则)
    regex: ["SQL\\s*Alchemy", "ORM\\s*(模型|映射)"]
    # 语义匹配(基于 embedding)
    semantic: ["数据库表结构变更", "schema 版本管理"]
---
策略 4:依赖触发
---
triggers:
  depends_on:
    - skill: "python-patterns"    # 当 python-patterns 被加载时,自动加载本 Skill
      reason: "Django 基于 Python 模式,需要先理解类型系统和异步机制"
    - skill: "database-migrations"
      condition: "task_contains('migration')"
---

3. Skill Bundles 设计

一个成熟的 Skill 应该是一个"Bundle"——不仅仅是 Markdown 文件,而是一个包含多种资源的目录:

skills/
└── django-security/
    ├── SKILL.md                 # 入口文件(始终存在)
    │   # 包含:
    │   # - Frontmatter(触发条件、依赖、版本)
    │   # - 核心安全原则(5-7 条)
    │   # - 标准审查流程
    │   # - 输出格式模板
    │   # - Gotchas(常见陷阱)
    │
    ├── references/              # 深度参考文档
    │   ├── owasp-django.md      # Django 特有的 OWASP 关注点
    │   ├── csrf-patterns.md     # CSRF 防护模式
    │   ├── xss-prevention.md    # XSS 防护(Django 模板引擎)
    │   └── middleware-guide.md  # 安全中间件配置
    │
    ├── templates/               # 输出模板
    │   ├── audit-report.md.tmpl # 安全审查报告模板
    │   └── fix-script.py.tmpl   # 常见修复脚本模板
    │
    └── scripts/                 # 可执行脚本
        ├── scan-secrets.sh      # 密钥泄露扫描
        └── check-headers.py     # HTTP 安全头检查

入口文件 SKILL.md 的结构模板

---
name: django-security
version: 2.0.0
author: devsec-team
description: Django 应用安全审查与加固
triggers:
  file_patterns: ["**/settings.py", "**/views.py", "**/urls.py"]
  keywords: ["安全审查", "security audit", "Django security"]
  task_types: ["code_review", "security_audit"]
depends_on:
  - skill: "python-patterns"
  - skill: "web-security"
---
​
# Django Security Skill
​
## 核心原则
1. 永远不要在 settings.py 中硬编码 SECRET_KEY
2. DEBUG=False 是生产环境的强制要求
3. 所有的用户输入都视为不可信的(包括 authenticated user)
4. CSRF 中间件不能禁用(除非有明确的 API-only 理由)
5. ORM 查询优先于原始 SQL
​
## 审查流程
1. 检查 settings.py 安全配置
2. 检查所有 View 中的用户输入处理
3. 检查模板中的 XSS 风险
4. 检查 URL 配置中的权限控制
5. 运行 `python manage.py check --deploy`
​
## Gotchas
- **Django 默认的 CSRF 中间件不保护 GET 请求**——如果你的 GET 请求修改了数据,这是你的 Bug
- **`mark_safe()` 是 XSS 的邀请函**——除非你 100% 确定内容是安全的
- **`raw()` 查询的参数化不会自动生效**——不同于 `filter()`,必须手动处理
​
## 输出格式
安全审查报告必须包含:
(见 references/audit-report.md.tmpl)

4. Gotchas 章节的设计哲学

Gotchas(常见陷阱)是一个 Skill 中信号密度最高的内容。它不是"一般性建议",而是"实战中踩过的坑"。

Gotchas 的设计标准

## Gotchas
​
一个好 Gotcha 的标准:
1. **具体**:精确到代码模式,而非泛泛而谈
2. **有原因**:解释为什么会掉进这个坑
3. **有解法**:给出具体的、可执行的修复方案
4. **有信号**:告诉 Agent 什么情况下需要警惕这个坑
​
# 示例:好的 Gotcha
- Gotcha: Django REST Framework 的 `Serializer.save()` 在 `perform_create` 
  之前调用,导致 hook 中获取不到保存后的对象 ID。
  触发信号:当代码同时使用 Serializer.save() 和 perform_create() 时。
  解法:在 `perform_create()` 中手动保存,或在 `create()` 方法中统一处理。
​
# 示例:差的 Gotcha
- 要注意 Django 的序列化器有一些陷阱。

5. Skill 测试与版本化

测试策略
# 1. 单元测试:验证 Skill 的 YAML 格式
/claude skill validate django-security
​
# 2. 触发测试:验证条件加载是否生效
/claude skill test-trigger django-security \
  --scenario "编辑 settings.py" \
  --file-pattern "**/settings.py"
​
# 3. 行为测试:用标准输入验证 Skill 输出
/claude skill test django-security \
  --input "审查 src/views.py 的安全性" \
  --expected-output-pattern "CRITICAL|HIGH|MEDIUM" \
  --max-tokens 2000
​
# 4. 回归测试:每次修改 Skill 后运行
/claude skill test-all  # 运行所有 Skill 的测试套件
版本化策略
# 语义化版本
version: "2.1.0"
#            │ │ └─ patch: 修复 Gotcha 中的描述错误
#            │ └─── minor: 新增审查模式或输出格式
#            └───── major: 重写核心流程(不向后兼容)
​
# 变更日志
changelog:
  - version: "2.1.0"
    date: "2026-05-20"
    changes:
      - "新增:Django 5.0 异步 View 安全审查"
      - "更新:CSRF Gotcha 增加了 HTMX 场景"
  - version: "2.0.0"
    date: "2026-04-01"
    changes:
      - "重构:审查流程从 3 步扩展为 5 步"
      - "移除:不再建议使用 django-axes(维护已停止)"

6. Skill 组合模式

高阶用法是将多个 Skill 组合起来处理复杂任务:

# 组合模式 1:链式组合(Pipeline)
# 场景:完整的代码审查
review-pipeline:
  steps:
    - skill: "python-patterns"     # 风格审查
    - skill: "django-security"     # 安全审查
    - skill: "python-testing"      # 测试质量审查
    - skill: "performance-review"  # 性能审查
  merge_strategy: "union"          # 合并所有产出
​
# 组合模式 2:条件组合(Conditional)
# 场景:根据项目类型自动选择审查 Skill
smart-review:
  rules:
    - if: "file_has('**/settings.py')"
      skills: ["django-security", "python-patterns"]
    - if: "file_has('**/router.tsx')"
      skills: ["react-patterns", "typescript-review"]
    - default:
      skills: ["code-review-basics"]
​
# 组合模式 3:协同组合(Collaborative)
# 场景:多个 Skill 的产出相互补充
architecture-review:
  skills:
    - skill: "system-design-review"
      role: "main"                  # 主导
    - skill: "security-architecture"
      role: "supplement"            # 补充安全视角
    - skill: "cost-optimization"
      role: "supplement"            # 补充成本视角
  output: "merged_with_conflict_resolution"

实操步骤

步骤 1:评估现有 Skill 的信息层级

# 分析一个 Skill 的结构
/claude skill analyze python-patterns
​
# 输出示例:
# Skill: python-patterns
# Layer 0 (metadata):          85 tokens  ✓
# Layer 1 (core instructions): 1,200 tokens ✓
# Layer 2 (references):        Not loaded (已分离到 references/)
# Layer 3 (templates):         Not loaded (已分离到 templates/)
# 评分:EXCELLENT - 符合渐进式信息披露架构

步骤 2:将一个"大 Skill"拆分为 Bundle

# 假设你有一个 3000 行的 SKILL.md
# 步骤 1:提取核心流程到 SKILL.md(目标 500 行以内)
# 步骤 2:详细文档移到 references/
# 步骤 3:代码模板移到 templates/
# 步骤 4:脚本移到 scripts/
​
mkdir -p skills/my-skill/{references,templates,scripts}
​
# 编辑 SKILL.md,将所有 reference 链接改为相对路径引用
# 例如:见 [references/advanced-topics.md](references/advanced-topics.md)

步骤 3:添加条件触发配置

在 SKILL.md 的 frontmatter 中添加:

---
triggers:
  file_patterns:
    - "**/*.py"
  keywords:
    exact: ["Python", "async", "type hints"]
    regex: ["@dataclass", "async\\s+def", "Protocol"]
  task_types:
    - "code_review"
    - "refactoring"
---

验证触发条件:

/claude skill test-trigger my-skill --scenario "编辑 async_handler.py"
# 输出:✓ 触发条件匹配

步骤 4:编写 Gotchas

基于你团队最近 3 个月的 Code Review 记录,提炼出 5-10 条 Gotchas:

## Gotchas
​
1. 异步生成器中的异常不会传播
   触发:函数签名包含 `async def ... yield`
   问题:`try-except` 在 `yield` 后可能不生效
   解法:在 `yield` 前捕获,或使用 `contextlib.aclosing()`
​
2. `asyncio.gather()` 不是真正的并行
   触发:在 gather 中混合 CPU 密集和 IO 密集任务
   问题:CPU 密集任务会阻塞事件循环
   解法:CPU 密集任务使用 `loop.run_in_executor()`

避坑指南

坑 1:Skill 写成"知识库"而非"行动指南"

现象:Skill 里全是概念解释和背景知识,Agent 读完还是不知道该怎么做。 解法:Skill 的核心是"how to do",不是"what is"。每条知识后面必须跟一个可执行的动作。反面例子:"Python 的类型系统很强大";正面例子:"所有函数参数必须标注类型,使用 -> ReturnType 标注返回值"。

坑 2:Frontmatter 中的触发词太宽泛

现象:设置了 keywords: ["code"],结果每次对话都触发这个 Skill。 解法:触发词要精确到"只有这个场景才会匹配"。宁愿多设几个精确 trigger,也不要一个宽泛 trigger。测试方法:运行 10 次对话,看 Skill 的触发频次是否符合预期。

坑 3:忽略 Skill 之间的依赖关系

现象:Skill A 引用了 Skill B 中的概念,但 Skill B 没有被加载,导致 Agent 理解偏差。 解法:使用 depends_on 声明依赖关系。Agent 加载 Skill A 时会自动检查 Skill B 是否已加载。

坑 4:Gotchas 超过 10 条

现象:Gotchas 列表有 30 条,Agent 根本不可能全部记住和应用。 解法:Gotchas 严格控制在 10 条以内,按"出现频率 x 危害程度"排序。超出 10 条的部分,说明你的核心流程本身需要重构,而不是继续堆 Gotchas。


课后作业

  1. 基础练习:选择你团队中一个已有的 Skill(或创建一个新的),按渐进式信息披露架构重新组织:SKILL.md(<500 行)、references/(详细文档)、templates/(模板)、scripts/(脚本)。

  2. 进阶练习:收集团队过去 3 个月的 Code Review 记录,提炼出 5 条 Gotchas,写入对应的 Skill 文件中。每条 Gotchas 必须包含:触发条件 + 问题描述 + 根本原因 + 修复代码。

  3. 挑战练习:设计一套 Skill 自动化测试框架,包含:

    • 格式验证(YAML frontmatter 完整性检查)

    • 触发条件测试(用 mock 场景验证触发准确性)

    • 行为测试(输入标准 prompt,验证输出是否包含必要元素)

    • 回归测试(修改 Skill 后自动运行全套测试) 写出框架的核心代码。


总结

Skills 的质量不取决于"写了多少",而取决于"Agent 能用上多少"。渐进式信息披露架构的核心思想是:让 Agent 先看到最重要的 20%,需要时再看到剩下的 80%。

四个高级原则:

  1. 分层设计:Layer 0-3 各有定位,不混不杂

  2. 精确触发:该加载时才加载,不该加载时别添乱

  3. Gotchas 驱动:最具价值的不是"最佳实践",而是"最常见的翻车现场"

  4. 可测试可版本化:Skill 也是代码,需要测试、需要版本管理、需要变更日志

当你开始用"工程化"的视角设计 Skills 时,你就从 AI 工具的消费者变成了 AI 能力的构建者。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐