硬肝万字解析Skill设计最佳实践,我开源了一个生成Skill的Skill「SkillFather」
硬肝万字解析Skill设计最佳实践,我开源了一个生成Skill的Skill「SkillFather」
一、引言
在 AI Agent 开发的浪潮中,我们面临着这样一个困境:随着项目复杂度的提升,我们需要为 Agent 配置越来越多的能力。这些能力可能包括代码调试、文档生成、数据分析、工作流自动化等等。然而,当我们耗费大量时间编写了几十个 Skill 之后,一个深刻的问题浮现出来——我们是否在重复造轮子?
为了解决这个问题,我开源了一个名为 SkillFather 的项目,它是一个面向 AI Agent 的通用 Skill 创建框架。
开源地址:https://github.com/huanqwer/SkillFather
使用方法:
-
克隆项目
git clone https://github.com/huanqwer/SkillFather.git -
复制
skills/skill-father到你工程的skills目录下macOS/Linux:
# 以Cursor为例 cd SkillFather cp -r skills/skill-father ~/.cursor/skills/Windows (PowerShell):
# 以Cursor为例 cd SkillFather Copy-Item -Recurse skills\skill-father $env:USERPROFILE\.cursor\skills\Windows (CMD):
# 以Cursor为例 cd SkillFather xcopy /E /I skills\skill-father %USERPROFILE%\.cursor\skills\skill-father
如果你觉得这个项目对你有帮助,恳请帮忙在 GitHub 上点一个免费的 Star,你的支持是我持续更新的动力!⭐
回到正题,当我们耗费大量时间编写了几十个 Skill 之后,一个深刻的问题浮现出来——我们是否在重复造轮子?
每一个 Skill 的创建似乎都从零开始,缺乏统一的规范和标准。有的 Skill 结构混乱,有的缺乏测试用例,有的难以复用,更别提持续优化了。这种低效的开发方式不仅浪费了宝贵的开发时间,更重要的是,它阻碍了 Agent 能力的规模化扩展。
正是在这样的背景下,SkillFather 应运而生。
SkillFather 的核心理念非常简单却深刻:创建第一个 Skill 之前,你需要一个能创建 Skill 的 Skill。这听起来像是一个递归的定义,但实际上它揭示了一个重要的软件工程原则——元编程(Metaprogramming)的思想在 AI Agent 领域的应用。
SkillFather 不仅仅是一个工具或框架,它是一套完整的面向 AI Agent 的通用型、标准化、测试优先(Test-First)、可组合、可观测、可持续优化的 Skill 创建方法论。它的目标是将我们在创建 Skill 过程中积累的经验,抽象成一个通用且能被复用的框架,让每一个新 Skill 的创建都站在巨人的肩膀上。
本文将深入探讨 SkillFather 的设计思想、核心原则、标准工作流程、技术规范以及实战案例,帮助你理解如何构建高质量的 Agent Skill,从而提升 AI Agent 的能力和可靠性。
二、核心思想
2.1 SkillFather 的设计哲学
SkillFather 的设计哲学源于一个简单的观察:一个优秀的 Skill Creator 首先应具备某个领域相当的专业知识,然后总结出最佳实践,抽象成 SOP(Standard Operating Procedure,标准操作流程)。
这个过程可以分解为三个层次:
-
领域专业知识:这是基础。要创建一个能够处理 Java Springboot 服务 bug 的 Skill,你必须对 Java、Springboot、常见的 bug 类型、调试方法等有深入的理解。没有领域知识,就无法抽象出有价值的 Skill。
-
最佳实践总结:在具备领域知识的基础上,你需要总结出处理该领域问题的最佳实践。比如,修复 bug 的标准流程是什么?如何快速定位问题?如何验证修复效果?这些最佳实践是 Skill 的核心内容。
-
SOP 抽象:将最佳实践进一步抽象成标准化的操作流程,这就是 SOP。SOP 应该清晰、可执行、可复用,能够让 Agent 按照既定的步骤完成任务。
SkillFather 的价值在于,它将这三个层次的经验固化下来,形成了一套可复用的框架。当你需要创建新的 Skill 时,不需要从零开始,而是可以基于 SkillFather 提供的模板和规范,快速构建出高质量的 Skill。
2.2 Skill ≠ Prompt
在深入 SkillFather 之前,我们需要澄清一个重要的概念:Skill 不是 Prompt。
很多人将 Skill 等同于 Prompt,认为写一个 Prompt 就是在创建 Skill。这是一个严重的误解。Prompt 只是 Skill 的一个组成部分,是 Skill 与 Agent 交互的接口。但 Skill 的内涵远不止于此。
Skill 是一个能力单元,它具备完整的生命周期:
- 生命周期:Skill 有创建、使用、优化、废弃的完整生命周期
- Eval:Skill 必须有完整的评估体系,包括触发评估、成功评估、失败评估、对抗评估等
- Runtime:Skill 在运行时需要考虑性能、资源消耗、错误处理等
- Telemetry:Skill 需要收集运行数据,支持持续优化
- Versioning:Skill 需要版本管理,支持演进和回滚
- Retrieval:Skill 需要支持动态知识检索,避免知识过时
- Workflow: Skill 需要定义清晰的工作流,支持状态管理
- State Machine:Skill 需要状态机模型,处理复杂的状态转换
你正在构建的不是 Prompt,而是 Agent 能力基础设施。这个基础设施需要具备工程化的质量标准,包括可测试性、可观测性、可维护性、可扩展性等。
2.3 核心价值
SkillFather 的核心价值体现在以下几个方面:
标准化:通过统一的目录结构、元数据规范、评估标准,确保所有 Skill 都遵循相同的质量标准。这使得 Skill 更易于理解、维护和扩展。
可复用:通过能力抽象和模块化设计,Skill 可以在不同场景下复用,避免重复开发。一个精心设计的 Skill 可以成为多个 Agent 的能力模块。
可观测:通过 Telemetry 收集运行数据,实时监控 Skill 的性能、准确率、错误率等指标。这使得 Skill 的优化变得有据可依。
可持续优化:基于 Telemetry 数据和 Eval 结果,Skill 可以持续优化,不断提升性能和可靠性。这使得 Skill 能够适应不断变化的需求和环境。
三、核心原则
SkillFather 的设计遵循 8 大核心原则,这些原则贯穿于 Skill 创建的全过程。
3.1 测试优先(Test First)
测试优先是 SkillFather 最核心的原则。这意味着在编写 Skill 之前,必须先定义 Eval(评估用例)。
为什么要测试优先?原因有三:
-
明确需求:编写 Eval 用例的过程就是明确需求的过程。你需要思考 Skill 应该在什么情况下触发、应该输出什么、不应该输出什么。这个过程能够帮助你更好地理解需求。
-
指导开发:Eval 用例可以作为开发的指导。你编写的 Skill 必须能够通过这些测试用例,这确保了 Skill 的正确性。
-
持续验证:在 Skill 优化过程中,Eval 用例可以持续验证 Skill 的正确性,避免优化引入新的问题。
测试优先并不意味着要编写完整的测试代码,而是要定义清晰的评估标准。这些标准包括触发条件、成功案例、失败案例、对抗案例等。
3.2 Eval 驱动开发(Eval Driven Development)
Eval 驱动开发是测试优先原则的延伸。它强调在整个 Skill 开发过程中,Eval 用例是驱动力。
Eval 驱动开发包括以下几个要点:
- 优先定义 Eval:在编写任何 Skill 代码之前,先定义完整的 Eval 用例
- 持续运行 Eval:在开发过程中持续运行 Eval 用例,确保 Skill 的正确性
- 基于 Eval 优化:优化 Skill 时,以 Eval 结果为依据,确保优化不会降低质量
- 回归测试:在 Skill 演进过程中,持续运行历史 Eval 用例,避免回归问题
Eval 驱动开发能够显著提升 Skill 的质量和可靠性,是 SkillFather 推荐的开发方式。
3.3 Skill 模块化
Skill 模块化原则强调 Skill 应该是可拆分的、可组合的模块,而不是单体式的逻辑。
模块化的好处包括:
- 可维护性:模块化的 Skill 更易于理解和维护
- 可复用性:模块可以在不同 Skill 中复用
- 可测试性:模块可以独立测试
- 可扩展性:模块可以独立扩展,不影响其他部分
SkillFather 通过标准目录结构支持模块化设计。例如,scripts/ 目录存放可执行脚本,references/ 目录存放参考文档,assets/ 目录存放模板和静态资源。这些目录都可以独立管理和扩展。
3.4 Skill 可组合
Skill 可组合原则强调 Skill 应该能够组合使用,形成更复杂的能力。
可组合性包括:
- 输入输出标准化:Skill 的输入输出应该标准化,便于组合
- 状态管理:Skill 应该支持状态传递,便于组合
- 错误处理:Skill 应该有统一的错误处理机制,便于组合
- 依赖管理:Skill 应该明确依赖关系,便于组合
通过可组合性,多个简单的 Skill 可以组合成复杂的工作流,实现更强大的能力。
3.5 Runtime Context Injection
Runtime Context Injection 原则强调 Skill 应该支持运行时上下文注入,而不是将所有上下文硬编码在 Prompt 中。
Runtime Context Injection 的好处包括:
- 动态性:Skill 可以根据运行时上下文动态调整行为
- 灵活性:Skill 可以适应不同的运行环境
- 效率:避免一次性注入大量上下文,节省 Token
- 准确性:上下文是最新的,避免知识过时
SkillFather 通过动态知识检索、懒加载、渐进式披露等技术支持 Runtime Context Injection。
3.6 Progressive Disclosure
Progressive Disclosure(渐进式披露)原则强调 Skill 应该根据需要逐步披露信息,而不是一次性披露所有信息。
渐进式披露的好处包括:
- 效率:避免一次性披露大量信息,节省 Token
- 准确性:根据需要披露相关信息,提高准确性
- 可维护性:信息分层管理,便于维护
SkillFather 通过分阶段的工作流设计支持渐进式披露。例如,在意图抽取阶段只收集必要信息,在能力抽象阶段才披露更多细节。
3.7 Trigger Optimization
Trigger Optimization 原则强调 Skill 的触发条件应该经过精心设计,确保 Skill 在正确的时候被触发。
Trigger Optimization 包括:
- 语义触发器:使用语义关键词触发,而不是简单的关键词匹配
- 触发条件:明确定义应该触发和不应该触发的情况
- 排除条件:明确定义绝对不应该触发的情况
- 上下文信号:利用上下文信息提高触发准确率
精心设计的触发条件能够显著提升 Agent 的检索准确率,确保 Skill 被正确使用。
3.8 Telemetry First
Telemetry First 原则强调 Skill 应该从设计之初就考虑可观测性,收集运行数据支持持续优化。
Telemetry First 包括:
- 数据收集:收集触发准确率、完成率、幻觉率、Token 使用、延迟等数据
- 成功标准:定义明确的成功标准,如触发准确率 ≥92%、完成率 ≥90%、幻觉率 ≤3%
- 持续优化:基于 Telemetry 数据持续优化 Skill
Telemetry First 使得 Skill 的优化变得有据可依,能够持续提升性能和可靠性。
四、标准工作流程
SkillFather 定义了一个 6 步的标准工作流程,确保 Skill 的创建过程规范、高效、高质量。
Step 1:意图抽取(Intent Extraction)
意图抽取是 Skill 创建的第一步,目标是分析用户的真实需求。
在这一步,你需要使用 ask_question MCP 工具(如果没有提问 MCP 工具,则使用普通对话)询问用户问题,不断循环直到提取到完整的信息:
- 用户目标:用户想要达成什么目标?
- 任务边界:任务的范围是什么?哪些在范围内,哪些不在?
- 输入输出:任务需要什么输入?期望什么输出?
- 工具需求:任务需要什么工具或资源?
- 状态变化:任务会导致什么状态变化?
- 是否具备复用性:这个任务是否具备复用价值?
- 是否适合 Agent 自动化:这个任务是否适合 Agent 自动执行?
如果任务不具备复用价值、不适合作为能力模块、不适合工作流抽象,则应该 STOP,不要生成 Skill。
意图抽取的关键是深入理解用户的真实需求,而不是表面的描述。有时候用户的需求可能表述不清,需要通过提问来澄清。
Step 2:能力抽象(Capability Abstraction)
能力抽象是将用户需求转换为可复用能力的过程。
在这一步,你需要将用户需求转换为:
- 可复用能力:将需求抽象为可复用的能力模块
- 工作流节点:将需求分解为工作流中的节点
- 状态机:定义状态转换规则
- 工具接口:定义工具的输入输出接口
- 运行时行为:定义运行时的行为逻辑
在能力抽象过程中,必须避免:
- 超长 Prompt:避免将所有逻辑写在一个超长的 Prompt 中
- 单体式逻辑:避免单体式的逻辑设计
- 强耦合结构:避免强耦合的结构
- 一次性生成逻辑:避免一次性生成所有逻辑
Skill 必须:
- 可拆分:能够拆分为独立的模块
- 可组合:能够组合使用
- 可独立测试:每个模块能够独立测试
能力抽象完成后,需要用户审查并确认以下内容:
- 用户意图是否被正确理解
- 任务边界是否合理
- 输入输出是否清晰
- 工具需求是否准确
- 状态变化是否合理
- 工作流是否正确
循环直至所有信息被完全确认。如果无法确认,则 STOP,不要生成 Skill。
Step 3:定义 Eval(强制步骤)
定义 Eval 是 SkillFather 最重要的一步,也是强制步骤。必须优先生成 Eval,禁止跳过。
Eval 包括以下几个部分:
Trigger Eval
Trigger Eval 定义哪些情况应该触发该 Skill,以及触发的 Skill 是否被路由到正确的 category。
Trigger Eval 需要考虑:
- 语义触发器:使用什么语义关键词触发?
- 触发条件:在什么情况下应该触发?
- 路由正确性:Skill 是否被路由到正确的 category?
Non-Trigger Eval
Non-Trigger Eval 定义哪些情况绝对不能触发 Skill。
Non-Trigger Eval 需要考虑:
- 排除条件:在什么情况下绝对不应该触发?
- 边界情况:边界情况如何处理?
Success Eval
Success Eval 定义 Skill 的正确输出示例。
Success Eval 需要考虑:
- 正确输出示例:Skill 应该输出什么?
- 测试用例覆盖:测试用例需要覆盖所有场景
- TDD 思想:优先编写测试用例
Failure Eval
Failure Eval 定义失败案例。
Failure Eval 需要考虑:
- 失败案例:什么情况下会失败?
- 测试用例覆盖:测试用例需要覆盖所有失败场景
Adversarial Eval
Adversarial Eval 定义对抗性测试用例,包括:
- Prompt Injection:如何防范 Prompt Injection?
- 模糊输入:如何处理模糊输入?
- 幻觉诱导:如何防范幻觉诱导?
- 上下文污染:如何防范上下文污染?
- Token Overload:如何处理 Token Overload?
如果无法定义 Eval,则 STOP,不要生成 Skill。
Step 4:生成 Skill
在完成 Eval 定义后,就可以开始生成 Skill 了。
SkillFather 要求生成以下文件和目录:
- SKILL.md:必需,Skill 的主要文档
- skill.yaml:必需,Skill 的元数据
- evals/:必需目录,Eval 测试用例
- trigger_cases.json
- success_cases.json
- failure_cases.json
- benchmarks.json
- workflows/:必需目录,工作流定义
- state-machine.yaml
- scripts/:必需目录,可执行脚本
- references/:必需目录,参考文档
- assets/:必需目录,模板和静态资源
- README.md:可选,Skill 说明
必须使用标准化目录结构:
skill-name/
├── SKILL.md # 必需
├── skill.yaml # 必需
├── evals/ # 必需:Eval 测试用例(JSON 格式)
│ ├── trigger_cases.json
│ ├── success_cases.json
│ ├── failure_cases.json
│ └── benchmarks.json
├── workflows/ # 必需:工作流定义(YAML 格式)
│ └── state-machine.yaml
├── scripts/ # 必需:可执行脚本
├── references/ # 必需:参考文档
├── assets/ # 必需:模板和静态资源
└── README.md # 可选:Skill 说明
重要:所有标准目录(evals/、workflows/、scripts/、references/、assets/)必须在创建 Skill 时被创建。即使目录暂时为空,也要创建目录结构。这确保了目录结构的一致性和可扩展性。
Skill 必须:
- 标准化:遵循统一的规范
- 结构化:有清晰的结构
- AI 阅读友好:便于 AI 理解和使用
- 使用标准化的 evals/ 目录结构:Eval 测试用例使用 JSON 格式
- 使用标准化的 workflows/ 目录结构:工作流定义使用 YAML 格式
Step 5:优化 Trigger
优化 Trigger 是提升 Agent 检索准确率的关键步骤。
在这一步,你需要优化:
- 描述:Skill 的描述是否准确?
- 语义触发器:语义触发器是否准确?
- 检索质量:检索质量是否满足要求?
描述必须包含:
- 用户意图:用户想要达成什么?
- 同义表达:有哪些同义表达?
- 典型场景:典型场景是什么?
- 上下文信号:有哪些上下文信号?
- 排除条件:有哪些排除条件?
描述的目标不是介绍 Skill,而是提升 Agent 检索准确率。因此,描述应该从 Agent 的角度出发,考虑 Agent 如何检索和匹配 Skill。
Step 6:Runtime 优化
Runtime 优化是确保 Skill 在运行时高效、稳定的关键步骤。
在这一步,Skill 必须支持:
- 动态知识检索:支持动态检索知识,避免知识过时
- 懒加载:按需加载资源,避免一次性加载
- 渐进式披露:逐步披露信息,避免一次性披露
- 运行时上下文注入:支持运行时上下文注入
- Token 感知执行:感知 Token 使用,避免超限
禁止:
- 一次性注入全部上下文:避免一次性注入大量上下文
- 超长 Prompt:避免超长 Prompt
- 全量知识硬编码:避免将所有知识硬编码
Runtime 优化能够显著提升 Skill 的性能和可靠性,是 SkillFather 推荐的最佳实践。
五、标准目录结构
SkillFather 定义了严格的标准目录结构,确保所有 Skill 都遵循统一的组织方式。这种标准化的目录结构不仅便于 AI 理解和使用,也便于人类开发者维护和扩展。
5.1 完整目录结构
skill-name/
├── SKILL.md # 必需:Skill 的主要文档
├── skill.yaml # 必需:Skill 的元数据
├── evals/ # 必需:Eval 测试用例(JSON 格式)
│ ├── trigger_cases.json
│ ├── success_cases.json
│ ├── failure_cases.json
│ └── benchmarks.json
├── workflows/ # 必需:工作流定义(YAML 格式)
│ └── state-machine.yaml
├── scripts/ # 必需:可执行脚本
├── references/ # 必需:参考文档
├── assets/ # 必需:模板和静态资源
└── README.md # 可选:Skill 说明
5.2 目录详解
SKILL.md
SKILL.md 是 Skill 的核心文档,包含 Skill 的完整描述。它应该包括:
- Frontmatter:使用 YAML 格式的元数据,包括 name、version、description、category、author、license 等
- Overview:Skill 的用途概述
- 触发时机:明确描述 Skill 应该在什么情况下被触发
- 适用文件类型:列出 Skill 适用的文件类型(可选)
- 标准流程:详细描述 Skill 的标准操作流程
- 状态流转:描述 Skill 的状态转换规则
SKILL.md 应该使用 Markdown 格式,便于 AI 和人类阅读。
skill.yaml
skill.yaml 是 Skill 的元数据文件,使用 YAML 格式。它包含 Skill 的完整元数据,包括:
- 基本信息:name、version、description、author、license
- 分类信息:category(多标签分类)
- 触发信息:trigger(语义触发器、触发条件、不触发条件)
- 输入输出:inputs、outputs
- 依赖信息:dependencies
- 性能预算:token_budget、latency_budget
- 风险等级:risk_level
- 可观测性:observability(数据收集配置)
- 评估策略:eval_strategy(评估方法和成功标准)
skill.yaml 是 Skill 的配置文件,应该保持简洁和准确。
evals/
evals/ 目录存放 Eval 测试用例,使用 JSON 格式。它包含以下文件:
- trigger_cases.json:触发测试用例,定义哪些情况应该触发 Skill
- success_cases.json:成功测试用例,定义 Skill 的正确输出示例
- failure_cases.json:失败测试用例,定义失败案例
- benchmarks.json:基准测试用例,定义性能基准
evals/ 目录是 Skill 质量保证的核心,必须完整定义。
workflows/
workflows/ 目录存放工作流定义,使用 YAML 格式。它包含以下文件:
- state-machine.yaml:状态机定义,描述 Skill 的状态转换规则
workflows/ 目录是 Skill 工作流的核心,必须明确定义状态转换规则。
scripts/
scripts/ 目录存放可执行脚本。这些脚本可以是:
- 启动脚本:用于启动或重启服务的脚本
- 测试脚本:用于测试的脚本
- 工具脚本:用于特定任务的脚本
scripts/ 目录中的脚本应该具有清晰的命名和文档。
references/
references/ 目录存放参考文档。这些文档可以是:
- 技术文档:相关技术的文档
- 最佳实践:最佳实践文档
- API 文档:API 文档
- 示例代码:示例代码
references/ 目录中的文档应该与 Skill 密切相关。
assets/
assets/ 目录存放模板和静态资源。这些资源可以是:
- 模板文件:代码模板、文档模板等
- 静态资源:图片、图标等
- 配置文件:配置文件模板
assets/ 目录中的资源应该便于复用。
README.md
README.md 是 Skill 的说明文档,可选。它应该包括:
- Skill 简介:简要介绍 Skill 的用途
- 快速开始:如何快速使用 Skill
- 使用示例:使用示例
- 注意事项:注意事项
README.md 应该简洁明了,便于快速上手。
5.3 目录创建原则
SkillFather 强调以下目录创建原则:
- 必须创建:所有标准目录(evals/、workflows/、scripts/、references/、assets/)必须在创建 Skill 时被创建
- 即使为空也要创建:即使目录暂时为空,也要创建目录结构
- 保持一致性:所有 Skill 应该使用相同的目录结构
- 支持扩展:目录结构应该支持未来扩展
这些原则确保了目录结构的一致性和可扩展性。
六、skill.yaml 元数据规范
skill.yaml 是 Skill 的元数据文件,使用 YAML 格式。它包含 Skill 的完整元数据,是 Skill 标准化的关键。
6.1 基本信息字段
name
Skill 的名称,使用英文小写,使用连字符分隔单词。
name: java-springboot-bug-fix
version
Skill 的版本号,遵循语义化版本规范(Semantic Versioning)。
version: 1.0.0
description
Skill 的描述,使用多行字符串,详细描述 Skill 的用途和功能。
description:
一个面向 Java Springboot 服务的 Bug 修复 Skill。
该 Skill 用于系统性地诊断和修复 Java Springboot 服务中的 bug。
category
Skill 的分类,使用多标签分类,支持多个分类标签。
category:
- backend-development
- java
- springboot
- bug-fix
author
Skill 的作者。
author: gavin.qin
license
Skill 的许可证,使用标准许可证标识符。
license: Apache-2.0
6.2 触发信息字段
trigger
Skill 的触发信息,包括语义触发器、触发条件、不触发条件。
trigger:
semantic:
- 修复 bug
- 改 bug
- 处理后端问题
- 接口报错
- springboot 错误
should_trigger_when:
- 用户提到"修复bug"、"改bug"、"接口报错"等关键词
- 后端服务出现异常或错误
- API 接口返回错误状态码或异常响应
should_not_trigger_when:
- 前端问题
- 数据库问题(除非与 Java 代码相关)
- 部署问题
6.3 输入输出字段
inputs
Skill 的输入,列出 Skill 需要的输入参数。
inputs:
- task_description
- error_logs
- stack_trace
- environment_info
outputs
Skill 的输出,列出 Skill 的输出结果。
outputs:
- bug_analysis_report
- fix_suggestions
- test_cases
- documentation_updates
6.4 依赖信息字段
dependencies
Skill 的依赖,列出 Skill 依赖的其他 Skill 或服务。
dependencies:
- retrieval-system
- eval-engine
- telemetry-runtime
6.5 性能预算字段
token_budget
Skill 的 Token 预算,包括软限制和硬限制。
token_budget:
soft_limit: 12000
hard_limit: 24000
latency_budget
Skill 的延迟预算,目标延迟时间(毫秒)。
latency_budget:
target_ms: 8000
6.6 风险等级字段
risk_level
Skill 的风险等级,包括 low、medium、high。
risk_level: medium
6.7 可观测性字段
observability
Skill 的可观测性配置,包括数据收集配置。
observability:
enabled: true
collect:
- trigger_accuracy
- completion_rate
- hallucination_rate
- token_usage
- latency
- recovery_attempts
6.8 评估策略字段
eval_strategy
Skill 的评估策略,包括评估方法和成功标准。
eval_strategy:
methodology:
- trigger-eval
- execution-eval
- regression-eval
- adversarial-eval
success_criteria:
trigger_accuracy: ">= 92%"
completion_rate: ">= 90%"
hallucination_rate: "<= 3%"
6.3 完整示例
---
name: java-springboot-bug-fix
version: 1.0.0
description:
一个面向 Java Springboot 服务的 Bug 修复 Skill。
该 Skill 用于系统性地诊断和修复 Java Springboot 服务中的 bug。
category:
- backend-development
- java
- springboot
- bug-fix
author: gavin.qin
license: Apache-2.0
trigger:
semantic:
- 修复 bug
- 改 bug
- 处理后端问题
- 接口报错
- springboot 错误
should_trigger_when:
- 用户提到"修复bug"、"改bug"、"接口报错"等关键词
- 后端服务出现异常或错误
- API 接口返回错误状态码或异常响应
should_not_trigger_when:
- 前端问题
- 数据库问题(除非与 Java 代码相关)
- 部署问题
inputs:
- task_description
- error_logs
- stack_trace
- environment_info
outputs:
- bug_analysis_report
- fix_suggestions
- test_cases
- documentation_updates
dependencies:
- retrieval-system
- eval-engine
- telemetry-runtime
token_budget:
soft_limit: 12000
hard_limit: 24000
latency_budget:
target_ms: 8000
risk_level: medium
observability:
enabled: true
collect:
- trigger_accuracy
- completion_rate
- hallucination_rate
- token_usage
- latency
- recovery_attempts
eval_strategy:
methodology:
- trigger-eval
- execution-eval
- regression-eval
- adversarial-eval
success_criteria:
trigger_accuracy: ">= 92%"
completion_rate: ">= 90%"
hallucination_rate: "<= 3%"
---
七、可观测性与 Telemetry
可观测性是 SkillFather 的核心特性之一。通过 Telemetry 收集运行数据,可以实时监控 Skill 的性能、准确率、错误率等指标,为持续优化提供依据。
7.1 数据收集
SkillFather 支持收集以下数据:
触发准确率(Trigger Accuracy)
触发准确率衡量 Skill 是否在正确的时候被触发。
collect:
- trigger_accuracy
触发准确率的计算方式:
触发准确率 = 正确触发次数 / 总触发次数
完成率(Completion Rate)
完成率衡量 Skill 是否能够成功完成任务。
collect:
- completion_rate
完成率的计算方式:
完成率 = 成功完成次数 / 总执行次数
幻觉率(Hallucination Rate)
幻觉率衡量 Skill 产生幻觉(输出错误或无关信息)的比例。
collect:
- hallucination_rate
幻觉率的计算方式:
幻觉率 = 产生幻觉的次数 / 总输出次数
Token 使用(Token Usage)
Token 使用衡量 Skill 的 Token 消耗情况。
collect:
- token_usage
Token 使用包括:
- 输入 Token 数
- 输出 Token 数
- 总 Token 数
延迟(Latency)
延迟衡量 Skill 的执行时间。
collect:
- latency
延迟包括:
- 总延迟
- 各阶段延迟
恢复尝试(Recovery Attempts)
恢复尝试衡量 Skill 在遇到错误时的恢复能力。
collect:
- recovery_attempts
恢复尝试包括:
- 恢复尝试次数
- 恢复成功率
7.2 成功标准
SkillFather 定义了明确的成功标准,确保 Skill 的质量。
success_criteria:
trigger_accuracy: ">= 92%"
completion_rate: ">= 90%"
hallucination_rate: "<= 3%"
这些成功标准是 Skill 质量的最低要求,Skill 应该努力超越这些标准。
7.3 持续优化
基于 Telemetry 数据,Skill 可以持续优化。
优化流程:
- 收集数据:收集 Telemetry 数据
- 分析数据:分析数据,找出问题
- 制定优化方案:制定优化方案
- 实施优化:实施优化
- 验证效果:验证优化效果
- 迭代优化:持续迭代优化
7.4 Telemetry 架构
SkillFather 的 Telemetry 架构包括:
- 数据收集层:收集运行数据
- 数据存储层:存储运行数据
- 数据分析层:分析运行数据
- 数据可视化层:可视化运行数据
- 优化决策层:基于数据做出优化决策
这种分层架构确保了 Telemetry 的可扩展性和可维护性。
八、实战案例:Java Springboot Bug Fix Skill
为了更好地理解 SkillFather 的使用方法,我们以 Java Springboot Bug Fix Skill 为例,展示如何使用 SkillFather 创建高质量的 Skill。
8.1 完整示例展示
Frontmatter 元数据
---
name: java-springboot-bug-fix
description: 处理Java Springboot服务的bug
version: 1.0.0
author: system
license: Apache-2.0
---
Overview
本 skill 用于修复 Java Springboot 服务中的 bug。当用户报告后端问题、接口报错或需要修复 bug 时,Agent 应使用此 skill 来系统性地诊断和解决问题。
触发时机
- 用户提到"处理后端问题"、“修复bug”、“改bug”、"接口报错"等关键词
- 后端服务出现异常或错误
- API 接口返回错误状态码或异常响应
适用文件类型
.java- Java 源代码文件application.yml/application.properties- Spring 配置文件pom.xml- Maven 依赖配置文件build.gradle- Gradle 构建文件
标准流程
-
问题收集
- 使用 scripts/java-springboot-local-reboot.md 启动或者重启本地 springboot 应用(强制)
- 收集用户描述的问题现象,如果用户没有使用以下规范反馈 bug,则建议用户使用下面的固定格式,然后继续后续任务
建议您使用规范格式更方便agent定位问题: 复现步骤:(详细描述您是如何稳定复现此bug的) xxx 实际:(您实际看到的现象,可以贴接口response) xxx 期望:(您期望的返回或行为) xxx - 按复现步骤复现后获取错误日志、堆栈信息
- 确认问题发生的上下文(请求参数、环境等)
-
问题定位
- 分析错误日志,定位异常代码位置
- 检查相关代码逻辑
- 排查配置问题
-
根因分析
- 确定问题的根本原因
- 分析代码逻辑缺陷
- 检查依赖版本兼容性
-
解决方案设计
- 设计修复方案
- 评估方案的影响范围
- 考虑向后兼容性
-
代码修复
- 实施修复代码
- 添加必要的注释
- 遵循项目代码规范
-
验证测试
- 编写或更新单元测试
- 进行本地测试验证
- 确认修复效果
-
文档更新
- 更新相关文档(如需要)
- 记录修复说明
状态流转
[待处理] → [问题收集中] → [问题定位中] → [根因分析中] → [方案设计中] → [代码修复中] → [验证测试中] → [已完成]
8.2 关键设计要点
问题收集的标准化反馈格式
在问题收集阶段,SkillFather 强调使用标准化的反馈格式。这个格式包括:
- 复现步骤:详细描述如何稳定复现 bug
- 实际:实际看到的现象,可以贴接口 response
- 期望:期望的返回或行为
这个标准化格式的好处包括:
- 清晰:问题描述清晰,便于理解
- 完整:信息完整,便于定位问题
- 可复现:步骤详细,便于复现问题
本地启动脚本的固定化
在问题收集阶段,SkillFather 强调使用固定的本地启动脚本。这个脚本应该:
- 标准化:使用统一的启动脚本
- 可复用:脚本可以在不同场景下复用
- 可维护:脚本易于维护和更新
本地启动脚本的固定化确保了调试过程的一致性和可复现性。
TDD 测试优先理念
SkillFather 强调 TDD(Test Driven Development)测试优先理念。这意味着:
- 优先编写测试用例:在编写修复代码之前,先编写测试用例
- 测试驱动开发:以测试用例驱动开发
- 持续验证:持续运行测试用例,确保修复的正确性
TDD 测试优先理念能够显著提升代码质量和可靠性。
可变部分 vs 固定部分的识别
在 Java Springboot Bug Fix Skill 中,SkillFather 识别了可变部分和固定部分:
可变部分:
- 问题原因分析
- 解决方案设计
- 代码修复
固定部分:
- 本地启动和调试过程
- 问题收集的标准化反馈格式
- 标准流程的步骤
通过识别可变部分和固定部分,SkillFather 能够将固定部分脚本化或资源化,供 Agent 直接调用,从而提升效率。
九、执行约束与成功标准
SkillFather 定义了明确的执行约束和成功标准,确保 Skill 的质量和可靠性。
9.1 禁止事项
SkillFather 明确禁止以下行为:
生成超大单体 Prompt
禁止生成超大单体 Prompt。超大单体 Prompt 会导致:
- 难以理解:Prompt 过长,难以理解和维护
- 难以复用:Prompt 过长,难以复用
- 难以测试:Prompt 过长,难以测试
- 性能差:Prompt 过长,性能差
应该将 Prompt 拆分为多个模块,每个模块专注于一个功能。
跳过 Eval
禁止跳过 Eval。跳过 Eval 会导致:
- 质量无法保证:没有 Eval,无法保证 Skill 的质量
- 无法验证:没有 Eval,无法验证 Skill 的正确性
- 无法优化:没有 Eval,无法优化 Skill
必须先定义 Eval,然后编写 Skill。
忽略 Trigger 边界
禁止忽略 Trigger 边界。忽略 Trigger 边界会导致:
- 触发不准确:Skill 可能在错误的时候被触发
- 检索准确率低:Agent 的检索准确率会降低
- 用户体验差:用户体验会变差
必须明确定义 Trigger 边界,包括触发条件和不触发条件。
忽略失败场景
禁止忽略失败场景。忽略失败场景会导致:
- 鲁棒性差:Skill 的鲁棒性会变差
- 错误处理差:Skill 的错误处理会变差
- 用户体验差:用户体验会变差
必须定义完整的失败场景,包括各种边界情况和异常情况。
忽略可观测性
禁止忽略可观测性。忽略可观测性会导致:
- 无法监控:无法监控 Skill 的运行情况
- 无法优化:无法基于数据优化 Skill
- 无法演进:无法持续演进 Skill
必须从设计之初就考虑可观测性,收集运行数据。
忽略 Runtime 成本
禁止忽略 Runtime 成本。忽略 Runtime 成本会导致:
- 性能差:Skill 的性能会变差
- 成本高:Skill 的运行成本会变高
- 用户体验差:用户体验会变差
必须考虑 Runtime 成本,包括 Token 使用、延迟等。
9.2 必须事项
SkillFather 要求必须做到以下事项:
模块化设计
必须采用模块化设计。模块化设计的好处包括:
- 可维护性:模块化的 Skill 更易于理解和维护
- 可复用性:模块可以在不同 Skill 中复用
- 可测试性:模块可以独立测试
- 可扩展性:模块可以独立扩展
应该将 Skill 拆分为多个模块,每个模块专注于一个功能。
Eval First
必须采用 Eval First。Eval First 的好处包括:
- 明确需求:编写 Eval 用例的过程就是明确需求的过程
- 指导开发:Eval 用例可以作为开发的指导
- 持续验证:Eval 用例可以持续验证 Skill 的正确性
必须先定义 Eval,然后编写 Skill。
Trigger Optimization
必须优化 Trigger。Trigger Optimization 的好处包括:
- 触发准确:Skill 在正确的时候被触发
- 检索准确率高:Agent 的检索准确率高
- 用户体验好:用户体验好
必须精心设计 Trigger,包括语义触发器、触发条件、不触发条件等。
Runtime Safety
必须确保 Runtime Safety。Runtime Safety 的好处包括:
- 稳定可靠:Skill 运行稳定可靠
- 错误处理好:Skill 的错误处理好
- 用户体验好:用户体验好
必须考虑各种异常情况,包括边界情况、错误情况等。
Skill Composability
必须确保 Skill Composability。Skill Composability 的好处包括:
- 可组合:Skill 可以组合使用
- 可扩展:Skill 可以扩展
- 可复用:Skill 可以复用
必须确保 Skill 的输入输出标准化,支持状态传递,有统一的错误处理机制。
Telemetry Collection
必须收集 Telemetry。Telemetry Collection 的好处包括:
- 可观测:Skill 的运行情况可观测
- 可优化:可以基于数据优化 Skill
- 可演进:可以持续演进 Skill
必须从设计之初就考虑可观测性,收集运行数据。
9.3 成功标准
SkillFather 定义了明确的成功标准,确保 Skill 的质量。
Trigger 正确
Skill 的 Trigger 必须正确,包括:
- 触发准确率 ≥92%:Skill 在正确的时候被触发的比例不低于 92%
- 不触发准确率 ≥95%:Skill 在不应该触发的时候不被触发的比例不低于 95%
执行稳定
Skill 的执行必须稳定,包括:
- 完成率 ≥90%:Skill 成功完成任务的比率不低于 90%
- 错误率 ≤5%:Skill 出现错误的比率不高于 5%
抗 Prompt Injection
Skill 必须能够抗 Prompt Injection,包括:
- Prompt Injection 检测率 ≥95%:检测到 Prompt Injection 的比率不低于 95%
- Prompt Injection 防御率 ≥98%:成功防御 Prompt Injection 的比率不低于 98%
幻觉率低
Skill 的幻觉率必须低,包括:
- 幻觉率 ≤3%:Skill 产生幻觉的比率不高于 3%
支持组合调用
Skill 必须支持组合调用,包括:
- 输入输出标准化:Skill 的输入输出标准化
- 状态传递支持:Skill 支持状态传递
- 错误处理统一:Skill 有统一的错误处理机制
支持持续优化
Skill 必须支持持续优化,包括:
- Telemetry 数据收集:收集运行数据
- 优化机制:有优化机制
- 版本管理:有版本管理
可通过 Telemetry 演化
Skill 必须可通过 Telemetry 演化,包括:
- 数据驱动优化:基于数据优化
- 持续迭代:持续迭代优化
- 性能提升:性能持续提升
十、快速开始
SkillFather 提供了快速开始的方式,帮助你快速上手。
10.1 使用方式
直接复制 create-skill 文件夹
如果你已经创建了自己的项目,你可以复制 skills/create-skill 文件夹到你的工程 skills 文件夹下。
cp -r /path/to/SkillFather/skills/create-skill /path/to/your-project/skills/
命令行操作
你也可以使用命令行操作:
git clone https://github.com/huanqwer/SkillFather.git
cd SkillFather
cp skills/create-skill {yourSkillsDir}
10.2 最佳实践
在自己工程中使用
不建议在 SkillFather 工程里直接使用,因为在自己的工程中使用,AI 会工作的更好。这是因为:
- 上下文完整:在自己的工程中,AI 有完整的上下文
- 相关性高:在自己的工程中,Skill 与工程的相关性更高
- 定制化强:在自己的工程中,可以更好地定制化 Skill
测试优先的设计理念
SkillFather 强调测试优先的设计理念。这意味着:
- 优先定义 Eval:在编写任何 Skill 代码之前,先定义完整的 Eval 用例
- 持续运行 Eval:在开发过程中持续运行 Eval 用例
- 基于 Eval 优化:优化 Skill 时,以 Eval 结果为依据
测试优先的设计理念能够显著提升 Skill 的质量和可靠性。
持续优化的可观测性
SkillFather 强调持续优化的可观测性。这意味着:
- 从设计之初就考虑可观测性:在 Skill 设计之初就考虑可观测性
- 收集运行数据:收集运行数据,包括触发准确率、完成率、幻觉率等
- 基于数据优化:基于数据优化 Skill
持续优化的可观测性使得 Skill 的优化变得有据可依。
遵循 agentskills.io 规范
SkillFather 强调遵循 agentskills.io 规范。这意味着:
- 阅读最新规范:阅读 https://agentskills.io/specification 上的最新规范
- 使用备份规范:如果网络不支持访问,使用工程中的备份规范
specs/skill-spec-bak-2026-05-21.md - 保持更新:保持 Skill 与最新规范同步
遵循 agentskills.io 规范确保 Skill 的标准化和兼容性。
渐进式披露和 Token 感知执行
SkillFather 强调渐进式披露和 Token 感知执行。这意味着:
- 渐进式披露:根据需要逐步披露信息,避免一次性披露
- Token 感知执行:感知 Token 使用,避免超限
- 动态知识检索:支持动态知识检索,避免知识过时
渐进式披露和 Token 感知执行能够显著提升 Skill 的性能和效率。
十一、总结
SkillFather 是一个面向 AI Agent 的通用 Skill 创建框架,它将我们在创建 Skill 过程中积累的经验,抽象成一个通用且能被复用的框架。
11.1 核心价值
SkillFather 的核心价值体现在以下几个方面:
标准化:通过统一的目录结构、元数据规范、评估标准,确保所有 Skill 都遵循相同的质量标准。
可复用:通过能力抽象和模块化设计,Skill 可以在不同场景下复用,避免重复开发。
可观测:通过 Telemetry 收集运行数据,实时监控 Skill 的性能、准确率、错误率等指标。
可持续优化:基于 Telemetry 数据和 Eval 结果,Skill 可以持续优化,不断提升性能和可靠性。
11.2 适用场景
SkillFather 适用于以下场景:
- 需要创建可复用 Skill:当你需要创建可复用的 Skill 时
- 需要标准化 Skill:当你需要标准化 Skill 时
- 需要可观测 Skill:当你需要可观测的 Skill 时
- 需要持续优化 Skill:当你需要持续优化 Skill 时
11.3 未来展望
SkillFather 的未来展望包括:
- 更多模板:提供更多 Skill 模板,覆盖更多场景
- 更好工具:提供更好的工具,支持 Skill 创建和管理
- 更强社区:建立更强的社区,促进 Skill 的共享和协作
- 更深集成:与更多 AI Agent 平台集成,提升兼容性
11.4 范式转变
SkillFather 代表了从 Prompt 工程到 Skill 工程的范式转变。
Prompt 工程关注的是如何编写好的 Prompt,而 Skill 工程关注的是如何构建完整的 Agent 能力基础设施。
这种范式转变包括:
- 从单体到模块:从单体 Prompt 到模块化 Skill
- 从静态到动态:从静态 Prompt 到动态 Skill
- 从不可观测到可观测:从不可观测到可观测
- 从不可优化到可持续优化:从不可优化到可持续优化
SkillFather 正是这种范式转变的体现,它帮助我们构建高质量的 Agent Skill,从而提升 AI Agent 的能力和可靠性。
结语
SkillFather 不仅仅是一个工具或框架,它是一套完整的面向 AI Agent 的通用型、标准化、测试优先、可组合、可观测、可持续优化的 Skill 创建方法论。通过 SkillFather,我们可以将经验抽象成可复用的框架,让每一个新 Skill 的创建都站在巨人的肩膀上。
希望本文能够帮助你理解 SkillFather 的设计思想、核心原则、标准工作流程、技术规范以及实战案例,从而构建高质量的 Agent Skill,提升 AI Agent 的能力和可靠性。
更多推荐



所有评论(0)