Microsoft на прошлой неделе выкатила dotnet/skills — репу с agent skills для .NET разработчиков. Ставишь через
/plugin install dotnet-diag@dotnet-agent-skills
и агент подгружает специальный контекст перед тем как отвечать. Все это написала команда, которая сама рантайм строит.
Я каждый день работаю с Copilot CLI на рабочем проекте, и первая мысль была "ну это просто промпты в markdown".
Если честно я так ко всем скиллам отношусь) Ну типа скептически. Но тут вроде умные дяди написали. Хуйни не посоветуют… Наверное.
В общем, решил зачекать, а не угадывать.
1️⃣ Взял задачу с кодом из своего репо — написать BenchmarkDotNet-проект для бенчмарка SimpleKeywordEmbeddingGenerator.
2️⃣ Прогнал три раза: Copilot с некорректным скиллом csharp-scripts, Copilot без скилла, Copilot с правильным скиллом.
Выбрал для теста скилл microbenchmarking. Он сам признаётся в своём файле: "у LLM известные паттерны ошибок с BenchmarkDotNet из-за устаревших данных в training data". То есть по умолчанию LLMки подсовывают старую версию и пишут некорректно бенчмарки. Вот и посмотрим как будет, подумал.
Эксперимент 1: Без скилла
Copilot написал вот такой бенчмарк:
[Benchmark(Baseline = true)]
public async Task SingleString()
{
await _generator.GenerateAsync(SingleInput); // результат выброшен
}
--job Dry прошёл без ошибок, аллокации вроде как измерялись. Но в колонке Allocated для SingleString — прочерк, 0 байт. Хотя метод явно что-то создаёт в памяти.
Причина: мы вызываем GenerateAsync, но не возвращаем результат — он просто выбрасывается. JIT видит что результат никуда не идёт, и может оптимизировать вычисление. [MemoryDiagnoser] тоже не видит аллокаций у выброшенного результата. Скилл прямо об этом предупреждает: "Return results from benchmark methods".
Эксперимент 2: Со скиллом
Тут уже агент написал правильно:
[Benchmark(Baseline = true)]
public Task<GeneratedEmbeddings<Embedding<float>>> GenerateSingle()
=> _generator.GenerateAsync(SingleInput); // результат возвращается
И сразу: GenerateSingle: 2.83 KB allocated. Данные корректные.
Ещё два момента. Во-первых, версии без скилла — написали BenchmarkDotNet Version="0.14.0", актуальная 0.15.8. Скилл говорит "используй dotnet add package без версии" — и только с правильным скиллом агент именно так и сделал.
Эксперимент 3: в котором неверный скилл все равно уменьшил потребление токенов.
Во-вторых, самая неожиданная находка: я поставил csharp-scripts скилл (который вообще для one-file скриптов, не для BDN-проектов) — и тоже получил улучшение кода с 3 из 7 до 6 из 7 критериев.
😱 И что приятно удивило — даже с неправильным скиллом message-токены упали с 14.6k до 6.8k!
То есть агент решил задачу в два раза меньшим числом итераций. Любой скилл добавляет режим "поработай аккуратнее". Но специфическую ошибку с аллокациями исправил только правильный.
🅰️ Короче, скиллы работают — НО! Но но но!
Есть момент, что нужно подбирать скиллы каждый раз!
🌭️️️️️️ Им бы написать роутер-скилл, кмк, который бы сам умел выбирать из сета. Думаю, это решило бы проблему. Но вы тоже это можете сделать и даже без коммита в основное репо. Но просто учитывайте это.
В общем, для диагностики, дебага, BDN-бенчмарков — реально помогают, там есть специфика которой нет в training data. Для остального — зависит от задачи и надо подбирать скилл.
Полный эксперимент с кодом, тремя ветками и инструкцией для воспроизведения туть. Можете все сами почекать