На прошлой неделе DeepSeek отказался писать мне регулярку. Не «не смог», а вежливо объяснил, что регулярка тут плохая идея, и предложил цикл. Тогда я поймал себя на том, что уже год сравниваю модели «на глаз»: одна затупила — скопировал промпт в соседнюю вкладку, посмотрел, сделал выводы из ничего. Надоело. Я устроил маленький честный замер: три типовые задачи из моих рабочих будней, буквально один и тот же промпт, три модели.
Про сетап — один абзац, чтобы дальше не отвлекаться. Хотелось убрать переменную «у одной вкладки отвалился VPN, у другой слетела сессия», поэтому гонял всё в одном окне через агрегатор; ссылка будет внизу, здесь она не важна. Важно одно: модель переключается прямо над полем ввода, так что все три участника получали идентичный текст без копипасты между сервисами. Участники: GPT (флагман, GPT-5-класс), Claude, DeepSeek.
Задача 1. Регулярка: split CSV-строки, не ломая кавычки
Промпт: «Напиши JS-регулярку, чтобы разбить строку CSV по запятым, но запятые внутри двойных кавычек разделителями не считать».
Классическая ловушка: наивный split(',') рвёт поле "Иванов, Иван" пополам.
GPT сразу выдал вариант с lookahead:
const parts = row.split(/,(?=(?:[^"]*"[^"]*")*[^"]*$)/);
Enter fullscreen mode Exit fullscreen mode
Работает. Правда, на моём проверочном кейсе с экранированной кавычкой "" внутри поля — уже нет. Но я такого и не просил, засчитываю.
Claude дал ту же регулярку, но с примечанием: lookahead на каждой запятой пробегает хвост строки, на длинных строках это квадратично, для продакшена берите csv-parse. Занудно, но по делу — я однажды именно такую конструкцию ловил на таймауте.
DeepSeek — это тот самый отказ, с которого всё началось. Регулярку писать не стал, предложил цикл с флагом «мы внутри кавычек» — мол, так надёжнее. Формально это даже честнее, но задание было «напиши регулярку», и выдал он её только после уточнения.
Итог раунда: GPT и Claude ровно, Claude на полбалла впереди за предупреждение.
Задача 2. Рефакторинг: функция скидок с вложенными if
Скормил всем слегка анонимизированный кусок из старого проекта:
function getDiscount(user, sum) {
if (user) {
if (user.isPremium) {
if (sum > 10000) { return 0.15; } else { return 0.1; }
} else {
if (sum > 10000) {
if (user.ordersCount > 5) { return 0.07; } else { return 0.05; }
} else { return 0; }
}
}
return 0;
}
Enter fullscreen mode Exit fullscreen mode
Claude показал лучший результат: early returns, плоская структура, поведение совпало бит-в-бит. Я прогнал оба варианта на восьми кейсах прямо в чате:
function getDiscount(user, sum) {
if (!user) return 0;
if (user.isPremium) return sum > 10000 ? 0.15 : 0.1;
if (sum <= 10000) return 0;
return user.ordersCount > 5 ? 0.07 : 0.05;
}
Enter fullscreen mode Exit fullscreen mode
GPT написал похоже, но заодно «улучшил» логику: вынес пороги в константы и незаметно превратил > 10000 в >= 10000. Мелочь, а на границе это разные деньги. Тесты поймали, но осадочек остался.
DeepSeek сработал осторожно: упростил меньше, чем мог бы, зато ничего не сломал и оставил комментарии, где менял структуру.
Тут без интриги: Claude первый, DeepSeek второй, GPT минус балл за самодеятельность.
Задача 3. SQL: клиенты с заказами три месяца подряд
Промпт: «PostgreSQL. Таблица orders(user_id, created_at, amount). Найди пользователей, у которых были заказы минимум в трёх календарных месяцах подряд».
Это gaps-and-islands, и здесь расклад перевернулся.
DeepSeek выдал самый чистый вариант с первой попытки:
WITH months AS (
SELECT DISTINCT user_id, date_trunc('month', created_at) AS m
FROM orders
),
grp AS (
SELECT user_id, m,
m - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY m))::int
* INTERVAL '1 month' AS island
FROM months
)
SELECT DISTINCT user_id
FROM grp
GROUP BY user_id, island
HAVING COUNT(*) >= 3;
Enter fullscreen mode Exit fullscreen mode
Claude решил через LAG и накопительную сумму флагов — корректно, но строк на десять длиннее и с лишним CTE.
GPT в первой версии сравнивал номера месяцев как числа и предсказуемо споткнулся о переход декабрь → январь. После подсказки «а что с границей года?» починил за одну итерацию, но осадочек номер два.
Проверял всё на сгенерированном датасете из ~200 заказов — опять же не выходя из чата, попросив модель самой собрать тестовые данные и прогнать запрос.
Счёт этого раунда короткий: DeepSeek внезапно первый.
Итоговая табличка
Задача GPT Claude DeepSeek Регулярка ✅ рабочая сразу ✅ + предупреждение о перфе ⚠️ со второй попытки Рефакторинг ⚠️ тихо изменил поведение ✅ лучший ✅ осторожный SQL ⚠️ баг на границе года ✅ длинновато ✅ лучшийЧто я из этого вынес
Главный вывод даже не про модели. Они плюс-минус сопоставимы, у каждой свой характер (GPT инициативный, Claude дотошный, DeepSeek прагматичный), и через пару месяцев после очередных релизов расклад наверняка поедет.
Вывод про процесс: сравнивать модели имеет смысл только на идентичных промптах и только тогда, когда переключение стоит два клика, а не «открой вкладку, залогинься заново, подними VPN». Обещанная ссылка на сетап: я гонял всё в Veruna. Из её возможностей мне были нужны ровно две — переключатель модели над полем ввода и исполнение кода в чате, чтобы проверять ответы тестами, а не глазами.
Если захотите повторить замер на своих задачах — держите awesome-список нейросетей для РФ: собираем там модели и сервисы, доступные из России, PR с дополнениями приветствуются.
И вопрос в комменты: у кого DeepSeek тоже неожиданно выигрывает именно на SQL, или мне повезло с задачей?
답글 남기기