WindAgentпрогноз выработки ВЭС
HackAlem AI 2026 · трек «Энергетика» · кейс Самрук-Казына

Как устроено решение

Агент прогнозирует почасовую выработку двух турбин ветроэлектростанции на 24–48 часов вперёд, используя только тот прогноз погоды, который был доступен на момент выпуска. Команда Technokod.

  • Горизонт 24–48 ч, шаг 1 час
  • Тест: февраль 2026, 30 выпусков
  • nMAE 14.31 % на сутки
  • Оркестрация через function calling

Задача и решение

Две турбины стоят в 400 метрах друг от друга в Шелекском ветровом коридоре Алматинской области. Требуется почасовой прогноз их выработки на 24–48 часов вперёд для суточной заявки на рынок и планирования резервов.

Ключевое требование кейса: для каждой даты выпуска разрешено использовать только тот прогноз погоды, который был доступен именно на этот момент, а не фактические значения, ставшие известными позже. Решение берёт архивные выпуски прогноза Open-Meteo Previous Runs: часы 1–24 горизонта из прогноза, выпущенного за сутки, часы 25–48 — из выпущенного за двое суток.

Агент проходит полный цикл на каждую дату: получает прогноз погоды, готовит признаки, запускает модель выработки, анализирует результат, сравнивает его с предыдущим выпуском и пересчитывает прогноз, если входные данные обновились. Порядок вызова инструментов выбирает языковая модель через function calling; без ключа провайдера тот же цикл выполняет детерминированный планировщик, поэтому числовой результат не зависит от доступности внешнего сервиса.

Открыть дашборд диспетчера → — там любой из 30 выпусков февраля с коридором неопределённости, трассой решений агента и сводкой для заявки.

Прогноз на февраль 2026

Результат 30 последовательных выпусков: на каждый час февраля взят самый свежий доступный прогноз — тот, что выпущен накануне. Значения — нормированная мощность, доля от номинала турбины.

турбина 1 турбина 2

Точность на честной валидации

Модель обучена на данных до 31 декабря 2025 года и проверена на январе 2026: 30 последовательных выпусков по 48 часов, каждый — по прогнозу погоды, доступному накануне. Факт погоды не использовался ни в обучении, ни в проверке.

nMAE, горизонт 24 ч
14.31 %
турбина 1; турбина 2 — 14.55 %
nMAE, горизонт 48 ч
16.33 %
турбина 1; турбина 2 — 16.66 %
Покрытие P10–P90
79.4 %
на сутки; на двое суток — 79.7 %
Лучше персистентности
58–60 %
по MAE, горизонт 24 ч

Ошибка по турбинам и горизонтам

ТурбинаГоризонтMAERMSEnMAE
Турбина 124 ч0.14310.201514.31 %
Турбина 148 ч0.16330.229616.33 %
Турбина 224 ч0.14550.204114.55 %
Турбина 248 ч0.16660.231616.66 %

Сравнение с эталонами

MAE на январе 2026, горизонт 24 часа, одно и то же окно из 720 часов. Чем меньше, тем лучше.

МетодТурбина 1Турбина 2
Модель WindAgent0.14310.1455
Климатология по часу суток0.30030.3007
Константа — среднее по истории0.30100.3017
Персистентность0.35680.3463

Модель точнее персистентности на 58–60 % и климатологии на 52 %.

Как работает агент

Шесть инструментов, между которыми агент выбирает сам. Каждый выпуск сохраняет журнал с полной трассой вызовов — по нему любое решение агента можно разобрать постфактум.

  • get_weatherАрхивный прогноз погоды, доступный на дату выпуска
  • check_input_qualityКонтроль входных данных: пропуски, застрявший датчик, неполный горизонт, физически невозможные значения. При вердикте fail выпуск не публикуется
  • prepare_and_predictПризнаки и расчёт выработки по обеим турбинам
  • analyzeШтиль, номинал, шторм, расхождение с прошлым выпуском
  • recalculateПовторный расчёт и буревая защита турбины
  • save_forecastЗапись выпуска и журнала действий

Реальная трасса выпуска от 15 февраля 2026

Журнал outputs/agent_logs_llm/2026-02-15.json, режим с живой оркестрацией: порядок инструментов выбрала модель.

  1. 1get_weather
    48 часов прогноза на 16–17 февраля: 24 часа из выпуска за сутки, 24 из выпуска за двое суток. Ветер на 100 м от 3.4 до 7.7 м/с при среднем 5.9, температура от 0.4 до 9.6 °C.
  2. 2check_input_quality
    Вердикт ok: 48 часов из 48 ожидаемых, пропусков, застрявших значений и физически невозможных величин не найдено — публикация разрешена.
  3. 3prepare_and_predict
    96 строк — 48 часов на каждую из двух турбин. Средний коэффициент использования 0.379 и 0.370, ожидаемая выработка 18.2 и 17.7 норм·ч.
  4. 4analyze
    Штилевых, номинальных и штормовых часов нет. Расхождение с выпуском предыдущего дня на пересекающихся 24 часах: 0.164 в среднем при пороге пересчёта 0.15, максимум 0.441 → needs_recalculation: true.
  5. 5prepare_and_predict
    Модель самостоятельно пересчитала прогноз на обновлённых данных перед вызовом пересчёта.
  6. 6recalculate
    Источник прогноза опрошен заново, буревая защита не сработала — штормовых часов нет, обнулённых строк 0.
  7. 7save_forecast
    Выпуск сохранён: outputs/forecasts/2026-02-15.csv, 96 строк.
«Прогноз выпущен на 48 часов для турбин 1 и 2. Ожидаемая выработка: турбина 1 — 18.2 нормо-часа, турбина 2 — 17.7 нормо-часа; средний коэффициент использования — 0.379 и 0.370 соответственно. Рисков штиля и шторма по анализу не выявлено, номинальных часов тоже нет. Относительно прошлого выпуска входные данные заметно изменились, поэтому потребовался пересчёт; после пересчёта буревая защита не сработала.»

Заключение записано языковой моделью и сохранено в журнале выпуска дословно. За весь тестовый период агент выполнил пересчёт в четырёх выпусках из 30: 6, 15, 21 и 24 февраля.

Проверяемость

Решение проверяется на чужой машине без сети и без ключей: кэш архивных прогнозов погоды лежит в репозитории.

  • Контрольный сценарий одной командой: bash scripts/demo.sh или powershell scripts/demo.ps1. На обученных моделях проходит за 20–30 секунд, на чистом клоне — 38 секунд вместе с обучением, из них само обучение 14 секунд.
  • Двадцать два автотеста за четыре секунды: часовая агрегация, сборка признаков, честность источника прогноза, выпуск агента, отбраковка неверной даты, сборка итогового ряда февраля, буревое обнуление всех компонентов прогноза, откат на детерминированный план при отказе провайдера, границы интервала и его расширение на вторые сутки, контроль качества входа на шести сценариях деградации.
  • Сценарий останавливается на первой ошибке и возвращает ненулевой код, поэтому «зелёный» прогон нельзя получить на сломанном коде.
  • Живая оркестрация языковой моделью — необязательный седьмой шаг: при заданном ключе выполняется, без ключа пропускается с явным сообщением.
Развёрнутого промышленного сервиса у решения нет, и эти страницы им не являются: они показывают результат работы агента на тестовом периоде. Исполняемое решение запускается из репозитория — интерфейс командной строки и HTTP-сервис на FastAPI описаны в README.