Допустим мы хотим протестировать какую-то гипотезу. Хочется сделать это быстро и понять стоит ли исследовать это направление дальше.
Раньше надо было изучить предметную область, написать минимальный код. Это довольно долго, часы или даже дни. Вообще, написание кода мне обычно нравилось, но в глубине души я осознавал, что человек не должен кодить. Он хочет оперировать идеями. А всякие детали и мелочи - должен делать кто-то другой.
Не поймите меня неправильно. Я писал много кода (python) и знаю кучу мелких деталей, например, что такое замыкание (closure); что байты обычно хранятся в little-indian формате; или что конкретно делает np.ascontiguousarray (переводит в "C-like" построчное хранение в памяти).
ИИ меняет правила игры. Сейчас на проверку гипотезы может уйти 10 или 60 минут. И я имею ввиду довольно сложные гипотезы.
Ниже мы рассмотрим несколько таких случаев из моих хобби-проектов.
Суммарное количество строк кода, которые я написал - примерно 0 шт.
Промтов написано много. Копи-пастов сделано еще больше.
Получена куча позитивных эмоций от познания нового)
1. Кто лучше рисует графы? (потратил ~1 час)
Часто требуется рисовать портреты графов. Возникла идея быстро отрисовать сложный граф в разных библиотеках и посмотреть на качество. Без ИИ это долго, я бы не стал делать. А так пару промтов и всё готово.
Граф сгенерирован случайно, но довольно сложно. Семь функций генерации случайных графов из networkx, далее, добавление случайных мостов между ними.
Результаты ниже. Визуализацию я никак не улучшал, она "из коробки".
graphviz - обычно хорошо для DAG, иерархий. Десятки вершин и ребер, с надписями. Т.е. это ближе к блок-схеме, чем к математическому графу.

networkx - хорош, когда много ребер. Отражает общую структуру графа, без деталей. Ну и там куча алгоритмов рядом, что удобно.

plotly 2D - похож на networkx. Особенно интересен режим 3D, думаю если допилить можно интересные графы рисовать!


pyvis - интересно, что можно двигать вершины и JavaScript отрабатывает физику. Ниже просто скриншот. В .html формате интереснее. Этот вариант лучше, если нужна интерактивность и Вау-эффект от перетаскивания вершин)
2. Математика из telegram (~3 часа)
В одном из каналов задались вопросом:
"Надо написать программу разложения произвольной матрицы 2d трансформации на серию трансформаций перемещения, поворота и масштабирования. Обрати внимание, что можно использовать только эти три вида трансформаций."
Само по себе решение находится довольно быстро, ниже кратко (A = T*R1*S*R2):

Потом появилось желание это визуализировать. В чате обсуждали html, JS. Но я то знаю, что математику рисует Manim Community. Решил набросать репозиторий и сделать видео (да, именно видео).
Тут видео не загружается, поэтому ссылка на пост в телеграм тут.
Скриншот видео

3. Питон, змейка и RL (3-5 часов)
Вдруг пришла мысль натренировать змейку (snake), чтобы она сама искала яблоки. Нейросети сказали, что надо в RL (reinforcement learning). Хотелось сделать всё по-честному:
код сам не пишу.
змейка учиться на своих ошибках.
потом визуально смотрим на все это.
Сначала сделал общую архитектуру с openai о3, Параллельно изучил процесс обучения DQN (Deep Q Learning) нейросети, интересный подход, раньше такого не встречал. Сильно отличается от трансформеров, сверток и обычных MLP слоёв. Интересно.
Далее windsurf сделал репозиторий и визуализацию. Сначала matplotlib, а потом деплой через netlify. Учил 1000 шагов. В целом удивило, что змейка уже что-то может. Но видно, что это её предел, чтобы усложнять стратегии, надо существенно изменять архитектуру.
Адрес деплоя тут (хостинг netlify, интегрирован с windsurf). Увлекательное зрелище). Вообще интересно, что сам деплой занял ровно 40 минут (а там перенос нейросети из Python в JS).
4. Очередь в кафе (~4-8 часов)
Родилась идея симулировать очередь в кафе. Простой случай. Два продавца, одна кофе машина.
Опять же архитектура создавалась с openai о3. Обсудили с ним распределения всякие, решили так:
Экспоненциальное распределение для интервалов между приходами клиентов (классика).
Нормальное распределение для времени приёма заказа кассиром (с усечением ±3σ).
Треугольное распределение для времени варки кофе.
В итоге получилась такая визуализация. Вообще она динамическая, на tkinter. Кофемашина была узким местом)

Вся статистика по симуляции в виде отчета (тестовый запуск, поэтому цифры условные)
================================================================================ CAFE QUEUE SIMULATION REPORT
Report generated: 2025-05-02 13:22:10
Configuration:
• arrival_rate : 1.0 customers/min
• order_time : Normal(μ=0.1 min, σ=0.01 min), truncated ±3σ
• brew_time : Triangular(a=0.1 min, b=0.1 min, c=0.1 min)
• queue_policy : shortest
• sim_time : 2
• warm_up_time : 0.5 min
• replications : 2
• random_seed : 42
TIME-BASED METRICS (over 2 replications, 95% CI) Metric Mean (min) StdDev (min) 95% CI
Wait Times:
Average wait cashier 1 0.00 0.00 [0.00, 0.00]
Average wait cashier 2 0.00 0.00 [0.00, 0.00]
Average wait at machine 0.00 0.00 [0.00, 0.00]
Service Times:
Average system time 0.12 0.00 [0.12, 0.12]
DIMENSIONLESS METRICS (over 2 replications, 95% CI) Metric Mean StdDev 95% CI
Queue and Utilization:
Average queue length (Lq) 0.48 0.00 [0.48, 0.48]
Cashier 1 utilization 0.04 0.00 [0.04, 0.04]
Cashier 2 utilization 0.00 0.00 [0.00, 0.00]
Machine utilization 0.04 0.00 [0.04, 0.04]
Throughput:
Total customers served 1.00 0.00 [1.00, 1.00] (customers)
NOTES • Все времена — в минутах. • CI строятся по t-распределению: ±t₀.₉₇₅·s/√n. • «Total customers served» — это суммарное количество клиентов, завершивших покупку после периода прогрева. • Большая ширина CI для времени ожидания у кофемашины обусловлена высокой дисперсией при λ ≈ μ. Для сужения интервала рекомендуется запустить ≥ 30 репликаций или увеличить горизонт моделирования. • Дисбаланс в утилизации касс (0.30 vs 0.10) объясняется политикой «shortest queue first». Для более равномерной нагрузки рекомендуется увеличить busy_weight или использовать политику round-robin.
5. Удобная разметка для текста (15 минут)
Возникла идея, можно ли быстро сделать интерактивную разметку для текста. Чтобы человеку было удобно выбирать слова.
Тут с одного промта. Всё гладко и приятно. Работало с первого раза. На React. Осталось только добавить сохранение выбранных вариантов, возможность возврата. И MVP готов.

6. Максимизация функции (3-5 часа)
Идея - максимизировать функцию. Функцией может быть что угодно, даже модель в Excel (входы -> выход).
Вообще эта область сложная, зависит от функции. Я исходил из черного ящика (нет производной и функция не гладкая, т.е. ничего про неё не знаем). Цель - найти максимум.
Основное время было потрачено на openai Deep Research, понял что основных методов 3:
детерменированные - надо производную, не ищут глобальный максимум. Не очень.
стохастические и эволюционные - это интересно, пытаются найти глобальный максимум, плавно меняем время вычислений на близость к глобальному максимуму.
байесовские - быстро снижается эффективность с ростом количества аргументов функции. Для нашего кейса подходило.
В итоге решили так: основной этап -
Optuna (TPE, байесовский) - основной поиск, находит регион глобального максимума.
Powell из scipy - локально улучшает найденную точку.
Результаты такие:
Best Optuna value: 119.80705025628615
After Powell refine: Value: 137.1159496781634
Ниже несколько интересных итоговых визуализаций.




7. Генерация тестовых данных
Зачастую, у нас нет тестовых данных. А для проверки идей они нужны.
Иногда мы создаем искусственные функции, чтобы генерировать данные. Обычно, их качество достаточно для тестов. Например, когда я максимизировал функцию, у меня не было самой функции. Надо было что-то изобрести. Нейросети тут здорово выручают.
strange_excel_like_func - эмулируем поведение среднестатистического Excel)
def strange_excel_like_func(params: Dict[str, Union[float, str]]) -> float:
# Извлекаем параметры
x = np.array([params[f"x{i}"] for i in range(10)])
cat0 = params["cat0"]
cat1 = params["cat1"]
# Категориальные штрафы и бонусы
cat_bonus = 0
if cat0 == "A":
cat_bonus += np.sin(np.sum(x[:5]))
elif cat0 == "B":
cat_bonus -= np.cos(np.sum(x[5:]))
else:
cat_bonus += np.tanh(np.sum(x))
if cat1 == "B":
cat_bonus += np.sign(np.sum(x[:3] - x[3:6]))
elif cat1 == "C":
cat_bonus -= np.abs(np.sum(x[7:]))
# Ступеньки и случайности
step = np.sum(np.floor(x / 3))
noise = random.uniform(-2, 2) * (1 + (cat0 == cat1))
weird = np.sum(np.sin(x) * np.cos(x[::-1]))
jumps = np.sum((x > 5) * 10) - np.sum((x < -5) * 7)
parity = np.sum((x.astype(int) % 2 == 0) * 2 - 1)
# Финальный результат
result = 20 + cat_bonus + step + noise + weird + jumps + parity
# Иногда делаем совсем странные выбросы
if (cat0 == "C" and cat1 == "A") and (np.sum(x) > 30):
result -= 50
if (cat0 == "B" and cat1 == "B") and (np.sum(x) < -10):
result += 40
return result
В других случаях надо прямо написать немного тестовых объектов. Опять же, отлично выручают нейросети. Когда я тестировал идею про удобную разметку для текста, просто попросил выдать 10 абзацев.
Примеры случайных русских абзацев
// Примеры случайных русских абзацев
const paragraphs = [
'В лесу росла высокая сосна, вокруг которой часто собирались птицы и белки.',
'Утром на берегу реки было тихо, только изредка слышался плеск воды.',
'Маленький мальчик с интересом рассматривал разноцветные камушки на дороге.',
'Весенний дождь стучал по крышам домов, принося свежесть и прохладу.',
'В парке гуляли люди, наслаждаясь тёплым солнечным днём и ароматом цветов.',
'Старый кот лениво лежал на подоконнике, наблюдая за проходящими мимо машинами.',
'На кухне пахло свежеиспечённым хлебом и горячим чаем с мятой.',
'Вечером семья собралась за большим столом, чтобы вместе поужинать и поговорить.',
'Огромное облако проплывало по небу, меняя свои очертания на глазах у детей.',
'Девочка читала интересную книгу, забыв обо всём на свете.'
];
Выводы
Проверять идеи стало не только быстро, но и приятно. Ощущаешь, что просто раздаешь задачи и организуешь работу нескольких человек нейросетей (cursor, windsurf и т.п.). Проверяешь их работу, советуешь как им продолжать. Новые эмоции)
Всё это драматически упрощает написание прототипов (черновиков). Особенно на python.
Интересным эффектом является то, что человеку достаётся теперь только сложная работа - архитектура/математика/статистика. Это тоже можно делать с нейросетями (o3, gemini 2.5 pro и т.д.), но, всё-равно, ключевые концепции должны быть в голове у человека.
И вот это уже сложная интересная аналитическая работа!
Подписывайтесь на мой канал telegram
Комментарии (8)
Proscrito
12.05.2025 20:11"Допустим мы хотим протестировать какую-то гипотезу." - встречал высказывание, с которым очень согласен: "Современное программирование это постоянная проверка гипотез.". И строго говоря, далеко не только программирование. Гипотетико-дедуктивный метод это основа научного подхода, в котором гипотезы - краеугольный камень. Так что без всяких "допустим" ) Мы безусловно постоянно этого хотим )
Калькуляторы не уничтожили сословие математиков, будем надеяться и нейросети не отобьют желание мыслить, а лишь расширят горизонты. Хотя, конечно, вероятность имеется. Технологический прогресс, протекает стремительно и останавливаться не собирается, а физиология наша особо не менялась с верхнего палеолита. Апгрейд бы не помешал, иначе не исключено создание инструмента, который превзойдет нас интеллектуально. Однажды.Grigory_T Автор
12.05.2025 20:11Согласен, самые интересные моменты начинаются после слов: "а давайте проверим...", "а что если...", "ну а предположим, что ...", и после этих слов любопытства, начинается проверка самых интересных и порой безумных идей :)
Если сравнивать нейросети VS калькуляторы, электричество, ДВГ и т.д. Всё таки есть ощущение, что нейросети имеют какой то иной по масштабу потенциал... Посмотрим. Про роль человека я до сих пор не знаю, как она будет выглядеть в будущем. Копи-пастить код и вайбкодить явно развлечение только на ближайшие годы.avshkol
12.05.2025 20:11Этот иной масштаб потенциала в том, что нейросеть позволяет создать помощника, заменяющего человека невысокой квалификации (джуна , подмастерье почти в любой профессии, требующей умственного труда) - но при условии, что вы готовы взять на себя функции такого микроменеджера, терпеливо раздавать, проверять и уточнять задания.
Grigory_T Автор
12.05.2025 20:11не совсем, в задаче "Математика из telegram" нейросеть заменила мне скорее научного консультанта и преподавателя по линалу
Grigory_T Автор
12.05.2025 20:11Именно относительно создания прототипов/драфтов - удобно, что и микроменеджмента нет. Можно быстро проверять свои идеи. Да, некоторые моменты нейросеть сделает по-своему, но это обычно не критично
avshkol
Ваша статья - прямо-таки вызов утверждению "Нейросети - отупляют"...
Grigory_T Автор
Есть такое)
Вообще есть некоторый эффект расслабления с ними. И тут важно активно мотивированно узнавать новое и учиться, тогда они станут инструментом и помогут. Если отключить голову - действительно будут отуплять.
Всй как с любым мощным инструментом, можно во благо, можно во вред