Как устроено решение
Агент прогнозирует почасовую выработку двух турбин ветроэлектростанции на 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 последовательных выпусков: на каждый час февраля взят самый свежий доступный прогноз — тот, что выпущен накануне. Значения — нормированная мощность, доля от номинала турбины.
Точность на честной валидации
Модель обучена на данных до 31 декабря 2025 года и проверена на январе 2026: 30 последовательных выпусков по 48 часов, каждый — по прогнозу погоды, доступному накануне. Факт погоды не использовался ни в обучении, ни в проверке.
Ошибка по турбинам и горизонтам
| Турбина | Горизонт | MAE | RMSE | nMAE |
|---|---|---|---|---|
| Турбина 1 | 24 ч | 0.1431 | 0.2015 | 14.31 % |
| Турбина 1 | 48 ч | 0.1633 | 0.2296 | 16.33 % |
| Турбина 2 | 24 ч | 0.1455 | 0.2041 | 14.55 % |
| Турбина 2 | 48 ч | 0.1666 | 0.2316 | 16.66 % |
Сравнение с эталонами
MAE на январе 2026, горизонт 24 часа, одно и то же окно из 720 часов. Чем меньше, тем лучше.
| Метод | Турбина 1 | Турбина 2 |
|---|---|---|
| Модель WindAgent | 0.1431 | 0.1455 |
| Климатология по часу суток | 0.3003 | 0.3007 |
| Константа — среднее по истории | 0.3010 | 0.3017 |
| Персистентность | 0.3568 | 0.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
get_weather48 часов прогноза на 16–17 февраля: 24 часа из выпуска за сутки, 24 из выпуска за двое суток. Ветер на 100 м от 3.4 до 7.7 м/с при среднем 5.9, температура от 0.4 до 9.6 °C. - 2
check_input_qualityВердиктok: 48 часов из 48 ожидаемых, пропусков, застрявших значений и физически невозможных величин не найдено — публикация разрешена. - 3
prepare_and_predict96 строк — 48 часов на каждую из двух турбин. Средний коэффициент использования 0.379 и 0.370, ожидаемая выработка 18.2 и 17.7 норм·ч. - 4
analyzeШтилевых, номинальных и штормовых часов нет. Расхождение с выпуском предыдущего дня на пересекающихся 24 часах: 0.164 в среднем при пороге пересчёта 0.15, максимум 0.441 →needs_recalculation: true. - 5
prepare_and_predictМодель самостоятельно пересчитала прогноз на обновлённых данных перед вызовом пересчёта. - 6
recalculateИсточник прогноза опрошен заново, буревая защита не сработала — штормовых часов нет, обнулённых строк 0. - 7
save_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 секунд. - Двадцать два автотеста за четыре секунды: часовая агрегация, сборка признаков, честность источника прогноза, выпуск агента, отбраковка неверной даты, сборка итогового ряда февраля, буревое обнуление всех компонентов прогноза, откат на детерминированный план при отказе провайдера, границы интервала и его расширение на вторые сутки, контроль качества входа на шести сценариях деградации.
- Сценарий останавливается на первой ошибке и возвращает ненулевой код, поэтому «зелёный» прогон нельзя получить на сломанном коде.
- Живая оркестрация языковой моделью — необязательный седьмой шаг: при заданном ключе выполняется, без ключа пропускается с явным сообщением.