Предыдущие посты серии:
1. Документация по промптам.
2. Выбор нейронок.
3. Подготовка к разработке.
4. Оптимизация кода.
✅ Вы часто забываете, что:
1. Нейронки врут.
2. Они уверенны в своей лжи, потому что всего лишь предсказывают следующий символ, не более того.
3. Они запрограммированы ублажать и хвалить вас, если не дано иных инструкций.
4. Они будут врать вам, пока вы не попросите вас унизить.
✅ Поэтому пишем в любой промпт:
— Не соглашайся со мной.
— Мне не нужно, чтобы ты ублажал меня лестью.
— Критикуй меня.
— Подвергай сомнению всё сказанное мной.
— Процеди все мои слова через сито здравого смысла.
— Укажи мне на явные ошибки.
— Укажи явно, почему это ошибки.
— Перечисли более оптимальные решения.
— Укажи явно, почему они оптимальнее.
— Используй наилучшее из них.
✅ Возвращаемся на шаг назад, объясняем нейронке, что происходило в предыдущем запросе (модуле кода), к которому вы обращаетесь в источнике текущего запроса (модуля) и во всех остальных запросах, на которые ссылаетесь.
Если перечислить только названия списков, таблиц и прочих объектов, нейронка может не понять, что за чем следует, и что делать с каждым из них.
✅ Описываем нейронке:
— Сколько строк в источнике (лучше сразу говорите — сотни тысяч, и нужно оптимизировать код под производительность на больших объёмах данных).
— Если в источнике таблица — сколько в ней столбцов. Прочитать 2 столбца не то же самое, что прочитать 100. Передать 2 столбца дальше по пайплайну из 100 шагов кода не то же самое, что передать 100.
— Какие поля нужно обработать и как.
— Какие поля нужно передать дальше по пайплайну.
— Зачем они вам нужны, что вы с ними собираетесь делать дальше.
— Какие поля удалить.
— Что отфильтровать и как.
— Что отфильтровать для промежуточной обработки — чтобы вхолостую не обрабатывать строки, где нет нужных вам данных, а потом лишь сцепить по вертикали две части массива.
— Как параметризировать условия фильтрации, группировки, сортировки.
✅ В несколько итераций в нескольких нейронках одновременно:
— Вставляем каждый модуль кода и просим проанализировать и переписать его точно таким же промптом, как в предыдущем посте («Big O» нотация).
— Добиваемся корректно работающего кода.
— Замеряем скорость обработки данных:
а) До — старым кодом.
б) После — новым.
✅ Описываем нейронке, в каком виде находятся данные в предыдущих модулях:
— Что делает предыдущий модуль.
— Его код.
— Пишете:
1. Проанализируй оба модуля.
2. Найди узкие горлышки, замедляющие общую обработку.
3. Найди места, где можно добавить буферизацию.
4. Используй функции с наименьшим из возможного количества вычислений из «Big O» нотации.
5. Объедини запросы и ускорь выполнение.
✅ Если в исходных данных находится таблица (что для специалистов по контекстной рекламе наиболее вероятно), которую нужно отфильтровать большим списком условий, добавляем в промпт:
1. Перепиши часть кода с фильтрацией данных самым быстрым из возможных способов.
2. Буферизуй список, который нужно отфильтровать.
3. Не используй функции, которые вызывают создание множества промежуточных таблиц в памяти.
4. Не используй функции, которые копируют из итерации в итерацию исходную таблицу или исходный столбец множество раз.
5. По возможности используй функции, которые вызывают количество вычислений O(1), O(log n), O(n), O(n + m), но как можно меньшее из них на сотнях тысяч строк данных, а не квадратичные или экспоненциальные вычисления.
✅ После генерации кода по выше указанному промпту переспрашиваем:
1. Является ли это самым быстрым из возможных решений?
2. А что, если строк в массиве будет миллион?
3. Убедись в том, что ты написал алгоритм, использующий наименьшее из возможного количества вычислений O(1), O(log n), O(n), O(n + m) под производительность на больших объёмах данных.
4. Оцени теоретически возможный минимум количества вычислений для максимально быстрого выполнения задачи в этом коде.
5. Оптимизируй код самым производительным из возможных способов.
О минимизации количества вычислений — в следующем посте.
via @ppc_bigbrain
