Глава 18: Антипаттерны
Принцип
Знание типичных ошибок помогает их избежать. Каждый антипаттерн — урок из реального опыта.
Неоднозначность
Симптом
Модель интерпретирует задачу иначе, чем ожидалось.
Примеры
Антипаттерн 1: Размытая задача
Плохо:
"Напиши функцию для работы с данными"
Проблемы:
- Какие данные? (тип, формат, размер)
- Какая работа? (чтение, запись, преобразование)
- Какой результат? (тип, формат)
Хорошо:
"Напиши функцию:
- Вход: list$dict$ с ключами 'name', 'age', 'email'
- Обработка: фильтрация по age \>= 18
- Выход: list$dict$ только с отфильтрованными записями"
Антипаттерн 2: Неявный формат
Плохо:
"Проанализируй код и найди проблемы"
Проблемы:
- Какие проблемы? (безопасность, стиль, производительность)
- В каком формате ответ? (текст, список, JSON)
- Сколько проблем? (все, топ-N)
Хорошо:
"Проанализируй код.
Фокус: только уязвимости безопасности.
Формат: JSON массив
\{
'line': int,
'issue': str,
'severity': 'low' | 'medium' | 'high',
'fix': str
\}
Максимум: 10 проблем"
Антипаттерн 3: Неопределённое поведение
Плохо:
"Напиши функцию деления"
Проблемы:
- Что при делении на 0? (исключение, None, infinity)
- Какой тип результата? (int, float, Decimal)
- Округление? (если нужно)
Хорошо:
"Напиши функцию деления:
- Сигнатура: divide(a: float, b: float) -\> float | None
- При b=0: вернуть None (не исключение)
- Точность: 2 знака после запятой"
Избыточный контекст
Симптом
Модель теряется в большом объёме информации, пропускает важное.
Примеры
Антипаттерн 1: Весь код проекта
Плохо:
"Вот код проекта: $2000 строк из 20 файлов$
Найди баг в функции get\_user"
Проблемы:
- Размывание внимания
- Lost in the middle
- Расход токенов
Хорошо:
"Баг: get\_user возвращает None для существующего пользователя
Релевантный код:
\`\`\`python
\# src/repositories/user.py, строки 45-60
async def get\_user(self, user\_id: int) -\> User | None:
query = select(User).where(User.id == user\_id)
result = await self.\_session.execute(query)
return result.scalar() \# \<-- возможно, здесь
Модель User:
class User(Base):
id: int
email: str
is\_deleted: bool = False \# мягкое удаление
Вопрос: почему не находит пользователя с is_deleted=True?"
Антипаттерн 2: Ненужная история Плохо: "Проект начался в 2020 году, когда команда из 5 человек... ...и вот теперь нужно добавить кэширование"
Хорошо: "Добавь Redis кэширование в функцию get_user. TTL: 5 минут. Redis клиент: уже есть в src/core/redis.py"
Антипаттерн 3: Повторение очевидного Плохо: "Python — это язык программирования. Функции в Python определяются с помощью ключевого слова def. Напиши функцию сортировки."
Хорошо: "Напиши функцию сортировки списка словарей по ключу 'date'. Python 3.11, type hints."
\#\# Противоречивые инструкции
\#\#\# Симптом
Модель выбирает произвольно между конфликтующими требованиями.
\#\#\# Примеры
Антипаттерн 1: Взаимоисключающие требования Плохо: "Напиши короткий код с подробными комментариями"
Проблема: краткость и подробность противоречат.
Хорошо: "Напиши код.
-
Код: максимально лаконичный
-
Комментарии: только для неочевидной логики"
Или: "Напиши код с подробными комментариями. Ограничение: комментарии не более 1 строки на каждые 3 строки кода"
Антипаттерн 2: Несовместимые технологии Плохо: "Используй только стандартную библиотеку, но с pandas для данных"
Хорошо: "Используй pandas для обработки данных. Другие внешние библиотеки не использовать."
Антипаттерн 3: Конфликт приоритетов Плохо: "Оптимизируй по скорости и памяти одновременно"
Проблема: часто это trade-off.
Хорошо: "Оптимизируй код. Приоритеты (по убыванию):
-
Скорость выполнения
-
Потребление памяти
-
Читаемость
При конфликте скорость важнее памяти."
\#\# Отсутствие примеров
\#\#\# Симптом
Модель не понимает нестандартный формат или логику.
\#\#\# Примеры
Антипаттерн 1: Кастомный формат без примера Плохо: "Конвертируй задачи в мой формат тасков"
Проблема: модель не знает формат.
Хорошо: "Конвертируй задачи в формат:
Примеры: 'купить молоко' → TODO:shop:buy milk:low 'позвонить врачу завтра' → REMIND:2024-01-15:call doctor:high 'идея: новый проект' → IDEA:new project:medium
Структура: TYPE:DETAILS:PRIORITY
Задача для конвертации: 'встреча с клиентом в понедельник'"
Антипаттерн 2: Нестандартная классификация Плохо: "Классифицируй код по типу"
Проблема: какие типы?
Хорошо: "Классифицируй Python код.
Категории:
-
data: работа с данными (pandas, numpy, файлы)
-
web: веб-разработка (flask, django, fastapi)
-
ml: машинное обучение (sklearn, pytorch, tensorflow)
-
infra: инфраструктура (docker, k8s, ci/cd)
-
other: остальное
Примеры: 'import pandas as pd; df = pd.read_csv(...)' → data '@app.route('/users')' → web 'model.fit(X_train, y_train)' → ml"
Антипаттерн 3: Сложная трансформация Плохо: "Преобразуй SQL в ORM"
Хорошо: "Преобразуй SQL в SQLAlchemy ORM.
Примеры: SQL: SELECT * FROM users WHERE age > 18 ORM: session.query(User).filter(User.age > 18).all()
SQL: SELECT name, COUNT(*) FROM orders GROUP BY name ORM: session.query(Order.name, func.count()).group_by(Order.name).all()
SQL: "
\#\# Смешение задач
\#\#\# Симптом
Ответ частично выполняет каждую задачу, но ни одну полностью.
\#\#\# Примеры
Антипаттерн 1: Три задачи в одном промпте Плохо: "Напиши код, объясни его, и предложи тесты"
Проблема: модель может сделать каждое частично.
Хорошо (три промпта):
-
"Напиши функцию валидации email"
-
"Объясни логику этой функции: "
-
"Напиши pytest тесты для: "
Или (явная структура): "Выполни последовательно:
Шаг 1: Код
Шаг 2: Объяснение
Шаг 3: Тесты
"
Антипаттерн 2: Анализ + рекомендации + реализация Плохо: "Проанализируй код, предложи улучшения и реализуй их"
Хорошо (итеративно):
-
"Проанализируй код, найди проблемы"
-
-
"Реализуй исправление для проблемы X"
\#\# Неправильная роль
\#\#\# Симптом
Модель даёт ответ не того уровня или стиля.
\#\#\# Примеры
Антипаттерн 1: Конфликтующие роли Плохо: "Ты эксперт и новичок одновременно. Объясни декораторы."
Хорошо: "Ты senior Python developer. Объясни декораторы junior разработчику. Уровень: базовый, с простыми примерами."
Антипаттерн 2: Роль без контекста Плохо: "Ты code reviewer. Проверь код."
Проблема: какой фокус ревью?
Хорошо: "Ты security engineer с опытом в OWASP. Code review с фокусом на:
-
Injection vulnerabilities
-
Authentication issues
-
Data exposure
Формат: строка → проблема → fix"
Антипаттерн 3: Несоответствующая роль Плохо: "Ты поэт. Напиши SQL запрос."
Хорошо: "Ты DBA с опытом PostgreSQL. Напиши оптимизированный запрос для:
-
Таблица: 10M записей
-
Выборка: топ 100 по дате"
\#\# Игнорирование ограничений модели
\#\#\# Симптом
Запрос информации за пределами знаний модели.
\#\#\# Примеры
Антипаттерн 1: Актуальные данные Плохо: "Какой курс доллара сегодня?"
Проблема: модель не имеет актуальных данных.
Хорошо: "Напиши функцию получения курса валют через API ЦБ РФ"
Антипаттерн 2: Специфичный код проекта Плохо: "Почему наша функция calculate_discount() возвращает неверное значение?"
Проблема: модель не знает код проекта.
Хорошо: "Вот функция calculate_discount():
Вот тест-кейс:
-
Вход: price=100, discount=10
-
Ожидание: 90
-
Факт: 10
Найди ошибку."
Антипаттерн 3: Проприетарные API Плохо: "Как использовать InternalCompanyAPI?"
Хорошо: "Вот документация InternalCompanyAPI:
Напиши пример использования для задачи X."
\#\# Чеклист: избежание антипаттернов
Перед отправкой промпта:
□ Задача однозначна?
-
Одна интерпретация
-
Чёткий ожидаемый результат
□ Контекст достаточен, но не избыточен?
-
Только релевантная информация
-
Нет истории и очевидных фактов
□ Нет противоречий?
-
Требования совместимы
-
Приоритеты явные
□ Примеры есть (если нестандартная задача)?
-
2-3 примера input → output
-
Покрывают разные случаи
□ Одна задача?
- Или явно разделена на шаги
□ Роль соответствует задаче?
-
Экспертиза релевантна
-
Уровень ответа определён
□ Модель может ответить?
-
Информация в пределах знаний
-
Не требует актуальных данных