学习指南: 第14部分:通过Qwen Code技能掌握自有流程

模块「第14部分:通过Qwen Code技能掌握自有流程」中第 2 / 5 节课
您正在未登录状态下查看课程。 请登录,以保存进度并参加测试。

主题: 第14部分 通过 Qwen Code 技能实现自有流程

难度等级: 中级

预计学习时间: 4-6 小时(理论 + 实践)

前置要求: Qwen Code 基础知识及 CLI 代理操作

理解 Git 及分支管理

具备 Markdown 使用经验

了解 SDD(规范驱动开发)概念

已完成课程第 1-13 部分(特别是 QWEN.md 的使用)

学习目标: 在 Qwen Code 中创建和配置代理技能(skills),实现重复性流程的自动化

区分个人技能与项目技能,并能为团队协作合理选择技能类型

在 SKILL.md 的 YAML 头部中撰写有效的 description,确保技能能被正确自动识别

实施升级规则,防止代理执行不必要的自主操作

运用上下文卫生技术,维持长时间会话中代理的工作质量

概述: 本课程部分聚焦于通过 Qwen Code 的技能系统实现重复性工程流程的自动化。您将学习如何将频繁重复的请求转化为结构化、可复用的代理技能,创建项目级和个人级技能,实施升级规则以确保代理安全运行,并管理长时间会话的上下文。核心关注实际应用:SDD 格式的功能规格说明和变更日志维护作为典型技能示例,能够加速团队协作并标准化工程实践。

关键概念: 代理技能(skill):包含 SKILL.md 文件的目录,描述特定流程的适用场景和执行方式。技能是 Qwen Code 中重复请求自动化的基本单元。与斜杠命令不同,技能由模型自动调用或通过 /skills 触发,描述的是一种能力而非固定接口。

个人技能:位于 ~/.qwen/skills/<name>/SKILL.md 的技能。仅对当前机器上的当前用户可用。适合个人偏好和实验,但不会被纳入版本控制系统。

项目技能:位于仓库内 .qwen/skills/<name>/SKILL.md 的技能。纳入 Git 管理,成为团队工程流程的一部分,确保所有开发者和处理该项目的代理之间的一致性。

SKILL.md 的 YAML 头部:文件开头位于 --- 标记之间的 YAML 格式元数据。包含必填字段 name(无空格)和 description(具体的适用条件描述)。正确的头部对代理识别技能至关重要。

升级规则:明确约定的契约,描述代理必须停止运行并向人类请求确认的情形,而非自行采取行动。防止代理在上下文不足时猜测,避免产生不必要的变更。

上下文退化(context rot):长时间会话中因无关上下文累积导致代理工作质量下降的现象。相邻任务的旧决策随机混入当前工作,降低输出的准确性和相关性。

上下文卫生:管理代理上下文的一系列实践:角色切换时定期使用 /clear、限制会话时长、通过 @file 明确指定文件而非传递整个目录、怀疑混淆时重启并重新读取 QWEN.md。

技能辅助文件:技能目录中的额外资源(templates/、示例、代码片段),SKILL.md 可引用这些文件来扩展功能,同时避免主文件膨胀。模板中的注释不会被复制到最终规格说明中。

Agents.md:仓库根目录的跨代理标准规则,作为 QWEN.md 的补充。不仅 Qwen Code 可读,其他兼容工具也能读取。确保同一项目中多个不同代理并行使用时的一致性。

练习题: 名称: 创建基础功能规格说明技能

问题: 您的项目中经常根据路线图创建新功能的 SDD 规格说明。重复出现的请求是:"为 roadmap.md 中的下一阶段创建规格说明"。需要通过代理技能将此流程自动化。创建一个项目技能 feature-spec,包含正确的 YAML 头部、8 步流程、三个输出文件(requirements.md、plan.md、validation.md)及约束条件。通过 /skills 验证识别情况。

解决方案: 1. 创建目录:mkdir -p .qwen/skills/feature-spec

  1. 创建文件 .qwen/skills/feature-spec/SKILL.md,内容如下:

--- name: feature-spec description: 从路线图中下一个未完成阶段创建新的 SDD 功能规格说明。在开始下一个功能、编写规格说明或准备新阶段实施前使用。 --- # 功能规格说明 ## 流程

  1. 读取 specs/roadmap.md
  2. 找到第一个未完成阶段
  3. 创建分支 phase-N-kebab-name
  4. 向用户提出三组问题:边界、决策、上下文
  5. 读取 specs/mission.md 和 specs/tech-stack.md
  6. 创建 specs/YYYY-MM-DD-feature-name/
  7. 写入 requirements.md、plan.md、validation.md
  8. 不实现代码

## 文件 requirements.md — 边界、边界外内容、决策、上下文、待解决问题 ## 文件 plan.md — 编号任务组,每组单独验证 ## 文件 validation.md — 自动检查、手动走查、偏差检查、完成标准 ## 约束:遵守 tech-stack.md,未经批准不添加依赖,保持阶段可交付,不编辑无关文件

  1. 重启 Qwen Code
  2. 执行 /skills — 确认 feature-spec 显示
  3. 验证调用:"使用 feature-spec 技能开始路线图中的下一个功能。不要实现代码"
  4. 若技能未生效,检查:文件路径、YAML 头部正确性(开头和结尾的 ---)、name 无空格、description 具体、代理已重启

难度: 初级

名称: 使用辅助模板扩展技能

问题: 功能规格说明流程不断扩展,SKILL.md 文件变得臃肿。此外,不同规格需要统一的结构,但团队花费时间在格式调整上。需要将模板提取到独立文件中,并更新 SKILL.md 以使用这些模板。

解决方案: 1. 在技能内创建 templates 目录:mkdir -p .qwen/skills/feature-spec/templates

  1. 创建 .qwen/skills/feature-spec/templates/requirements.md,初始结构如下:

# 需求 ## 边界 <!-- 功能包含的内容 --> ## 边界外内容 <!-- 明确不包含的内容 --> ## 决策 <!-- 已确定的架构决策 --> ## 上下文 <!-- 为何做出这些决策 --> ## 待解决问题 <!-- 需要澄清的事项 -->

  1. 类似地创建 templates/plan.md 和 templates/validation.md
  2. 更新 SKILL.md,在流程中添加:

"使用 templates/requirements.md 作为初始结构。不要将模板中的注释复制到最终规格说明中。"

  1. 验证代理正确使用模板,且不将指导注释带入输出文件
  2. 提交变更:git add .qwen/skills/ && git commit -m "Add feature-spec skill with templates"

难度: 中级

名称: 实施升级规则

问题: 项目中的代理多次自行做出争议决策:未经协商添加依赖、修改规格边界外的文件、编辑 tech-stack.md。需要在 QWEN.md 或技能中形式化升级规则,确保代理必须停止并请求确认。

解决方案: 1. 打开或创建仓库根目录的 QWEN.md(或添加到现有 SKILL.md)

  1. 添加"升级规则"章节:

在以下情况中停止并询问用户,不要自行行动:

  • 功能规格中的某需求存在不同解读;
  • 准备修改当前规格边界外的文件;
  • 准备添加 tech-stack.md 中未列出的新依赖;
  • 准备修改 tech-stack.md、mission.md 或 roadmap.md;
  • 需要执行影响范围非平凡的迁移、drop、delete 或 rm;
  • 找不到用户引用的文件;
  • 结果与 validation.md 中的事实不符,且该事实未标记为"延期";
  • 用户请求与 QWEN.md 中先前接受的规则冲突。

每种情况下输出简短说明,指出具体何处不明确,并提供 2-3 个具体选项供选择。不要替用户决定。

  1. 在场景中测试:请求代理添加 tech-stack.md 中不存在的库 — 确认其停止并提供选项
  2. 进阶:学习第 17 部分的 Stop 钩子,用于程序化验证规则遵守情况

难度: 中级

名称: 创建变更日志技能

问题: 团队在功能合并前手动更新 CHANGELOG.md 耗费时间。提交历史分散,格式不统一。创建一个基于 git log 和 git diff 自动处理流程的 changelog 技能。

解决方案: 1. 创建目录:mkdir -p .qwen/skills/changelog

  1. 创建 .qwen/skills/changelog/SKILL.md:

--- name: changelog description: 在功能分支合并前,根据 Git 历史和当前分支变更更新 CHANGELOG.md。 --- # 变更日志

  1. 查看相对于 main 的 git log 和 git diff
  2. 创建或更新 CHANGELOG.md
  3. 使用带日期的标题
  4. 撰写利益相关者易懂的简洁条目
  5. 不包含噪音般的内部细节
  6. 重启 Qwen Code,通过 /skills 验证
  7. 创建包含若干提交的测试分支,请求代理使用 changelog 技能
  8. 检查结果:标题含日期、无"重构函数 X"等内部细节、有面向用户的清晰描述
  9. 在实际合并到 main 前使用该技能

难度: 初级

名称: 诊断和解决技能识别问题

问题: 您创建了技能,但代理在 /skills 中看不到或明确请求时不应用。系统性地诊断并解决问题。

解决方案: 1. 检查路径:文件必须位于 .qwen/skills/<name>/SKILL.md(项目级)或 ~/.qwen/skills/<name>/SKILL.md(个人级)

  1. 检查 YAML 头部:
  • 以精确的 --- 标记开始和结束(无空格、无 BOM)
  • name 字段无空格,仅使用拉丁字母、连字符、下划线
  • description 字段具体描述适用条件,避免"有用的技能"等泛泛之词
  1. 检查权限:文件必须可读
  2. 检查重启:Qwen Code 启动时缓存技能,变更需要重启
  3. 检查 Markdown 语法:损坏的标题或表格可能妨碍解析
  4. 检查名称冲突:两个同名技能不允许
  5. 若一切正确 — 检查 Qwen Code 版本,可能需要更新
  6. 临时解决方案:通过 /load 或您版本的等效命令显式导入

难度: 中级

名称: 使用上下文卫生优化长时间会话

问题: 您已与代理协作处理复杂任务 90 分钟。观察到上下文退化迹象:代理引用先前任务的决策、建议无关文件、混淆当前功能边界。应用上下文卫生技术恢复工作质量。

解决方案: 1. 执行 /clear 完全清除会话上下文

  1. 从零重新读取 QWEN.md:"读取 QWEN.md 并遵循其规则"
  2. 重新读取活跃规格说明:"读取 specs/YYYY-MM-DD-feature-name/requirements.md 及所有相关文件"
  3. 通过 @file 明确指定所需文件,避免"自己找"或传递整个目录
  4. 将剩余工作拆分为每段 15-20 分钟的子任务
  5. 子任务之间使用 /clear 并仅重新读取相关上下文
  6. 若启用自动上下文压缩 — 注意它会保留可能包含错误提示的摘要;角色切换时 /clean 更可取
  7. 将中间结果记录到项目文件中,不依赖会话记忆

难度: 高级

案例研究: 名称: 金融科技初创公司实施 SDD 技能:从混乱到标准化

场景: 拥有 12 名开发者和 3 个产品团队的金融科技初创公司。每个团队使用不同的功能规格格式:一些用 Google Docs,一些用 Notion,还有一些完全依赖口头约定。开发者在团队间轮换时需要 2-3 天适应新格式。引入 Qwen Code 未解决问题:代理按上下文中最近看到的格式生成规格,导致进一步碎片化。

挑战: 需要实现:(1) 所有团队统一的 SDD 规格格式,(2) 代理无需额外指令自动应用该格式,(3) 格式的版本控制和演进,(4) 最小化轮换适应时间。

解决方案: 技术负责人在公司根仓库(包含 40+ 服务的单体仓库)创建了项目技能 feature-spec。技能包含:严格的 8 步流程、三个输出文件及详细内容要求、templates/ 子目录中的模板、以及禁止代理偏离 tech-stack.md 的升级规则。此外创建了 changelog 技能用于统一维护变更日志。为跨团队一致性,在单体仓库根目录添加了 AGENTS.md,包含所有团队工具可读的基本规则。

结果: 实施 3 周后:规格创建时间从 4 小时缩短至 45 分钟(含代理澄清问题时间);轮换适应时间缩短至 2 小时(只需阅读 SKILL.md);94% 的规格在评审时无需修改(此前为 60%);统一的 CHANGELOG 实现了发布说明自动生成;团队发现并纠正了 7 起代理试图添加未批准依赖的案例,得益于升级规则。

经验教训: 根仓库中的项目技能比单个开发者的个人技能更能有效扩展实践

升级规则并非冗余官僚程序,而是节省成本:预防的 7 起依赖事件节省了一周的回退工作

templates/ 中的模板加速代理工作并提升一致性,但需要明确"不复制注释"的规则

使用多个工具(Qwen Code、Cursor、自定义脚本)时 AGENTS.md 必不可少 — 防止规则分歧

相关概念: 项目技能

升级规则

技能辅助文件

AGENTS.md

上下文卫生

名称: 拯救长时间重构会话中的上下文退化

场景: 4 人团队正在对支付系统核心进行大规模重构。一名开发者使用 Qwen Code 在持续 3 小时的会话中顺序处理 15 个相关服务。从第 8 个服务开始,代理开始提出适用于第 3 个服务的方案(已废弃的旧架构),并试图修改 tech-stack.md,以团队主动放弃的模式进行"优化"。

挑战: 诊断并阻止上下文退化而不丢失进度;理解自动上下文压缩为何失效;恢复代理正确工作;预防未来长时间会话中的重复发生。

解决方案: 开发者应用紧急上下文卫生:/clear、重新读取 QWEN.md 和活跃规格说明、通过 @file 明确指定具体服务而非"处理剩余"。剩余 7 个服务拆分为每段 20 分钟的独立会话,之间强制 /clear。中间结果固定到项目文件而非会话记忆。发现自动压缩将过时决策的"摘要"保存为"重要上下文",成为错误提示的来源。

结果: 最后 7 个服务处理正确,无偏离已批准架构。开发者将事件记录到内部知识库。团队规定:代理会话限制 45 分钟,阶段间强制 /clear 并重新读取 QWEN.md。后续重构中未再出现类似事件。

经验教训: 自动上下文压缩对单一长任务有帮助,但对顺序不同的任务有害 — 摘要成为错误提示的来源

/clear 保证干净启动,但需要将中间结果记录到文件的纪律

会话时长限制(45 分钟)是简单有效的规则,易于回顾检查

/clear 后通过 @file 明确指定文件至关重要:代理不会"猜测"前一会话的上下文

相关概念: 上下文退化

上下文卫生

升级规则

项目技能

学习建议: 从在 ~/.qwen/skills/ 创建个人技能开始,在您的项目中调试,然后迁移为项目技能 — 避免将不可用版本提交到 Git

使用验证器(如 yamllint)检查 YAML 头部 — 格式中的隐形错误常导致技能无法识别

记录"升级日志":记录代理应停止但未停止的案例 — 据此补充规则

使用"并行对比"技术:用两种方式(SKILL.md 和斜杠命令)创建同一技能,在同一任务上测试,记录代理行为差异

练习"卫生压力测试":故意创建带角色切换的长会话,学会识别上下文退化的早期迹象

创建"技能之技能" — 元技能,帮助按模板创建新技能,包含正确的 YAML 头部和结构

研究开源仓库中的他人项目技能 — Qwen Code 社区积极分享最佳实践

结合视觉、听觉和动觉学习:大声朗读 SKILL.md 检查指令清晰度、绘制流程图、在数字输入前手写技能以更好地记忆结构

附加资源: Qwen Code 官方文档:https://github.com/QwenLM/Qwen-Code(最新技能示例和格式更新)

课程第 15 部分 — agents.md 和跨代理兼容性:part-15-agent-replaceability.md(课程仓库中)

课程第 17 部分 — 用于程序化升级检查的 stop 钩子:part-17-stop-hooks.md(课程仓库中)

课程第 19 部分 — 基于 sqlite 的代理可控内存:part-19-agent-memory-sqlite.md(课程仓库中)

YAML 1.2 规范:https://yaml.org/spec/1.2.2/(深入理解 SKILL.md 头部要求)

社区项目技能示例:https://github.com/search?q=path%3A.qwen%2Fskills+SKILL.md&type=code(公开仓库搜索)

LLM 代理中的上下文退化研究:https://arxiv.org/abs/2404.06910(上下文退化的学术分析)

YAML 头部交互式训练器:https://www.yamllint.com/(技能元数据语法检查)

摘要: 第14部分关键结论:(1) 重复请求应通过代理技能自动化 — 节省时间并标准化流程。(2) 项目技能(.qwen/skills/)优于个人技能(~/.qwen/skills/)用于团队协作,因其纳入 Git 版本控制且对所有成员可用。(3) 正确的 YAML 头部及具体的 description 对代理自动识别技能至关重要。(4) 升级规则是防止代理在不确定时执行不必要自主操作的安全契约。(5) 上下文卫生(/clear、限制会话时长、明确指定文件)与技能质量同等重要 — 上下文退化会破坏即使最完善指令的效果。(6) 技能与斜杠命令互为补充:技能用于自动应用,命令用于显式调用。(7) 辅助文件(templates/)允许复杂技能扩展而不膨胀 SKILL.md。

我的笔记
0 / 10000

笔记保存在当前浏览器中。在其他设备上将不会显示。

课程菜单

课程

基于 Qwen Code CLI 的规范驱动开发
进度 0 / 135