Почему ChatGPT галлюцинирует и как это исправить
Каждый разработчик сталкивался с ситуацией, когда ChatGPT выдаёт код с несуществующими библиотеками, неправильным синтаксисом или логическими ошибками. Причина — в отсутствии контекста и чётких ограничений. Промт-инжиниринг решает эту проблему: правильно сформулированный запрос заставляет модель работать как опытный тимлид, который проверяет код, следует стандартам и не выдумывает лишнего.
В этой подборке — 10 проверенных промтов для Python, TypeScript и SQL, которые я ежедневно использую в работе. Они помогают генерировать код без галлюцинаций, ускорять рефакторинг и писать сложные запросы. Все примеры реальны и протестированы на ChatGPT-4 и Claude 3.
1. Промт для генерации Python-кода с проверкой типов
Проблема: ChatGPT часто игнорирует аннотации типов и создаёт код, который падает на mypy.
Промт:
Ты — senior Python-разработчик. Напиши функцию на Python 3.10+, которая [задача]. Обязательно:
- Используй аннотации типов (typing).
- Добавь docstring в формате Google.
- Проверь код на соответствие PEP 8.
- Не используй библиотеки, которых нет в стандартной библиотеке, если не указано иное.
- Приведи пример вызова и ожидаемый результат.
Пример: генерация функции для парсинга CSV с валидацией.
Результат:
from typing import List, Dict
import csv
def parse_csv(file_path: str) -> List[Dict[str, str]]:
"""Читает CSV-файл и возвращает список словарей.
Args:
file_path: Путь к CSV-файлу.
Returns:
Список словарей, где ключи — заголовки столбцов.
Raises:
FileNotFoundError: Если файл не найден.
"""
with open(file_path, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
return [row for row in reader]
2. Промт для TypeScript: строгая типизация без any
Проблема: ChatGPT любит вставлять any, что убивает всю пользу TypeScript.
Промт:
Ты — эксперт по TypeScript. Напиши код для [задача] на TypeScript 5.0+.
Требования:
- Запрещено использовать `any`.
- Используй строгие типы (strict: true).
- Применяй generics, где это уместно.
- Добавь JSDoc с описанием параметров и возвращаемого значения.
- Покажи пример использования.
Пример: функция для фильтрации массива объектов по ключу.
Результат:
function filterByKey<T, K extends keyof T>(items: T[], key: K, value: T[K]): T[] {
return items.filter(item => item[key] === value);
}
// Пример
interface User { id: number; name: string; }
const users: User[] = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
const filtered = filterByKey(users, 'name', 'Alice'); // [{ id: 1, name: 'Alice' }]
3. Промт для SQL: оптимизация запросов
Проблема: ChatGPT пишет запросы, которые работают, но медленно.
Промт:
Ты — DBA с опытом в PostgreSQL. У меня есть запрос:
[вставить SQL]
Проанализируй его и предложи оптимизированный вариант. Учти:
- Индексы (какие добавить).
- Избегай подзапросов, если можно использовать JOIN.
- Используй EXPLAIN ANALYZE для проверки.
- Не используй несуществующие функции.
Пример: запрос с подзапросом в SELECT заменяется на JOIN, что ускоряет выполнение в разы.
4. Промт для рефакторинга legacy-кода
Проблема: старый код сложно читать и поддерживать.
Промт:
Ты — тимлид. Проведи рефакторинг следующего кода на [язык]:
[вставить код]
Цели:
- Улучшить читаемость.
- Убрать дублирование.
- Соблюсти принципы SOLID.
- Не менять поведение.
- Объясни каждое изменение.
Пример: рефакторинг функции с множеством вложенных if-else в словарь обработчиков.
5. Промт для написания unit-тестов
Проблема: тесты часто поверхностны и не покрывают edge cases.
Промт:
Напиши unit-тесты на pytest для следующей функции:
[вставить код]
Требования:
- Покрой все ветвления.
- Добавь тесты на граничные случаи (пустой ввод, None, большие числа).
- Используй параметризацию.
- Не используй внешние библиотеки, кроме pytest.
Пример: тесты для функции деления с проверкой деления на ноль.
6. Промт для генерации документации
Проблема: документация отстаёт от кода.
Промт:
Сгенерируй документацию в формате Markdown для следующего модуля:
[вставить код]
Включи:
- Описание каждого класса и функции.
- Примеры использования.
- Список зависимостей.
- Возможные ошибки и исключения.
Пример: документация для модуля работы с API.
7. Промт для перевода кода с Python на TypeScript
Проблема: ручной перевод отнимает время и вносит ошибки.
Промт:
Переведи следующий код с Python на TypeScript, сохранив логику:
[вставить код]
Учти:
- Типы данных (int -> number, str -> string).
- Асинхронность (async/await).
- Не используй any.
- Добавь комментарии о различиях.
Пример: перевод функции сортировки словаря.
8. Промт для поиска уязвимостей
Проблема: код может содержать SQL-инъекции или XSS.
Промт:
Проанализируй код на наличие уязвимостей (OWASP Top 10):
[вставить код]
Для каждой найденной уязвимости:
- Опиши риск.
- Предложи исправление.
- Покажи уязвимый и безопасный вариант.
Пример: обнаружение SQL-инъекции в запросе, собранном через f-строку.
9. Промт для генерации сложных SQL-запросов
Проблема: нужно построить отчёт с агрегацией и оконными функциями.
Промт:
Напиши SQL-запрос для [задача] на PostgreSQL.
Используй:
- CTE (WITH).
- Оконные функции (ROW_NUMBER, RANK).
- Агрегацию с GROUP BY.
- Комментарии к каждому блоку.
Пример: запрос для расчёта накопительной суммы продаж по месяцам.
10. Промт для код-ревью
Проблема: некому проверить код перед коммитом.
Промт:
Ты — строгий код-ревьюер. Проверь следующий код:
[вставить код]
Обрати внимание на:
- Соответствие стилю (PEP 8, Airbnb).
- Потенциальные баги.
- Производительность.
- Читаемость.
- Предложи улучшения.
Пример: ревью функции с неоптимальным циклом.
Как внедрить промты в ежедневную работу
Используйте эти промты как шаблоны, адаптируя под свои задачи. Сохраните их в snippets в IDE или в отдельном файле. Комбинируйте: например, сгенерируйте код, затем попросите написать тесты и провести ревью. Это экономит часы работы и снижает количество ошибок.
Помните: ChatGPT — инструмент, а не замена разработчика. Всегда проверяйте сгенерированный код, особенно в production. Начните с малого: возьмите один промт из подборки и примените на следующей задаче. Уже через неделю вы заметите, как AI стал вашим надёжным тимлидом.
Комментарии