Библиотека · Навыки: научить агента работать по-твоему

Evals — самоулучшающиеся скиллы

Инженер65 минОбновлено: октябрь 2026
32 из 105 в библиотеке

Модуль: Skills — переиспользуемая экспертиза | Время: ~25 мин теории + 40 мин практики


Суть урока

Скилл без тестирования — это как нанять повара и никогда не пробовать его блюда. Может готовит отлично. Может кладёт соль вместо сахара. Eval — это система дегустации: она берёт скилл, прогоняет через реальные сценарии, выдаёт точный балл и показывает где именно что-то пошло не так. Скилл с низким pass rate можно заметно подтянуть за несколько итераций — без угадывания.


Ключевые концепции

  • eval.json — файл тестирования выхода скилла: задаёт конкретные входы и проверяет качество output
  • trigger_eval.json — тестирование активации: когда скилл должен срабатывать, а когда нет
  • Pass rate — процент тест-кейсов которые скилл прошёл успешно
  • Assertions — конкретные проверки: точное количество, лимит символов, соответствие формату, релевантность
  • Цикл улучшения — написать → eval → найти слабости → улучшить → eval снова
  • Skill Creator — плагин skill-creator из официального каталога Anthropic, который помогает создать тесты и прогнать их

Про названия файлов. Актуальный Skill Creator (на октябрь 2026, по документации Claude Code) хранит тесты в evals/evals.json, оценки проверок записывает в grading.json, сравнение "со скиллом и без" — в benchmark.json, а срабатывание проверяет через настройку описания (description tuning) на наборах запросов "должен / не должен срабатывать". Ниже файлы названы eval.json и trigger_eval.json, как в учебной схеме: принцип тот же, а точные имена и поля смотри в том, что создаст плагин у тебя.


Теория

Что такое eval и зачем он нужен

Без eval ты улучшаешь скилл на ощущение: "кажется лучше стало". С eval — видишь цифры.

🎨 Образ: eval — это как нанять тест-группу для ресторана. Не "кажется вкусно" — а 20 людей с анкетой: температура блюда, время ожидания, соответствие меню, соль, подача. Числа говорят что улучшать. Ощущения врут.

Пример из учебной демонстрации (цифры иллюстрация, у тебя будут свои): скилл генерации YouTube заголовков протестировали через eval:

Метрика Со скиллом Без скилла
Pass rate 100% 33–50%
Точное количество (10 заголовков) 6/6 тестов 2/6 тестов
Лимит символов (60 символов) 100% соблюдение нарушается часто
Разнообразие формулировок высокое низкое

Одна итерация — и разница видна. Без eval такой анализ занял бы много ручного тестирования.


eval.json — тестирование качества output

🎨 Образ: eval.json — это технические условия (ТУ) для продукта на заводе. Каждый тест-кейс — конкретный пункт: длина от 10 до 60 мм, нагрузка до 500 кг, цвет RAL 3020. Продукт проходит контроль — едет на склад. Не прошёл — возврат в цех.

Это файл с 3–5 тест-кейсами. Каждый кейс:

  1. Input — конкретный запрос к скиллу
  2. Expected — что должно получиться
  3. Assertions — конкретные проверки которые можно измерить

Структура eval.json:

json
{
  "skill": "youtube-title-generation",
  "test_cases": [
    {
      "id": "beginner-coding-video",
      "input": {
        "topic": "Claude Code для начинающих",
        "angle": "первые шаги без знания программирования",
        "count": 10
      },
      "assertions": [
        {
          "type": "exact_count",
          "value": 10,
          "description": "Должно быть ровно 10 заголовков"
        },
        {
          "type": "max_length",
          "value": 60,
          "description": "Каждый заголовок не более 60 символов"
        },
        {
          "type": "framework_adherence",
          "description": "Использованы фреймворки: любопытство, специфичность, эмоция"
        },
        {
          "type": "topic_relevance",
          "description": "Все заголовки релевантны теме Claude Code для начинающих"
        },
        {
          "type": "variety",
          "description": "Не менее 5 разных структур заголовков (не одинаковые шаблоны)"
        }
      ]
    },
    {
      "id": "tool-comparison-video",
      "input": {
        "topic": "VS Code vs Cursor vs Devin Desktop (бывший Windsurf) сравнение",
        "angle": "что выбрать разработчику в 2026",
        "count": 10
      },
      "assertions": [
        {"type": "exact_count", "value": 10},
        {"type": "max_length", "value": 60},
        {"type": "includes_comparison", "description": "Хотя бы в 3 заголовках есть явное сравнение"},
        {"type": "framework_adherence"},
        {"type": "variety"}
      ]
    }
  ]
}

trigger_eval.json — тестирование активации

Скилл должен срабатывать на нужных запросах и не срабатывать на посторонних. Trigger eval проверяет именно это.

Структура — 20 тестов: 10 "должен активировать" + 10 "не должен":

json
{
  "skill": "youtube-title-generation",
  "trigger_tests": {
    "should_trigger": [
      "придумай заголовки для видео про AI",
      "дай мне 10 идей для названия ролика",
      "помоги назвать видео про Claude Code",
      "brainstorm YouTube titles for my tutorial",
      "какие заголовки сделают видео кликабельным",
      "хочу 15 вариантов заголовка для сравнения",
      "генерируй заголовки по моей теме",
      "что написать в названии ролика",
      "suggestions for video title",
      "придумай цепляющие заголовки"
    ],
    "should_not_trigger": [
      "напиши скрипт для YouTube видео",
      "сделай thumbnail для канала",
      "как улучшить SEO канала",
      "напиши blog пост на эту тему",
      "как набрать подписчиков на YouTube",
      "помоги с описанием видео",
      "стратегия роста канала",
      "анализ конкурентов в нише",
      "как редактировать видео",
      "придумай контент-план на месяц"
    ]
  }
}

🎨 Образ: trigger_eval — это тест для охранника. Охранник должен пускать только нужных людей (should_trigger) и останавливать чужих (should_not_trigger). Если охранник пускает всех подряд — скилл активируется на посторонних запросах. Если останавливает всех — скилл вообще не работает.


Цикл самоулучшения

Это не разовое тестирование. Это петля которую ты повторяешь пока не доволен.

Код
Версия 1 скилла
     ↓
Запуск eval → результат: 60% pass rate
     ↓
Анализ: что именно провалилось?
  - exact_count: 8 из 10 (не считает правильно)
  - max_length: нарушается в 3 случаях
     ↓
Улучшение скилла:
  - добавить явное правило "всегда ровно N заголовков"
  - добавить правило "максимум 60 символов, проверяй каждый"
     ↓
Версия 2 скилла
     ↓
Запуск eval → результат: 90% pass rate
     ↓
Ещё одна итерация → 100%

🎨 Образ: цикл улучшения скилла — как тренировки спортсмена. Пробежал 5 км, замерил время. Посмотрел где задыхался. Поработал над дыханием. Пробежал снова. Без замера — просто "вроде быстрее". С замером — конкретные секунды прогресса.

Идея цикла: скажи скиллу улучшиться, запусти eval снова, посмотри на числа. Это повторяющаяся петля, в которой скилл улучшается на данных, а не на ощущениях (при условии, что улучшения принимаешь ты сам).


Частые ошибки при работе с Evals

  1. Не запускать eval после изменения скилла. Изменил одну строку в скилле — запусти eval. Маленькое изменение может сломать trigger или изменить формат output. Eval покажет это быстро.

  2. Слишком мало тест-кейсов. 1-2 тест-кейса не покрывают edge cases. Минимум 3 кейса для eval.json и 10+10 для trigger_eval.json (10 "должен активировать" + 10 "не должен").

  3. Тестирование только happy path. "Скилл работает когда всё хорошо" — недостаточно. Добавь кейсы с некорректным вводом, пустыми данными, граничными значениями.

  4. Не сохранять результаты eval между итерациями. Если не записываешь pass rate каждой версии — не видишь прогресс. Веди лог: v1 = 44%, v2 = 71%, v3 = 89%.


Реальный eval.json с 3 тест-кейсами

json
{
  "skill": "email-cold-outreach",
  "test_cases": [
    {
      "id": "saas-founder",
      "input": {
        "recipient_role": "CEO SaaS стартапа",
        "product": "AI автоматизация поддержки",
        "tone": "professional"
      },
      "assertions": [
        {"type": "max_length", "value": 200, "description": "Не более 200 слов"},
        {"type": "includes", "value": "call-to-action", "description": "Есть конкретный CTA"},
        {"type": "excludes", "value": "спам-слова", "description": "Нет слов: бесплатно, срочно, уникальное предложение"}
      ]
    },
    {
      "id": "ecommerce-manager",
      "input": {
        "recipient_role": "Маркетолог e-commerce",
        "product": "SEO аудит",
        "tone": "casual"
      },
      "assertions": [
        {"type": "max_length", "value": 150, "description": "Casual = короче"},
        {"type": "tone_check", "description": "Тон неформальный, без канцеляризмов"},
        {"type": "includes", "value": "personalization", "description": "Есть персонализация под роль"}
      ]
    },
    {
      "id": "edge-case-empty",
      "input": {
        "recipient_role": "",
        "product": "AI tool",
        "tone": "professional"
      },
      "assertions": [
        {"type": "graceful_handling", "description": "Скилл обрабатывает пустое поле без ошибки"},
        {"type": "fallback", "description": "Использует generic обращение если роль не указана"}
      ]
    }
  ]
}

Как запустить eval: команды

Сначала установи плагин (имя каталога покажет меню /plugin):

Напиши в чат
/plugin install skill-creator@claude-plugins-official

Создать eval для существующего скилла и запустить его:

Напиши в чат
Проверь мой скилл youtube-title-generation с помощью skill-creator: составь тесты и запусти их

В документации Claude Code пример формулировки такой: "evaluate my summarize-changes skill with skill-creator". Тесты ложатся в папку evals/ внутри папки скилла, каждый прогон идёт в отдельном субагенте.

Формат папки скилла после создания eval (схема для понимания, реальные имена файлов могут отличаться):

Код
.claude/skills/youtube-title-generation/
├── SKILL.md              ← основной файл скилла
├── evals/
│   ├── eval.json         ← тесты качества output (в плагине: evals.json)
│   └── trigger_eval.json ← тесты активации
└── references/
    └── title-examples.md ← примеры заголовков (если есть)

Метрики в отчёте eval

После запуска получаешь отчёт:

Напиши в чат
EVAL REPORT: youtube-title-generation
======================================
Test case 1: "Claude Code для начинающих"
  WITH skill:    6/6 assertions PASSED ✓
  WITHOUT skill: 2/6 assertions passed ✗

Test case 2: "VS Code vs Cursor vs Devin Desktop"
  WITH skill:    5/6 assertions PASSED ✓
  WITHOUT skill: 3/6 assertions passed ✗

SUMMARY:
  With skill:    91.7% pass rate (11/12 assertions)
  Without skill: 41.7% pass rate (5/12 assertions)

ANALYSIS:
  Biggest advantage: format compliance (+100%)
  Weakness found: exact_count failed in test 2
  Recommendation: add explicit counting rule to skill

🎨 Образ: отчёт eval — как распечатка анализов в клинике. "Гемоглобин 110 — ниже нормы. Рекомендовано: железо." Не надо угадывать что болит. Конкретный показатель, конкретное лечение.

Когда видишь "Weakness found" — это подсказка что именно улучшить в скилле. Не гадаешь. Цифры говорят сами.


Практика

Задание: Создать eval для существующего скилла

  1. Выбери любой скилл который ты создал на предыдущих уроках (или создай простой скилл для этого упражнения)
  2. Дай команду: Составь тесты для моего скилла [название] с помощью skill-creator — Skill Creator сгенерирует тестовые случаи и проверки активации
  3. Изучи созданные eval.json и trigger_eval.json: понимаешь ли ты что они проверяют?
  4. Дай команду: Запусти тесты для моего скилла [название]
  5. Прочитай отчёт: какой pass rate? Что провалилось?
  6. Улучши скилл на основе слабых мест которые нашёл eval
  7. Запусти eval снова — сравни pass rate до и после

Цель: получить не менее 80% pass rate (условный ориентир), понять логику итерации


Инструменты и ресурсы

  • Skill Creator — установить через /plugin install skill-creator@claude-plugins-official (или найти через меню /plugin)
  • eval.json (в плагине — evals/evals.json) — тесты качества, создаются в папке evals/ внутри скилла
  • trigger_eval.json — тесты активации (в плагине это настройка описания на наборах "должен / не должен срабатывать")
  • Claude Code Skills документация — официальное руководство по скиллам, раздел про проверку скиллов
  • Claude Code — просьбы вроде "проверь мой скилл с помощью skill-creator" работают в чате

Ключевые выводы

Eval переводит улучшение скиллов из области ощущений в область цифр. Pass rate растёт итерациями, а не угадыванием (в демо — с 60% до 90%+ за пару итераций, цифры условные).

eval.json тестирует качество output (что скилл производит). trigger_eval.json тестирует когда скилл должен активироваться. Оба нужны.

Цикл: скилл → eval → найти слабость → улучшить → eval снова. Повторять, пока результат тебя не устроит. Не останавливаться на первой версии.


Связанные уроки


Следующий урок

→ Use Don't Build — Skills Ecosystem: когда брать готовое, а когда создавать своё. Дальше — Hooks — автоматические правила Claude Code.

Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс