Что такое скиллы агентов и зачем они нужны?
Относительно новая штука в мире AI-агентов - это так называемая система скиллов или навыков.
Недавно я начал плотно заниматься развитием скиллов. Создал даже маркетплейс Claude плагинов для Respawn, где храню скилл по ksrc и скилл по FlowMVI. Я все более активно использую и создаю разные скиллы, и многие из вас задают вопросы: “А что это вообще такое?”. А еще я вижу статьи в интернете, которые неправильно объясняют и неправильно рекомендуют создавать и пользоваться скиллами.
Итак, изначально навыки были придуманы Anthropic как часть своего SDK для Claude Code. По сути, скиллы агентов ничего революционного не привносят - это все еще просто папки с markdown-файлами. Самое важное в том, как они работают - через так называемое прогрессивное раскрытие контекста вашего агента. Я уже говорил, что самым важным сейчас является инженерия контекста для LLM, и это еще один способ более эффективно использовать контекст.
Как работают скиллы?
Скиллы определяются одним основным файлом (SKILL.md), и в нем есть определенная структура frontmatter - заголовка в файле. В этом frontmatter есть название скилла (чему он обучает) и description - короткое описание, в котором в идеале написано, когда нужно этим скиллом пользоваться и чему он может научить модель в очень краткой форме.
Когда ваша обертка для агента замечает, что у вас в папке с скиллами есть такой файл, она парсит его хедер и включает это сразу в контекст агенту (буквально как часть agents.md или claude.md). Таким образом у вас появляется зацепка для LLM: “Используй этот скилл, когда будешь писать код с FlowMVI”.
Модели уже настолько стали умными, что они по одной строчке текста могут понять, в каком контексте разработки нужно прочитать и использовать этот скилл. И система скиллов как раз этим пользуется. Это для меня как забросы удочки - модель видит на поверхности поплавок, и потом она может вытянуть целую огромную пачку документации по желанию и искать в ней все, что ей нужно.
Структура скилла
Заголовок прописывается в файле SKILL.md. В этом файле вы описываете структуру вашего скилла: какие есть папки, какие есть файлы, и основные моменты по использованию.
Например, в моем скилле по FlowMVI модели предоставляется возможность просмотреть индекс документации, где расписаны все нюансы и детали пользования конкретной фичей (управление состоянием или создание плагинов). Но в самом файле skill.md, который модель полностью читает, если она решила воспользоваться скиллом, прописаны базовые вещи: “FlowMVI - это архитектурный фреймворк, вот как быстро сделать контракт, вот как писать фичи, вот такой DSL есть, и вот здесь можно посмотреть подписи функций”.
Поэтому раскрытие контекста происходит поэтапно: модель сначала видит суперкраткий хедер в две строчки, затем читает главный файл skill.md (несколько сотен строчек), и затем уже дальше может решить: “Ага, я понимаю, теперь мне нужно прочитать следующий файл, например, по созданию кастомных плагинов”. Модель идет в нужную папку рядом с лежащим файлом skill.md или делает интернет-запросы, как в моем случае, чтобы с получить свежую документацию.
Таким образом мы добиваемся минимальной траты контекста на какие-то знания для модели, в отличие от, например, MCP или AGENTS.md, которые просто целиком огромным куском текста закидываются в контекст модели, независимо от того, нужны они или нет.
Зачем вашей модели знать, как деплоить ваш бэкенд на продакшн, если она сейчас занимается минорными правками после ревью? В этом вся суть скиллов: не давать модели сразу все подряд, чтобы не загадить контекст, а потихоньку раскрывать только нужную информацию и дать модели использовать свои невероятно крутые возможности поиска и работы с командной строкой для того, чтобы найти конкретно то, что ей нужно.
Зачем нужно создавать скиллы?
Скиллы вам нужны для передачи модели в прогрессивной форме узкоспециализированных или свежих знаний, которые еще не включены в тренировочные данные модели.
Вы можете создавать скиллы для:
- Проприетарного SDK и как с ним работать (храните их тогда в вашем репозитории)
- Новых свежих API, которые вышли только несколько месяцев назад, и модель еще не справляется с тем, чтобы с ними работать
- Нишевых фреймворков, которые еще не включены в тренировочные данные
Чего НЕ нужно включать в скиллы
Самое важное - это для чего скиллы создавать не надо: для того, что модель, скорее всего, уже знает.
Вам не нужно создавать скилл:
- “Как компилировать Kotlin-код”
- “Как писать SwiftUI”
- “Как работать с OpenAI API”
Модели прекрасно это уже знают на основе миллионов строк кода и всей документации, которая есть в интернете. Я видел скиллы абсолютно бесполезного содержания. И если модель прочитает такой скилл, то она будет работать только хуже, потому что забьется ее контекст нерелевантной или повторяющейся информацией, которая не помогает модели, а отвлекает ее. Помните мое видео на RU-YouTube про внимание у моделей?
Прежде чем создавать скилл, подумайте: может ли модель уже знать то, что я пытаюсь ей донести? И полностью выпилите все, что модель уже знает, из вашего скилла.
Например, с ksrc модели не нужно знать, что ksrc написан на Go, как нужно использовать escape sequences, как нужно использовать синтаксис sed, как нужно пользоваться ripgrep, и как делать цепочки из команд bash. Это прекрасно модель умеет делать, и об этом ей повторять не нужно. Но то, что модель не знает - это то, как и зачем нужно работать с ksrc. Поэтому это как раз то, что я включил в файл skill.md для ksrc, и ничего более.
Если вам нужно сослаться на что-то, что модель уже знает, вы можете просто сослаться на это в одно-два слова. Например, вместо того чтобы расписывать, как работает синтаксис поиска грепом в деталях и какие поддерживаются аргументы, просто напишите: “Ripgrep аргументы поддерживаются в полной мере” или “Добавь —rg-args в конец, чтобы фильтровать результаты”. Этого будет достаточно.
Так работает и скилл для FlowMVI. В целом, модели уже давно знают, что такое MVI-фреймворки, но они именно не знают еще в идеале синтаксис конкретно FlowMVI как фреймворка и могут что-то не знать, что изменилось в новых версиях. Поэтому мой скилл вообще ни слова не содержит о том, что такое интенты и сайд-эффекты, и что нужно класть в MVI стейт. Потому что это общее знание, которым усеяны интернеты уже годами, десятки лет, и модель это знает в совершенстве. Вместо этого скилл состоит из подписей функций и возможных доступных для конфигурации параметров в разных DSL функциях и каких-то распространенных ошибок, которые модель допускает по моей практике работы с библиотекой. То есть закрывает конкретно слабые места модели, тратя минимальное количество токенов.
Когда нужно создавать скиллы?
Обычно это нужно, когда у вас разрастаются agents.md файлы, или когда вы даете какой-то фреймворк, который предполагается, что и модели будут использовать.
Например, ksrc предназначен для использования только моделями, разработчикам им пользоваться не нужно. FlowMVI используется и разработчиками, и моделями, поэтому скилл - это скорее приятный бонус. Но в любом случае, если модель будет использовать эту утилиту, было бы классно, если бы вы сразу с ней поставляли и скилл, который можно установить.
Почему? Модель либо не будет использовать утилиту вообще (просто потому что не знает о ее существовании), либо не будет использовать ее правильно (потому что без чтения документации она не будет знать синтаксис). Это хороший способ уменьшить agents.md и уменьшить токены, потраченные на ручной поиск документации моделями.
Если вы видите, что модель запинается в чем-нибудь - например, пишет не компилирующийся код, или неправильно использует новое API Compose, или не может виджет из Glance правильно сделать - вы можете собрать документацию, запаковать это в скилл, и это, если правильно выполните, может решить ваши проблемы с производительностью моделей при работе с конкретной технологией.
Как создавать скиллы
Скиллы - это перепакованная документация к какому-то фреймворку. Поэтому начните с того, чтобы создать хороший заголовок и skill.md.
Чаще всего у вас в коде (например, в Codex) есть уже встроенный флоу для создания скиллов. Вы просто используете скилл для создания скиллов (so meta 😅). И Codex, например, сам вам создаст весь скилл со всем, что нужно. Вы только ему скажите, где раздобыть документацию по фреймворку, а дальше он уже будет работать, чтобы ее запаковать в скилл.
Единственный момент: после создания скилла вам нужно все-таки пройтись по всем файлам, которые он насоздавал, и почистить их. Либо изначально промтить модель конкретно описывать моменты, которые, как вы уже знаете на практике, являются больными местами / трудными и сложными в использовании фичами. Потому что по умолчанию модель просто перепишет вам документацию в skill.md и также может не захватить многие моменты.
Например, во FlowMVI мне пришлось переделать очень много чего, потому что я хотел, чтобы модель сама через curl дергала самую обновленную документацию, а в skill.md и в папке со скиллом были только подписи функций.
Начните с темплейта, который вам создаст модель самостоятельно в вашей обертке, а потом доработайте его.
Заключение
Мое мнение в том, что скиллы - это очень классный способ экономии контекста. И эта фича очень хорошо попала в кривую развития LLM, потому что модели сейчас стали настолько просты в промтинге, что одной строчки достаточно для идеального выполнения инструкций моделью.
Поэтому вы просто создаете скилл, пишете в нем одну строчку “Используй ksrc для поиска исходников”, и вы можете рассчитывать, что модель уже настолько умна, что она сама поймет, когда этим скиллом пользоваться. Это очень просто для вас и очень сильно экономит контекст и повышает производительность модели.
Потому что я часто слышу, что люди жалуются: “У меня модель не пишет компилирующийся код” или “Не умеет работать с какими-то нишевыми либами”, а ответ все время был на поверхности - это как обычно просто markdown-файлы.