Допустим мы хотим протестировать какую-то гипотезу. Хочется сделать это быстро и понять стоит ли исследовать это направление дальше.

Раньше надо было изучить предметную область, написать минимальный код. Это довольно долго, часы или даже дни. Вообще, написание кода мне обычно нравилось, но в глубине души я осознавал, что человек не должен кодить. Он хочет оперировать идеями. А всякие детали и мелочи - должен делать кто-то другой.

Не поймите меня неправильно. Я писал много кода (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:

  • детерменированные - надо производную, не ищут глобальный максимум. Не очень.

  • стохастические и эволюционные - это интересно, пытаются найти глобальный максимум, плавно меняем время вычислений на близость к глобальному максимуму.

  • байесовские - быстро снижается эффективность с ростом количества аргументов функции. Для нашего кейса подходило.

В итоге решили так: основной этап -

  1. Optuna (TPE, байесовский) - основной поиск, находит регион глобального максимума.

  2. Powell из scipy - локально улучшает найденную точку.

Результаты такие:

Best Optuna value: 119.80705025628615
After Powell refine: Value: 137.1159496781634

Ниже несколько интересных итоговых визуализаций.
делаем 80 шагов поиска
делаем 80 шагов поиска
всего переменных 10, это визуализация по двум первым (x0, x1)
всего переменных 10, это визуализация по двум первым (x0, x1)
не уверен, что это вообще законно) но хотелось сразу все 10 переменных видеть. Применил PCA и взял две самые сильные компоненты. По этому сделали 2D график
не уверен, что это вообще законно) но хотелось сразу все 10 переменных видеть. Применил PCA и взял две самые сильные компоненты. По этому сделали 2D график
3D график по двум PCA компонентам
3D график по двум PCA компонентам

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)


  1. avshkol
    12.05.2025 20:11

    Ваша статья - прямо-таки вызов утверждению "Нейросети - отупляют"...


    1. Grigory_T Автор
      12.05.2025 20:11

      Есть такое)

      Вообще есть некоторый эффект расслабления с ними. И тут важно активно мотивированно узнавать новое и учиться, тогда они станут инструментом и помогут. Если отключить голову - действительно будут отуплять.
      Всй как с любым мощным инструментом, можно во благо, можно во вред


  1. Proscrito
    12.05.2025 20:11

    "Допустим мы хотим протестировать какую-то гипотезу." - встречал высказывание, с которым очень согласен: "Современное программирование это постоянная проверка гипотез.". И строго говоря, далеко не только программирование. Гипотетико-дедуктивный метод это основа научного подхода, в котором гипотезы - краеугольный камень. Так что без всяких "допустим" ) Мы безусловно постоянно этого хотим )

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


    1. Grigory_T Автор
      12.05.2025 20:11

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

      Если сравнивать нейросети VS калькуляторы, электричество, ДВГ и т.д. Всё таки есть ощущение, что нейросети имеют какой то иной по масштабу потенциал... Посмотрим. Про роль человека я до сих пор не знаю, как она будет выглядеть в будущем. Копи-пастить код и вайбкодить явно развлечение только на ближайшие годы.


      1. avshkol
        12.05.2025 20:11

        Этот иной масштаб потенциала в том, что нейросеть позволяет создать помощника, заменяющего человека невысокой квалификации (джуна , подмастерье почти в любой профессии, требующей умственного труда) - но при условии, что вы готовы взять на себя функции такого микроменеджера, терпеливо раздавать, проверять и уточнять задания.


        1. Grigory_T Автор
          12.05.2025 20:11

          не совсем, в задаче "Математика из telegram" нейросеть заменила мне скорее научного консультанта и преподавателя по линалу


        1. Grigory_T Автор
          12.05.2025 20:11

          Именно относительно создания прототипов/драфтов - удобно, что и микроменеджмента нет. Можно быстро проверять свои идеи. Да, некоторые моменты нейросеть сделает по-своему, но это обычно не критично


  1. duke_alba
    12.05.2025 20:11

    Спасибо за статью! Появился стимул таки- слазить в ИИ.