你正在 进阶版 · 🛠️ 技能工坊 · ← 回到学院 · 进阶版主页 · 总入口

← 十二个项目

项目 03 · 测试 · 演化 · 发布

把你前两个项目做的 Skill 系统化:30+ 测试用例、自动化 CI、能继续演化而不破坏现有功能。

怎么算"成"?

每次改动,CI 自动跑测试。一年后回来,你还能用、还敢改。

步骤 1 · 写 30+ 测试用例

覆盖:(1) 正常情况;(2) 边界(空输入、超长输入);(3) 异常(错误格式、不在领域内);(4) 回归(曾经出过的 bug)。

// tests/skill.test.ts
import { describe, it, expect } from 'vitest';
import { ask } from '../src/skill';

describe('领域专家', () => {
  it('能回答标准问题', async () => {
    const ans = await ask('什么是 RAG?');
    expect(ans).toContain('检索');
  });
  it('对不在领域的问题礼貌拒绝', async () => {
    const ans = await ask('今晚吃什么?');
    expect(ans).toMatch(/不擅长|超出/);
  });
  // ...28 个更多
});

步骤 2 · 配 GitHub Actions

# .github/workflows/test.yml
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npm test

步骤 3 · 演化策略

步骤 4 · 发布

把代码放到 GitHub 公开仓库。写 README,包含安装、使用、贡献指南。让别人能 clone 下来跑你的项目。

← 上一个 下一个:代码俱乐部 →

工程测验 为 Skills 系统做版本管理的关键是什么?
你的 Skills 系统从 v1 更新到 v1.1,改了一个函数的入参。正确的做法是:
解释:版本管理的核心是「向后兼容」和「明确弃用计划」。如果你改了函数签名,直接影响用户。最安全的做法是保留旧版本、创建新版本、然后用 3 个版本周期的弃用期告诉用户。
分步引导 发布一个可生产的 Skills 系统的 5 步
  1. 写测试用例库。至少 20 个真实的「输入→期望输出」对。分三类:(1)标准情况;(2)边界情况;(3)该拒绝的情况。
    看参考

    例:病人信息系统的 diagnose Skill。标准:患者有 5 个症状 → 输出 3 个可能病名;边界:患者 0 岁(新生儿)→ 输出要改变;拒绝:问题不在医学范畴 → 输出『无法回答』。

  2. 跑一遍自动化测试。每个 Skill 的通过率要 ≥95%。记录失败的用例,分析是 Skill 逻辑错还是测试期望错。
    看参考

    例:运行 `pytest test_skills.py -v` 看每个函数的覆盖率和失败原因。

  3. 做一次「黑箱测试」。找一个没写过这个 Skill 的人,给他文档和 5 个问题,看他能否用对。记录他的困惑点。
    看参考

    例:一个不懂医学的人读文档,能否正确调用 diagnose Skill?他是否会搞混入参的字段名?

  4. 写 CHANGELOG.md。标记这个版本里加了什么新 Skill、改了什么、删了什么(要标记 deprecated)。
    看参考

    例:`v1.1.0:新增 predict_risk Skill;改进 diagnose 入参;标记 old_diagnose 为 deprecated`。

  5. 打个版本号,锁定依赖版本,上传到内部或公开库(GitHub、PyPI 等)。
    看参考

    例:`v1.1.0` on GitHub,标记为 Release,包括编译后的包。

动手 写一个简单的 Skill 测试框架
任务:实现一个 `testSkill(skillFunc, testCases)` 函数,遍历 testCases,每个用例对比 expected vs actual,最后输出通过率。
参考实现

工程级参考答案(带完整注释):

// 生产级 Skill 测试框架
function testSkill(skillFunc, testCases) {
  const results = [];
  let passed = 0, failed = 0, errors = 0;
  
  console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n${skillFunc.name || 'Test'} 测试报告\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
  
  for (const tc of testCases) {
    const { name, input, expected, category = 'standard' } = tc;
    try {
      const actual = skillFunc(...(Array.isArray(input) ? input : [input]));
      const test_passed = JSON.stringify(actual) === JSON.stringify(expected);
      
      if (test_passed) {
        passed++;
        results.push({ name, category, status: 'PASS' });
      } else {
        failed++;
        results.push({ 
          name, category, status: 'FAIL',
          expected, actual
        });
      }
    } catch (err) {
      errors++;
      results.push({ name, category, status: 'ERROR', error: err.message });
    }
  }
  
  const total = testCases.length;
  const passRate = ((passed / total) * 100).toFixed(1);
  console.log(`\n结果:${passed}/${total} 通过 (${passRate}%)`);
  
  return { total, passed, failed, errors, passRate: parseFloat(passRate), results };
}
动手 写一个 Skill 的 deprecation 通知(给用户)
任务:你要发布一个新版本,其中弃用了一个旧 Skill。写一个通知文本,告诉用户:(1) 什么时候会完全移除;(2) 应该用什么替代;(3) 如何迁移他们的代码。

在下面框里写你自己的 prompt(可以用中文):

→ 打开通义千问粘贴试 已复制 ✓
看参考 prompt

参考 prompt(这是一个模板,你可以改细节):

你是一个领域专家。请基于以下规则回答问题:

1. 只基于你的专业知识和常见做法回答,不编造。
2. 如果问题超出你的领域,明确说「这不在我的专业范围内」。
3. 给出的建议应该包括「为什么」和「什么时候不应该这样做」。
4. 对于有争议的做法,列出不同观点。

现在,开始回答用户的问题。