前言

这篇文章讲什么:AI Skill 到底怎么开发、怎么评测——以微信小程序 wxa-skill-eval 和 Claude Code 为例,把四个评测指标和六大开发组成一次讲清楚。读完你能拿到一份可以直接照着搭的 Skill 工程清单。

最近一个在腾讯做 Skill 测试的朋友跟我聊起他们的评测体系,我顺势把两边(微信生态 + Claude Code 生态)的 Skill 开发模式都翻了一遍,发现底层逻辑惊人地一致——Skill 本质上是一个带契约的小型服务包,评测维度也高度收敛。


一、四个评测指标

微信官方开源的 wxa-skill-eval 定义了四个评测维度,每个 Skill 上线前至少跑 30 个用例:

维度 测什么 得分低说明
意图理解 AI 能不能正确理解用户想干嘛 SKILL.md 的 description 写得太模糊
轨迹生成 操作步骤的合理性和完整性 接口调用顺序或条件判断有问题
最终答案质量 输出结果的正确性和格式 提示词或数据处理逻辑需要优化
接口覆盖率 原子接口和组件的测试覆盖 用例不够多,边界情况没覆盖

注意:"任务完成情况"没有单独列成一个维度,而是被拆进了上面三个指标里——意图是起点、轨迹是过程、答案是结果,三者合在一起就是"任务完成得好不好"的完整评估。

Claude Code 这边也有类似的四维评测(来自 wshobson/agents 的 eval-judge):

维度 权重
Triggering Accuracy(触发准确度) 25%
Orchestration Fitness(编排适配度) 20%
Output Quality(输出质量) 15%
Scope Calibration(范围校准) 12%

两套体系一对比就很有意思:微信侧重端到端行为验证(用户说了什么 → AI 做了什么 → 结果对不对),Claude Code 更侧重Skill 本身的结构质量(触发精准不精准、编排合不合理、范围大不大)。结合起来看,评测 Skill 其实是两个层面:运行时表现 + 静态结构质量


二、Skill 开发的六大组成部分

Skill 不是一个文件,是一整个小型服务包。拿微信小程序 Skill 举例:

weather-skill/
├── SKILL.md              ← 说明书:什么时候触发、干什么
├── mcp.json              ← 接口契约:声明入参/出参/组件
├── index.js              ← 接线员:注册接口 + 中间件
├── apis/                 ← 干活的:业务脚本逻辑
│   └── getWeather.js
├── components/           ← 门面:UI 卡片渲染
│   └── weather-card/
└── data/                 ← 备查档案:Mock 数据 / 常量
    └── seed.js

2.1 SKILL.md —— 触发说明书

这是 AI 最先看的文件,决定这个 Skill 会不会被调用:

---
name: weather-skill
description: 天气查询业务。当用户想查天气时触发。
---

## 触发场景
- "今天北京天气怎么样?"
- "明天会下雨吗?"

## 不适用范围
- 询问日期、时间等非天气信息

description 是给 AI 看的,不是给人看的。写模糊了 → 该触发时不触发 → 意图理解得分低。

2.2 mcp.json —— 接口契约

向 AI 声明所有原子接口的入参/出参/组件映射

{
  "apis": [{
    "name": "getWeather",
    "description": "查询指定地点的天气",
    "inputSchema": {
      "type": "object",
      "properties": {
        "location": { "type": "string", "description": "城市名" },
        "days": { "type": "number", "description": "预报天数 1-7" }
      },
      "required": ["location"]
    }
  }]
}

AI 会根据 inputSchema 自动从用户对话里抽取参数填进去——你不需要写任何调用代码。

2.3 index.js —— 入口 + 中间件

注册所有接口,绑定鉴权、日志、错误处理等横切逻辑:

const skill = wx.modelContext.createSkill('/path/to/weather-skill')

skill.use(async (ctx, next) => {
  // 统一鉴权、打日志、捕获异常
  await next()
})

skill.registerAPI('getWeather', require('./apis/getWeather'))

2.4 apis/ —— 业务脚本

真正干活的代码,返回 content(给 AI 看)+ structuredContent(给组件渲染):

async function getWeather({ location, days = 1 }) {
  const res = await wx.request({
    url: 'https://api.example.com/weather',
    data: { city: location, days }
  })
  return {
    isError: false,
    content: [{ type: 'text', text: `${location} 未来 ${days} 天天气已查到` }],
    structuredContent: { location, forecasts: res.data.forecasts }
  }
}

2.5 components/ —— UI 组件

把结构化数据渲染成对话流里的卡片(宽高 4:1 ~ 1:1),不是普通页面:

Component({
  lifetimes: {
    created() {
      const modelCtx = wx.modelContext.getContext(this)
      modelCtx.on(wx.modelContext.NotificationType.Result, (data) => {
        const sc = data?.result?.structuredContent || {}
        this.setData({ location: sc.location, forecasts: sc.forecasts })
      })
    }
  }
})

2.6 data/ & utils/ —— 关键信息存储

  • data/:Mock 数据、静态配置、种子数据
  • utils/:公共工具函数(日期格式化、请求签名、加密)
  • 接口返回的 structuredContent运行时关键信息,同时给 AI 理解和组件消费

Claude Code 这边还有 scripts/ 放辅助脚本、.mcp.json 声明 MCP 服务——本质上和微信的 apis/ + mcp.json 是同一套思想。


三、开发与评测闭环

把开发和评测串起来,形成闭环:

写 SKILL.md        →  意图理解评测
写 mcp.json        →  接口覆盖率评测
写 apis/ 脚本      →  轨迹生成评测  +  最终答案质量评测
跑 wxa-skill-eval  →  生成 eval_report.html  →  根据低分项回头改

每个环节都对应明确的评测指标,开发时就知道会被怎么打分。


四、一句话总结

组件 一句话
SKILL.md 告诉 AI 什么时候出发
mcp.json 告诉 AI 能调什么、传什么参
index.js 把接口注册起来
apis/ 真正干活的业务脚本
components/ 把结果画出来
data/ 备查的关键信息

评测四个字:理解 → 轨迹 → 结果 → 覆盖。四个维度合在一起,就是一个 Skill 的完整质量画像。


Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐