跳转到内容

AI Skills

概述

AI Skills(技能)是 Agent 可调用的具体能力单元。每个 Skill 封装了一组相关的操作逻辑,使 Agent 能够完成特定类型的任务。良好的 Skill 设计是构建高效 Agent 系统的关键。

Skill 与 Tool 的区别

概念说明示例
Tool(工具)原子的、单一功能的操作搜索网页、执行代码、读写文件
Skill(技能)由多个 Tool 组合而成的复合能力代码审查(读文件 + 分析 + 写评论)

可以理解为:Tool 是动词,Skill 是动词短语。

Skill 设计原则

1. 单一职责

每个 Skill 应该只做一件事,但做到完整。

❌ bad:  "开发技能" — 太宽泛
✅ good: "创建 REST API 端点技能" — 明确且可执行

2. 声明式定义

Skill 应该通过声明式的方式定义,包括:

  • 名称:简洁的标识符
  • 描述:何时应该使用此 Skill
  • 输入:需要的参数及其类型
  • 输出:返回结果的格式
  • 步骤:执行流程

3. 可组合性

Skill 之间应该可以自由组合,形成更复杂的工作流。

Skill 定义示例

注意

下面的 YAML 格式不是行业统一标准,仅用于理解 Skill 的结构要素(名称、描述、输入、输出、步骤)。实际上每个框架的定义格式各不相同——OpenAI/Anthropic/MCP 都用 JSON Schema,LangChain 用 Python 装饰器,CrewAI 用 Python 类。真正的统一标准是 JSON Schema,见下方实现框架一节。

yaml
# 示例:代码审查 Skill(示意格式,非标准)
name: code-review
description: 审查代码变更,发现潜在问题并提供建议
inputs:
  - name: diff
    type: string
    description: 代码变更内容
  - name: language
    type: string
    description: 编程语言
outputs:
  - name: findings
    type: array
    description: 发现的问题列表
  - name: suggestions
    type: array
    description: 改进建议列表
steps:
  - name: parse-diff
    tool: diff-parser
  - name: analyze-code
    tool: code-analyzer
  - name: check-patterns
    tool: pattern-matcher
  - name: generate-report
    tool: report-generator

每个 Skill 的参数各不相同——code-review 需要 diff/language,k8s-manage 需要 action/resource_type/namespace。它们各自定义自己的输入输出,唯一的共同点是都用 JSON Schema 来描述参数结构。

常见 Skill 类型

代码类 Skill

Skill说明
代码生成根据需求描述生成代码
代码审查审查代码质量、安全性和最佳实践
代码重构改善代码结构而不改变行为
Bug 修复分析和修复代码缺陷
测试生成为代码自动生成单元测试

知识类 Skill

Skill说明
文档搜索在知识库中检索相关信息
网页搜索搜索互联网获取最新信息
数据分析分析结构化数据并生成洞察
报告生成汇总信息并生成结构化报告

操作类 Skill

Skill说明
文件操作读取、创建、修改文件
API 调用调用外部 API 获取或提交数据
命令执行运行 Shell 命令
K8s 管理连接 Kubernetes 集群,查询和管理集群资源
部署发布执行部署和发布流程

实战示例:K8s 管理 Skill

下面以"连接 Kubernetes 集群"为场景,展示如何将 Python 连接 K8s 的能力封装为 Agent 可调用的 Skill。

Skill 定义

yaml
name: k8s-manage
description: 管理 Kubernetes 集群资源,支持查询、创建、更新和删除操作
inputs:
  - name: action
    type: string
    description: "操作类型:list / get / create / delete / logs"
    enum: [list, get, create, delete, logs]
  - name: resource_type
    type: string
    description: "资源类型:pod / deployment / service / namespace / configmap"
  - name: name
    type: string
    description: 资源名称(get / delete / logs 时必填)
  - name: namespace
    type: string
    description: 命名空间(默认 default)
outputs:
  - name: result
    type: object
    description: 操作结果,包含状态和数据

Function Calling 实现

python
from kubernetes import client, config

# 加载集群配置
config.load_kube_config()

def k8s_manage(action: str, resource_type: str,
               name: str = None, namespace: str = "default") -> dict:
    """管理 K8s 集群资源"""

    if action == "list" and resource_type == "pod":
        v1 = client.CoreV1Api()
        pods = v1.list_namespaced_pod(namespace=namespace)
        return {
            "status": "success",
            "data": [
                {"name": p.metadata.name, "phase": p.status.phase}
                for p in pods.items
            ]
        }

    elif action == "list" and resource_type == "deployment":
        apps_v1 = client.AppsV1Api()
        deploys = apps_v1.list_namespaced_deployment(namespace=namespace)
        return {
            "status": "success",
            "data": [
                {
                    "name": d.metadata.name,
                    "ready": f"{d.status.ready_replicas or 0}/{d.spec.replicas}"
                }
                for d in deploys.items
            ]
        }

    elif action == "logs" and resource_type == "pod":
        v1 = client.CoreV1Api()
        logs = v1.read_namespaced_pod_log(name=name, namespace=namespace)
        return {"status": "success", "data": logs}

    # ... 更多操作

注册为 Agent 工具

python
# 将 Skill 注册为 LLM 可调用的 Tool
tools = [
    {
        "type": "function",
        "function": {
            "name": "k8s_manage",
            "description": "管理 Kubernetes 集群资源,支持查询 Pod、Deployment、Service 等",
            "parameters": {
                "type": "object",
                "properties": {
                    "action": {
                        "type": "string",
                        "enum": ["list", "get", "create", "delete", "logs"],
                        "description": "操作类型"
                    },
                    "resource_type": {
                        "type": "string",
                        "enum": ["pod", "deployment", "service", "namespace"],
                        "description": "资源类型"
                    },
                    "name": {
                        "type": "string",
                        "description": "资源名称"
                    },
                    "namespace": {
                        "type": "string",
                        "description": "命名空间,默认 default"
                    }
                },
                "required": ["action", "resource_type"]
            }
        }
    }
]

效果

用户只需要对 Agent 说:

  • "帮我看看 default 命名空间有哪些 Pod" → Agent 调用 k8s_manage(action="list", resource_type="pod", namespace="default")
  • "查看 nginx-deployment 的状态" → Agent 调用 k8s_manage(action="get", resource_type="deployment", name="nginx-deployment")
  • "看一下 my-pod 的日志" → Agent 调用 k8s_manage(action="logs", resource_type="pod", name="my-pod")

这就是 Skill 的核心价值:把底层实现细节封装起来,让用户用自然语言就能操作 K8s 集群

Skill 实现框架

Function Calling(函数调用)

LLM 原生支持的 Skill 调用机制:

python
# OpenAI Function Calling 示例
tools = [
    {
        "type": "function",
        "function": {
            "name": "search_knowledge_base",
            "description": "搜索知识库获取相关信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "搜索关键词"
                    }
                },
                "required": ["query"]
            }
        }
    }
]

MCP(Model Context Protocol)

Anthropic 推出的标准化协议,用于 LLM 与外部工具的交互:

  • 统一接口:定义了 LLM 调用工具的标准协议
  • 服务发现:支持动态发现和注册可用的工具
  • 跨平台:不同 LLM 和工具之间互操作

最佳实践

  1. Skill 粒度适中:太细增加调度开销,太粗降低灵活性
  2. 清晰的输入输出:明确定义参数类型和返回格式
  3. 错误处理:Skill 应该优雅地处理异常,返回有意义的错误信息
  4. 幂等性:相同输入应产生相同输出,避免副作用
  5. 可测试性:每个 Skill 应该可以独立测试和验证

参考资料

基于 MIT 许可发布