在开始构建自动生成技能的技能之前,我们需要先理解几个关键概念。技能(Skill)本质上是一种模块化的能力封装,它让AI系统能够像专业人士一样处理特定领域的任务。想象一下,你给一个实习生配备了一整套行业工具包——技能就是AI的"专业工具包"。
技能不是简单的指令集,而是包含三个关键要素的完整解决方案:
以医疗诊断技能为例,它不仅包含医学知识,还包括问诊流程和检查单生成工具。这种三位一体的设计让AI能够真正像专科医生一样工作,而不仅仅是回答医学问题。
一个设计良好的技能应该创造以下价值:
在金融领域,一个财报分析技能可能包含:
我们的skill-creator需要实现以下核心功能模块:
| 模块 | 功能 | 实现方式 |
|---|---|---|
| 需求解析 | 理解用户对目标技能的需求 | 自然语言处理+结构化模板 |
| 文档生成 | 自动生成SKILL.md文件 | 模板引擎+内容填充 |
| 资源编排 | 创建配套资源目录结构 | 文件系统操作 |
| 验证反馈 | 检查生成结果的完整性 | 规则校验+示例测试 |
为什么选择"生成技能的技能"这种递归设计?
自由度的平衡策略
首先创建技能的基本结构:
bash复制mkdir skill-creator
cd skill-creator
mkdir scripts references assets
touch SKILL.md
SKILL.md的初始内容应该包含:
yaml复制name: skill-creator
description: 生成有效技能的指南。当用户想要创建新技能(或更新现有技能)时,应该使用此技能,该技能可以通过专业知识、工作流或工具集成来扩展Claude的能力。
在scripts目录下创建主要生成脚本:
python复制# scripts/generate_skill.py
import os
import yaml
from jinja2 import Template
def parse_requirements(user_input):
"""解析用户输入的需求描述"""
# 实现自然语言处理逻辑
pass
def generate_skill_structure(skill_name):
"""创建技能目录结构"""
os.makedirs(f"{skill_name}/scripts", exist_ok=True)
os.makedirs(f"{skill_name}/references", exist_ok=True)
os.makedirs(f"{skill_name}/assets", exist_ok=True)
return f"{skill_name}/SKILL.md"
def render_skill_template(requirements):
"""渲染SKILL.md模板"""
with open('templates/SKILL.md.j2') as f:
template = Template(f.read())
return template.render(requirements)
if __name__ == "__main__":
user_input = input("请描述您要创建的技能:")
skill_name = input("请输入技能名称:")
requirements = parse_requirements(user_input)
skill_path = generate_skill_structure(skill_name)
with open(skill_path, 'w') as f:
f.write(render_skill_template(requirements))
创建模板目录和基础模板:
code复制templates/
├── SKILL.md.j2
└── resource_types/
├── script.j2
├── reference.j2
└── asset.j2
SKILL.md.j2模板示例:
jinja复制---
name: {{ skill_name }}
description: {{ description }}
---
# {{ skill_name }} 使用指南
## 核心功能
{% for feature in features %}
- {{ feature }}
{% endfor %}
## 典型使用场景
{% for scenario in scenarios %}
1. {{ scenario }}
{% endfor %}
## 资源说明
{% if has_scripts %}
### 脚本资源
位于scripts/目录下的可执行文件:
{% for script in scripts %}
- {{ script }}: {{ script_description }}
{% endfor %}
{% endif %}
三明治结构设计法:
资源分离原则:
问题1:生成的技能过于笼统
解决方案:在需求解析阶段强制要求提供:
问题2:资源文件冗余
解决方案:实现自动去重检查:
python复制def check_duplicate_resources(resource_type, content):
hash_val = hashlib.md5(content.encode()).hexdigest()
return hash_val in resource_hashes[resource_type]
问题3:技能触发不准确
解决方案:优化description字段:
上下文窗口管理:
代码优化示例:
python复制class ResourceLoader:
def __init__(self):
self.cache = {}
def load(self, path):
if path not in self.cache:
with open(path) as f:
self.cache[path] = f.read()
return self.cache[path]
建立三层测试体系:
测试用例示例:
python复制def test_skill_generation():
# 准备测试输入
test_input = {
"description": "PDF处理工具",
"scenarios": ["旋转PDF", "合并PDF"]
}
# 执行生成
skill = generate_skill(test_input)
# 验证结果
assert "PDF" in skill.metadata.name
assert os.path.exists("scripts/merge_pdf.py")
assert "旋转" in skill.references[0].content
建立反馈闭环系统:
实现示例:
python复制def collect_feedback(skill_name):
usage = get_usage_stats(skill_name)
issues = get_reported_issues(skill_name)
return analyze_patterns(usage, issues)
def update_templates(feedback):
for pattern in feedback.common_patterns:
if pattern not in current_templates:
create_new_template(pattern)
在实际开发中,我发现最有效的技能往往遵循"80/20法则"——聚焦解决20%的高频需求,覆盖80%的使用场景。技能生成器本身也应该体现这一原则,优先保证核心功能的可靠性,再逐步扩展边缘用例的支持。