如何评估你的 Skill 质量——从触发准确率到输出质量的系统方法

如何评估你的 Skill 质量------从触发准确率到输出质量的系统方法

你写的 Skill 跑通了几个测试用例,不代表它好用。换个 prompt 就翻车的情况,比你想象的常见得多。


目录


为什么需要评估 Skill

你花了一个下午写了一个 Skill,测试了三五个 prompt,Agent 表现不错。你把它提交到仓库里,觉得大功告成。

然后上线后发现:换个说法就不触发了,触发了但输出格式不对,格式对了但 token 消耗比没用 Skill 还多。

问题出在哪?开发时的几个例子不能代表真实场景。 Skill 的价值在于被重复使用------你和用户在开发时只能测几个例子,但上线后可能被调用成千上万次。如果只在开发时"跑得通",但换个场景就废了,那这个 Skill 就是废的。

用机器学习的术语来说,这叫过拟合:在训练集上表现很好,但泛化能力差。Skill 评估的核心目标就是确保泛化能力------不是在你精心构造的几个例子上过关,而是在真实用户的千变万化的表达下都能正确工作。

评估从三个维度入手:触发准确率、输出质量、效率指标。


维度一:触发准确率

Skill 的 description 字段决定了 Agent 什么时候会调用它。这个字段写得好,Agent 能精准识别需要这个 Skill 的场景;写得差,要么该触发不触发,要么不该触发乱触发。

评估触发准确率需要准备两类测试用例。

正例(should_trigger: true)

这些是应该触发 Skill 的 prompt。关键是要覆盖不同的表达方式:

  • 正式表达:"请按照 NVC 四步法评估这段对话的沟通质量"
  • 口语化:"帮我看看这段对话哪里说得不好"
  • 简略:"评分"
  • 隐含需求:用户没有明确提到 Skill 名称,但需求明显指向这个能力------"我跟室友吵架了,帮我分析一下我的表达有什么问题"

用 NVC Practice 项目的 nvc-scoring-engine Skill 举例:

json 复制代码
[
  {"query": "帮我按照 NVC 四步法给这段对话打分", "should_trigger": true},
  {"query": "分析一下我刚才的回复哪里需要改进", "should_trigger": true},
  {"query": "评分", "should_trigger": true},
  {"query": "我和女朋友吵架了,看看我的表达有什么问题", "should_trigger": true},
  {"query": "观察、感受、需要、请求,我的回答每个维度多少分", "should_trigger": true}
]

负例(should_trigger: false)

这些是不应该触发 Skill 的 prompt。负例的质量决定了测试的价值。 太简单的负例没有意义------"写个斐波那契函数"作为评分引擎的负例,任何 description 都不会误触发。好的负例应该是"差一点就该触发"的那种:

json 复制代码
[
  {"query": "NVC 理论的四个步骤是什么", "should_trigger": false},
  {"query": "帮我写一段模拟对话,展示非暴力沟通的用法", "should_trigger": false},
  {"query": "推荐几本关于非暴力沟通的书", "should_trigger": false},
  {"query": "我的练习会话卡住了,一直在加载", "should_trigger": false},
  {"query": "怎么在数据库里查询所有评分低于 60 的对话记录", "should_trigger": false}
]

这些负例的难度在于:它们都和 NVC 相关,但需求分别是理论查询、内容创作、推荐、排障、数据库操作------都不是"评分引擎"该干的事。如果 Skill 在这些用例上错误触发,说明 description 写得太宽泛了。


维度二:输出质量

Skill 触发了,Agent 也按 Skill 的指引做了,但输出质量怎么样?这个维度分两种评估方式。

定量评估(Assertions)

有些输出质量可以用脚本自动检查,结果是 pass/fail,没有主观性:

  • 输出文件是否存在:Skill 要求生成报告,报告文件产出了吗?
  • 格式是否正确:JSON 能解析吗?YAML 的缩进对吗?
  • 关键字段是否包含 :评分结果里有没有 scorefeedbackdimension 这些字段?
  • 数值是否在预期范围内:NVC 评分应该是 0-100 的整数,有没有出现负数或小数?

这些断言的价值在于可重复------同一个 Skill 跑 10 次,断言的结果应该一致。

定性评估(Human Review)

有些东西没法量化,必须人来看:

  • 内容是否符合预期:评分的反馈是不是真的指出了用户表达的问题?
  • 风格是否合适:反馈的语气是鼓励性的还是打击性的?
  • 细节是否到位:改写示例是不是真的比用户原句更符合 NVC 原则?

"写作风格是否自然"------你没法写一个断言来检查这个。定性评估是必须的,但可以通过结构化的方式降低主观性:准备一份评分 rubric(评分标准),让评估者按维度打分,而不是笼统地说"好"或"不好"。


维度三:效率指标

Skill 让 Agent 变强了,但代价是什么?

  • Token 消耗:用了 Skill 之后,Agent 的上下文窗口多了多少 token?如果 Skill 主文件就有 5000 token,但实际只用到了其中 500 token 的知识,剩下 4500 token 就是浪费。
  • 执行时间:完成任务需要多久?如果 Agent 按照 Skill 的指引走了 12 步,但其实 3 步就能搞定,说明 Skill 里有冗余指令。
  • 步骤数量:Agent 是不是在做无用功?看 transcript(执行日志),如果 Agent 在某个步骤上反复尝试,说明这部分指引不够清晰。

效率指标帮你发现 Skill 中拖后腿的部分。如果模型每次都花大量时间做同一件事,说明这部分应该被抽成脚本,让机器做机器擅长的事。


评估流程四步走

Step 1:准备测试用例

写 2-3 个真实的用户 prompt。不是"处理数据"这种抽象描述,而是具体的:

"我老板发了个 xlsx 文件(在我下载文件夹里,叫 'Q4 sales final FINAL v2.xlsx'),她要我加一列显示利润率百分比。收入在 C 列,成本在 D 列"

这种带上下文、有细节、甚至有错别字的 prompt 才是真实场景。用户不会按你 Skill 文档里的术语说话。

Step 2:跑对照实验

每个测试用例跑两个版本:

  • 有 Skill:正常使用
  • 基线版:没有 Skill / 旧版 Skill

这样才能知道 Skill 到底带来了什么改进。如果两个版本的结果差不多,要么是 Skill 没用,要么是测试用例太简单。

Step 3:收集反馈

让用户看输出结果,给反馈。一个简单的规则:空反馈 = 满意,有文字 = 有问题。 用户不说话说明结果可以接受,用户开口了说明有改进空间。

重点关注有具体抱怨的用例。"评分结果里没有改写示例"比"感觉不太好"有价值得多。

Step 4:迭代改进

根据反馈改 Skill,但要遵守三条原则(后面展开讲)。


四个常见陷阱

陷阱一:测试用例太简单。 "读取这个 PDF"不会触发任何专业 Skill,因为 Agent 可以直接用基础工具处理。要测试复杂的、多步骤的、专业化的任务。简单用例通过了不代表 Skill 好用,只代表 Agent 本身够聪明。

陷阱二:只看成功的用例。 失败的用例才是改进的方向。如果所有测试都通过了,要么是测试太简单,要么是覆盖不够。主动去找失败案例,比庆祝成功案例有价值得多。

陷阱三:断言没有区分度。 如果一个断言不管有没有 Skill 都能通过,那它没有任何测试价值。好的断言应该能区分出 Skill 带来的改进。比如"输出包含评分"这个断言太弱------没 Skill 的时候 Agent 也会给评分。"输出包含按 NVC 四个维度分别评分,每个维度有具体反馈和改写示例"才有区分度。

陷阱四:忽视方差。 同一个 prompt 跑多次,结果可能不一样。高方差意味着 Skill 不稳定。如果一个 prompt 跑 5 次,3 次很好、2 次翻车,说明 Skill 的指引有模糊地带,模型在某些路径上做出了不同的选择。


深度案例:量化策略构建 Skill 的评估

讲完通用方法,来看一个具体例子。

Strategy Builder 是一个把模糊的投资想法转化为可执行量化策略的 Skill。用户说"我想买几个 AI 股",它会通过对话收集需求,最终输出一套完整的策略配置和可执行代码。

这个 Skill 的特殊之处在于:输出不是文档或代码那么简单,而是一整套交互流程加最终的策略配置加可执行代码。评估起来比一般 Skill 复杂得多,但它恰好覆盖了所有评估维度,适合做深度剖析。

维度一:触发准确率

正例:

json 复制代码
[
  {"query": "我想买 AXTI, IQE, LITE 这几只股票", "should_trigger": true},
  {"query": "帮我搞一个 AI 光通信相关的策略", "should_trigger": true},
  {"query": "想做一个动量策略,标普500成分股,每周调仓", "should_trigger": true}
]

负例(难度要高):

json 复制代码
[
  {"query": "NVDA 现在多少钱", "should_trigger": false},
  {"query": "帮我分析一下苹果的财报", "should_trigger": false},
  {"query": "我已经有策略了,帮我下单买入 AAPL 100股", "should_trigger": false},
  {"query": "做一个 BTC/ETH 的套利策略", "should_trigger": false},
  {"query": "帮我写个期权 covered call 策略", "should_trigger": false}
]

后面三个是关键负例:第三个看起来像策略相关,但用户要的是执行而不是构建;第四个涉及 crypto,这个 Skill 不支持;第五个涉及 options,也不支持。如果 Skill 在这些用例上错误触发,说明 description 写得太宽泛。

维度二:交互流程质量

Strategy Builder 是对话式的,要评估的不只是最终输出,还有中间交互是否合理。

定性检查清单:

  • 是否一次只问一个问题?(不能一下子抛出 7 个维度让用户填)
  • 是否提供了选项而不是开放式问题?
  • 是否在用户模糊时给出了合理默认值?
  • 是否在用户要求不支持的功能时明确说明而不是默默忽略?
  • 是否定期总结已确定的内容?

自动化断言:

python 复制代码
assertions = [
    {
        "name": "single_question_per_turn",
        "check": "count('?') <= 2 in each assistant turn"
    },
    {
        "name": "offers_options",
        "check": "contains numbered list or bullet options when asking"
    },
    {
        "name": "acknowledges_limitations",
        "check": "if user asks for options/crypto/shorts, response contains 'not supported' or 'limitation'"
    }
]

维度三:配置完整性

最终输出是一个 YAML 策略配置。必须验证关键字段:

python 复制代码
assertions = [
    {
        "name": "has_universe",
        "check": "yaml.universe is defined and has at least 1 ticker"
    },
    {
        "name": "has_signal",
        "check": "yaml.signal.type in ['momentum', 'mean_reversion', 'trend', 'fundamental', 'event']"
    },
    {
        "name": "has_weighting",
        "check": "yaml.weighting.method is defined"
    },
    {
        "name": "has_execution",
        "check": "yaml.execution.rebalance_freq is defined"
    },
    {
        "name": "position_math_valid",
        "check": "yaml.weighting.max_position_pct * yaml.risk_management.max_positions >= 1.0"
    }
]

最后一条断言检查的是仓位逻辑:最大持仓比例乘以最大持仓数量必须至少为 1,否则数学上就不可能满仓。这种逻辑错误人工很难发现,但断言一秒就能抓到。

维度四:代码可执行性

最硬核的评估:生成的 Python 代码能不能跑。

python 复制代码
def test_generated_code(code_path):
    # 1. 语法检查
    import ast
    with open(code_path) as f:
        ast.parse(f.read())  # 语法错会抛异常

    # 2. 导入检查
    import subprocess
    result = subprocess.run(
        ['python', '-c', f'import {code_path.stem}'],
        capture_output=True
    )
    assert result.returncode == 0, "Import failed"

    # 3. 回测能跑(用 mock 数据,避免依赖真实行情)

维度五:逻辑合理性

这是最难自动化的部分,需要人工判断:

  • 用户说"我看好 AI",生成的 universe 是否真的包含 AI 相关股票?
  • 用户说"保守一点",stop loss 设置是否比默认值更紧?
  • 用户说"不想频繁交易",rebalance 频率是否设成 monthly 或更低?

可以用 LLM-as-judge(让另一个 LLM 当评审)做初筛:

python 复制代码
judge_prompt = """
用户原始需求: {user_request}
生成的策略配置: {strategy_yaml}

请判断策略配置是否合理反映了用户需求。
评分 1-5,并说明理由。
"""

完整测试矩阵

测试用例 触发 交互流程 配置完整 代码可执行 逻辑合理
模糊输入:"想买几个 AI 股" 问了 universe、signal、weighting 需人工
明确输入:"RSI 均值回归 SP500" 只补充缺失字段 需人工
不支持请求:"做个期权策略" 明确拒绝并给替代方案 N/A N/A
边缘情况:"只给一个 ticker" 警告风险但继续 需人工

迭代改进原则

跑完评估后,根据反馈改 Skill。但改的时候要注意三条原则。

泛化而不是过拟合。 用户说"这个图表没有坐标轴标签",不要加一条"必须给图表加坐标轴标签"的硬规则。要理解为什么模型会漏掉------是 Skill 里没有提到图表规范?还是提到了但不够具体?从根本上解决问题,而不是针对某一个用例打补丁。加一条硬规则可能解决了这一个 case,但下次用户换个需求又会漏别的。

解释 Why 而不是堆 MUST。 当你发现自己在写"ALWAYS"和"NEVER"的时候,停下来想想能不能换个方式解释清楚背后的原因。"必须用 HNSW 索引"不如"HNSW 在查询密集场景下延迟更低,RAG 的写入频率远低于查询频率,所以选 HNSW"。模型很聪明,给它理由比给它命令更有效。

保持精简。 看 transcript,如果模型在某个步骤上浪费时间,考虑删掉那部分指令。Skill 不是越长越好。每一条指令都有 token 成本------如果它不能显著提升输出质量,就不该存在。


工具推荐

Codex 生态skill-creator 自带评估工具链------aggregate_benchmark 脚本自动聚合评估结果,generate_review.py 生成可视化的评估界面,run_loop.py 自动化优化 description 的触发率。

通用方案:手动跑测试用例,在对话中收集反馈。没有工具链也能做评估------准备 5 个测试 prompt,分别在有 Skill 和没有 Skill 的情况下跑一遍,对比结果。这比"跑通了就行"靠谱得多。

LLM-as-judge:让另一个 LLM 当评审,按评分标准打分。适合做初筛------把明显不合格的输出先过滤掉,减少人工审阅量。但不能完全替代人工,尤其是涉及风格、语气、业务逻辑合理性这些主观维度。


写在最后

好的 Skill 是改出来的,不是一次写好的。评估不是一次性的工作,而是一个持续迭代的过程:写测试用例 → 跑对照实验 → 收集反馈 → 分析问题 → 改进 Skill → 重复。

不要追求第一个版本就完美。追求第一个版本就有测试用例,然后在真实使用中不断发现盲区、修补漏洞。Skill 的质量曲线不是一条直线,而是一个阶梯------每次评估发现一个新问题,解决后 Skill 就上一个台阶。

相关推荐
编程探索者小陈2 天前
【测试】之测试分类篇
测试
kida_yuan3 天前
【以太来袭】7. Besu 性能基线(Caliper)
区块链·测试
qq_白羊座7 天前
测试资产复用维护方法
测试·测试资产
HuskyYellow8 天前
第 1 篇:没有专职测试的小团队,为什么需要 ai-phone?
人工智能·开源·测试
康谋自动驾驶9 天前
智驾仿真测试团队必看:ADAS HiL测试引入3DGS的ROI测算与结论!
自动驾驶·测试·3dgs·hil测试·场景生成·智驾仿真
wangruofeng10 天前
Playwright 深度调研:为什么它成了浏览器自动化的新底座
前端·测试
祁白_11 天前
[HCTF 2018]WarmUp1
安全·渗透·测试·ctf·writeup
祁白_11 天前
无字母数字 Webshell 绕过
笔记·web安全·测试·ctf
AdCj311 天前
放弃第三方框架,用系统自带工具玩转 Shell 测试
shell·测试