skill

一、什么是Skill?

1.1 一句话定义

Skill 是 AI 智能体的"能力插件"------就像给手机装App一样,给AI装上特定领域的专业知识或操作能力。

1.2 一个类比帮你理解

概念 类比 说明
AI Agent 一个聪明的助理 能理解需求、做决策
Skill 助理的"专业技能证书" 让助理能做具体的事(如写代码、查天气、做报表)
Tool 助理手里的工具 Skill 内部调用的具体函数/API

1.3 Skill vs Tool vs Plugin

很多人搞混这三个概念,我用一个表格说清楚:

概念 粒度 例子
Tool 最小单位,单个函数 search_web(query)
Skill 一组相关Tool的集合 WebSearchSkill(包含搜索、爬取、摘要)
Plugin 第三方Skill的打包分发形式 @my-company/web-search-plugin

二、Skill 的核心架构

一个标准的Skill包含四个部分:

text

复制代码
┌─────────────────────────────────────────┐
│              Skill 定义                  │
│  ┌─────────────────────────────────────┐│
│  │  1. 元数据 (Metadata)               ││
│  │     - 名称、描述、版本、作者         ││
│  └─────────────────────────────────────┘│
│  ┌─────────────────────────────────────┐│
│  │  2. 输入输出 (Input/Output)         ││
│  │     - 参数定义、返回格式             ││
│  └─────────────────────────────────────┘│
│  ┌─────────────────────────────────────┐│
│  │  3. 执行逻辑 (Execution)            ││
│  │     - 核心代码实现                   ││
│  └─────────────────────────────────────┘│
│  ┌─────────────────────────────────────┐│
│  │  4. 配置依赖 (Config & Dependencies)││
│  │     - API密钥、环境变量、第三方库    ││
│  └─────────────────────────────────────┘│
└─────────────────────────────────────────┘

三、实战:写一个「代码审查Skill」

理论讲完,我们来动手。我要写一个能让AI做代码审查的Skill。

3.1 第一步:定义Skill的元数据和接口

python

python 复制代码
# code_review_skill.py

from typing import List, Optional, Dict, Any
from pydantic import BaseModel, Field
from enum import Enum

# ============ 1. 定义输入输出模型 ============

class IssueLevel(str, Enum):
    ERROR = "error"      # 严重问题,必须修复
    WARNING = "warning"  # 警告,建议修复
    SUGGESTION = "suggestion"  # 优化建议

class ReviewIssue(BaseModel):
    level: IssueLevel
    title: str = Field(..., description="问题标题")
    description: str = Field(..., description="详细描述")
    line_number: Optional[int] = Field(None, description="行号")
    suggestion: str = Field(..., description="修复建议")

class CodeReviewInput(BaseModel):
    code: str = Field(..., description="待审查的代码")
    language: str = Field(..., description="编程语言,如 python, javascript")
    focus_areas: Optional[List[str]] = Field(
        default=None,
        description="重点关注领域:security/performance/bug/style"
    )

class CodeReviewOutput(BaseModel):
    issues: List[ReviewIssue]
    summary: str = Field(..., description="审查总结")
    score: int = Field(..., ge=0, le=100, description="代码质量评分(0-100)")

# ============ 2. Skill 元数据 ============

SKILL_METADATA = {
    "name": "code_reviewer",
    "display_name": "代码审查助手",
    "version": "1.0.0",
    "author": "Your Name",
    "description": "审查代码,发现潜在bug、安全漏洞、性能问题和风格问题",
    "tags": ["coding", "review", "quality"],
    "input_schema": CodeReviewInput.model_json_schema(),
    "output_schema": CodeReviewOutput.model_json_schema(),
}

3.2 第二步:实现核心逻辑

python

bash 复制代码
# ============ 3. 核心执行逻辑 ============

import json
import logging
from typing import Dict, Any
import litellm  # 统一LLM调用接口

logger = logging.getLogger(__name__)

# 审查维度的Prompt模板
REVIEW_PROMPT_TEMPLATE = """
你是一位资深代码审查专家。请严格审查以下{language}代码。

【代码】
{code}

text

【审查要求】
请从以下维度逐一检查:
1. 🔴 Bug风险:逻辑错误、边界条件、空指针、类型错误
2. 🟡 安全漏洞:SQL注入、XSS、敏感信息泄露、权限问题
3. 🟢 性能问题:循环嵌套、内存泄漏、不必要的计算
4. 🔵 代码规范:命名、格式、注释、可读性
{focus_areas_hint}

【输出格式】
请只输出JSON,不要有其他内容:
{{
  "issues": [
    {{
      "level": "error/warning/suggestion",
      "title": "问题标题",
      "description": "详细问题描述",
      "line_number": 行号(整数,如果没有则为null),
      "suggestion": "具体的修复建议"
    }}
  ],
  "summary": "一句话总结代码质量",
  "score": 0-100的整数分数
}}
"""

class CodeReviewSkill:
    """代码审查Skill"""
    
    def __init__(self, model: str = "gpt-4", api_key: Optional[str] = None):
        self.model = model
        if api_key:
            litellm.api_key = api_key
    
    @property
    def metadata(self) -> Dict[str, Any]:
        """返回Skill元数据,用于自动发现和注册"""
        return SKILL_METADATA
    
    async def execute(self, input_data: CodeReviewInput) -> CodeReviewOutput:
        """执行代码审查"""
        
        # 构建focus_areas提示
        focus_hint = ""
        if input_data.focus_areas:
            focus_hint = f"\n【重点关注】{', '.join(input_data.focus_areas)}"
        
        prompt = REVIEW_PROMPT_TEMPLATE.format(
            language=input_data.language,
            code=input_data.code,
            focus_areas_hint=focus_hint
        )
        
        try:
            # 调用LLM
            response = await litellm.acompletion(
                model=self.model,
                messages=[
                    {"role": "system", "content": "你是专业的代码审查专家,只输出JSON格式结果。"},
                    {"role": "user", "content": prompt}
                ],
                temperature=0.3,
                response_format={"type": "json_object"}
            )
            
            # 解析结果
            result = json.loads(response.choices[0].message.content)
            return self._parse_result(result)
            
        except Exception as e:
            logger.error(f"代码审查失败: {e}")
            return self._fallback_output(f"审查失败: {str(e)}")
    
    def _parse_result(self, raw: dict) -> CodeReviewOutput:
        """解析并验证LLM返回结果"""
        issues = []
        for item in raw.get("issues", []):
            try:
                issues.append(ReviewIssue(
                    level=IssueLevel(item["level"]),
                    title=item["title"],
                    description=item["description"],
                    line_number=item.get("line_number"),
                    suggestion=item["suggestion"]
                ))
            except Exception as e:
                logger.warning(f"跳过无效issue: {e}")
        
        return CodeReviewOutput(
            issues=issues,
            summary=raw.get("summary", "审查完成"),
            score=raw.get("score", 50)
        )
    
    def _fallback_output(self, error_msg: str) -> CodeReviewOutput:
        """出错时的降级输出"""
        return CodeReviewOutput(
            issues=[ReviewIssue(
                level=IssueLevel.WARNING,
                title="审查服务异常",
                description=error_msg,
                suggestion="请稍后重试或检查API配置",
                line_number=None
            )],
            summary="审查服务暂时不可用",
            score=50
        )

3.3 第三步:提供便捷的函数式调用

除了类接口,Skill通常还需要一个简单的函数入口:

python

bash 复制代码
# ============ 4. 便捷函数接口 ============

async def review_code(
    code: str,
    language: str,
    focus_areas: Optional[List[str]] = None,
    model: str = "gpt-4"
) -> CodeReviewOutput:
    """
    快速审查代码的便捷函数
    
    使用示例:
        result = await review_code(
            code="def add(a,b): return a+b",
            language="python",
            focus_areas=["bug", "security"]
        )
        for issue in result.issues:
            print(f"{issue.level}: {issue.title}")
    """
    skill = CodeReviewSkill(model=model)
    input_data = CodeReviewInput(
        code=code,
        language=language,
        focus_areas=focus_areas
    )
    return await skill.execute(input_data)
3.4 第四步:添加配置和测试
python

# ============ 5. 配置管理 ============

import os
from dotenv import load_dotenv

load_dotenv()

DEFAULT_CONFIG = {
    "model": os.getenv("REVIEW_MODEL", "gpt-4"),
    "api_key": os.getenv("OPENAI_API_KEY"),
    "max_code_length": 10000,  # 最大审查代码长度
}

# ============ 6. 单元测试 ============

import pytest

@pytest.mark.asyncio
async def test_code_review_skill():
    skill = CodeReviewSkill(model="gpt-3.5-turbo")  # 测试用小模型
    
    input_data = CodeReviewInput(
        code="""
def divide(a, b):
    return a / b
""",
        language="python",
        focus_areas=["bug"]
    )
    
    result = await skill.execute(input_data)
    
    # 应该发现除零风险
    assert len(result.issues) >= 1
    assert any("零" in issue.description or "zero" in issue.description.lower() 
               for issue in result.issues)
    assert 0 <= result.score <= 100

四、如何将Skill接入AI Agent?

写好了Skill,怎么让AI能用它?这里以LangChain和LlamaIndex为例:

4.1 接入LangChain

bash 复制代码
python

from langchain.tools import StructuredTool

# 将Skill包装成LangChain Tool
code_review_tool = StructuredTool.from_function(
    name="code_reviewer",
    description="审查代码,发现bug、安全漏洞和性能问题。当用户需要代码审查时使用。",
    coroutine=review_code,
    args_schema=CodeReviewInput,
)

# 创建Agent使用这个Tool
from langchain.agents import create_openai_tools_agent

tools = [code_review_tool]
agent = create_openai_tools_agent(llm, tools, prompt)
4.2 接入LlamaIndex
python

from llama_index.core.tools import FunctionTool

# 包装成LlamaIndex Tool
review_tool = FunctionTool.from_defaults(
    fn=review_code,
    name="code_reviewer",
    description="审查代码质量,返回问题和建议"
)

# 添加到Agent
from llama_index.core.agent import ReActAgent

agent = ReActAgent.from_tools([review_tool], llm=llm)

五、Skill开发的最佳实践

5.1 输入输出设计原则

原则 说明 错误示例 正确示例
明确性 参数含义清晰,无歧义 data: str code: str = Field(..., description="待审查的代码")
容错性 有默认值,能处理边界 focus_areas: List[str] focus_areas: Optional[List[str]] = None
结构化 输出用Pydantic模型 返回dict 返回CodeReviewOutput

5.2 错误处理策略

python

bash 复制代码
async def execute(self, input_data):
    try:
        # 1. 输入校验
        self._validate_input(input_data)
        
        # 2. 核心逻辑
        result = await self._do_work(input_data)
        
        # 3. 输出校验
        return self._validate_output(result)
        
    except ValidationError as e:
        # 输入错误 -> 返回友好提示
        return self._error_output(f"参数错误: {e}")
    except TimeoutError as e:
        # 超时 -> 重试或降级
        return await self._retry_or_fallback(input_data)
    except Exception as e:
        # 未知错误 -> 记录日志,返回降级结果
        logger.exception("Unexpected error")
        return self._fallback_output()

5.3 Skill 的目录结构规范

text

bash 复制代码
skills/
└── data_analyst/
    ├── __init__.py          # [可选] Python 包标识
    ├── skill.json           # [核心] 元数据:定义技能名称、描述、触发词
    ├── SKILL.md             # [核心] 指令文档:定义 SOP、规则、Few-Shot 示例
    └── resources/           # [资源] 存放静态资源
        ├── tools.py         # [可选] 可执行代码/工具函数
        ├── db_schema.sql    # [可选] 参考文档/数据库结构
        └── config.yaml      # [可选] 配置文件

5.4 skill.md样式

bash 复制代码
---
name: skill的名字,如:前端设计
description: 在什么情况下调用,如:在设计前端页面时调用。
---

正文:你需要描述你的要求,建议一段一段写,每段一个小标题

如:

## 色彩使用
在前端写css或其它有关色彩的内容,请遵循以下描述:
- 不要使用蓝紫色
- 请使用白色,浅色系

## 组件间动画的过渡

在前端在有组件切换时,请遵循以下描述:
- 不要硬切,要使用过渡动画
- 可以带点类似弹簧效果

## 参考文献:如果一个skill要写的过多,就可以分多个文件,按需读取,参考文献不是必写项,文件路径要写出相对路径

agents目录包含专门子代理的指令,需要生成相关子代理人时就读它们:

- `agents/动画.md` --- 前端各组件的切换、过渡
------------------------------------------------
版权声明:本文为CSDN博主「星原望野」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2302_81095897/article/details/158853863

5.5 让Skill可发现(注册机制)

python

cpp 复制代码
# skill_registry.py
from typing import Dict, Type

class SkillRegistry:
    _skills: Dict[str, Type] = {}
    
    @classmethod
    def register(cls, name: str):
        def decorator(skill_class):
            cls._skills[name] = skill_class
            return skill_class
        return decorator
    
    @classmethod
    def get(cls, name: str):
        return cls._skills.get(name)
    
    @classmethod
    def list_all(cls):
        return list(cls._skills.keys())

# 使用装饰器注册
@SkillRegistry.register("code_reviewer")
class CodeReviewSkill:
    pass

六、总结

6.1 核心要点回顾

  1. Skill = 一组相关Tool的集合,让AI获得特定领域能力

  2. 四个组成部分:元数据、输入输出、执行逻辑、配置依赖

  3. 设计原则:明确输入、结构化输出、完善的错误处理

  4. 接入方式:LangChain和LlamaIndex都有标准化的Tool包装

6.2 下一步你可以做什么?

  • 写一个你日常需要的Skill(比如:周报生成、SQL优化、日志分析)

  • 把Skill发布到社区(LangChain Hub、LlamaHub)

  • 组合多个Skill,构建一个垂直领域的AI Agent

6.3 skill推荐

find-skills:该skill可以帮助用户在网上,找到适合自己的skill

skill-creator:这个skill约定了创建skill的规范,可以辅助我们创建skill

frontend-design:这个skill约定了前端的设计风格,避免千篇一律的蓝紫色的ai味网站

anthropics:anthropics官方推出的skill合集,十分实用

The Agent Skills Directory:一个收录了大量skill的网站,几乎都能找到自己想要的skill

相关推荐
Flying pigs~~2 小时前
检索增强生成RAG项目tools_03:mysql➕redis➕milvus
人工智能·agent·milvus·rag·智能体·检索增强生成
IT·陈寒2 小时前
基于灵珠智能体的AIGlasses应用实践 ——「觅食」智能营养分析助手
人工智能·rokid·乐奇眼镜
2401_832298102 小时前
OpenClaw 2026.4 密集迭代:安全硬化、记忆进化与多模态爆发,AI 智能体进入稳定成熟期
人工智能
AISHU爱数2 小时前
正式开源!Anybackup V9,首款 AI 原生数据韧性平台
人工智能·开源·备份·ai原生·恢复·自主验证
陈天伟教授2 小时前
“快速模式”和“专家模式”
人工智能·神经网络·安全·机器学习·量子计算
:mnong2 小时前
跟着学伴AI项目设计分析学习安卓APP研发
android·人工智能·学习
智慧化智能化数字化方案2 小时前
AI人工智能——解读人工智能系列白皮书——智慧农业
人工智能·智慧农业·农业物联网·农业数字化·人工智能系列白皮书
Satellite-GNSS2 小时前
机器学习全家族模型详解 + 关系梳理
人工智能·深度学习·机器学习
乐迪信息2 小时前
乐迪信息:智慧港口AI防爆摄像机实现船舶流量精准统计
大数据·人工智能·物联网·安全·目标跟踪