ИИ‑модели сменяют друг друга быстрее, чем новые айфоны. Теперь даже технологические гиганты предпочитают не строить модели с нуля, а брать за основу существующие решения и дообучать их под свои задачи. Вот и «Яндекс» не стал исключением: его новая модель YandexGPT-5, по сути, выросла из Qwen-2.5 — китайской нейросети, разработанной Alibaba.
Компания уверяет, что «пятый» не уступает ChatGPT-4o, а ещё — теперь умнее, логичнее, креативнее и кодит лучше предыдущих версий. Но прежде чем кивать на пресс‑релизы, давайте разберёмся: действительно ли YandexGPT-5-Pro в одной лиге с конкурентами или же это хорошая упаковка для всё того же «бота с российским паспортом»?
25 февраля 2025 года «Яндекс» представил свою новую ИИ‑модель YandexGPT-5. В дополнение к ней вышла облегчённая версия — YandexGPT-5-Lite, которую можно найти на HuggingFace.
Что под капотом YandexGPT-5? В последние годы стало ясно, что обучение языковых моделей — дело не только сложное, но и безумно дорогое. В результате многие компании предпочитают брать уже существующую открытую модель, дообучать её на своих данных и выпускать под своим брендом. Именно так поступил и «Яндекс» — его инсайдеры подтверждают, что YandexGPT-5 строился на базе китайской Qwen-2.5 потому, что та неожиданно показала лучшие результаты на русском языке, чем актуальные версии яндексовских моделей. Кстати, аналогичный подход использовал «Т‑Банк», выпустив свои T‑Lite и T‑Pro, также основанные на Qwen-2.5. Всё это значительно удешевляет процесс: вместо сотен мощных видеокарт теперь можно обойтись всего несколькими десятками (а иногда и единицами) GPU.
Что изменилось? YandexGPT-5 теперь лучше понимает не только русский, но и английский (доля англоязычных данных в датасете выросла с 14 до 30%). Хотя, как мне удалось обнаружить, модель может общаться и на других языках — неясно, почему компания акцентирует лишь на английском, ведь можно попросить её выдавать ответы и на множестве других языков. Вдобавок «Яндекс» заявляет, что обновлённый ИИ стал лучше писать код, решать логические задачи и выдавать более креативные решения.
Длина контекста осталась на уровне предыдущей, 4-й модели. Последний раз она увеличивалась в YandexGPT-4 — тогда контекст растянули с 8000 (YandexGPT-3) до 32 000 токенов. Для сравнения, другие сегодняшние модели часто имеют больший контекст: у ChatGPT-4o и DeepSeek‑r1 — 128 000 токенов, у Claude-3.7 — 200 000 токенов. Правда, в компании отмечают, что модель оперирует оптимизированным словарём токенов, благодаря чему 32 000 единиц у YandexGPT-5-Pro соответствуют 48 000 токенам модели Qwen-2.5–32-Base.
По данным «Яндекса», новая нейросеть YandexGPT-5-Pro сопоставима по качеству ответов с ChatGPT-4o и в 64% случаев превосходит китайскую Qwen‑2.5–32B‑Instruct в решении стандартных задач. В частности, она даёт более точные ответы на фактовые вопросы, лучше следует инструкциям, однако математика — её слабое место.
Если взглянуть на бенчмарки, видно, что разница между сопоставляемыми моделями не столь велика:
MMLU (тест на знания по гуманитарным и техническим дисциплинам на уровне школы и вуза) дал YandexGPT-5-Pro 83% — на одном уровне с Qwen-2.5–32B‑Instruct и всего на 3% ниже, чем у ChatGPT-4o.
MMLU PRO, проверяющий более сложные вопросы, показал 68% — снова практически идентично результатам Qwen-2.5 и 4o.
DROP RU — русскоязычная адаптация бенчмарка DROP, оценивающая способность понимать тексты и извлекать информацию, — показала у YandexGPT-5-Pro точность 63%. Это лучше, чем у Qwen (+2%), но хуже, чем у ChatGPT (-5%).
IFEval RU, тест на понимание структурированных данных на русском языке, показывает 77% — здесь YandexGPT-5-Pro даже немного обходит конкурентов.
Но вот с HUMAN EVAL, проверяющим навыки программирования, всё неоднозначно. На графике YandexGPT-5-Pro почти сравнялся с ChatGPT-4o, но, если копнуть глубже, результаты тестов показывают, что он часто выдаёт нерабочий код. Так что к программированию «пятёрка» вряд ли готова — генерируемый код работает далеко не всегда.
Всё, что нужно сделать, — это перейти на сайт «Алисы» (понадобится аккаунт в «Яндексе»). Сразу после этого в левом верхнем углу можно выбрать интересующую версию модели:
Конечно, я выбрал максимум возможностей — YandexGPT-5-Pro, чтобы по полной протестировать новую разработку компании.
Кстати, на старте, в бесплатном режиме, доступно 20 запросов в день, если хочется больше — требуется «Про»‑подписка.
Но есть и ещё несколько способов обратиться к YandexGPT-5: это мобильные приложении «Алиса» и «„Яндекс“ — с „Алисой“», «Яндекс браузер» (мобильный и десктопный), а также разные умные устройства компании.
Для разработчиков предусмотрена API‑версия, доступная в Yandex Cloud AI Studio, а также интеграция модели в Yandex SpeechSense — сервис анализа коммуникаций.
Для тестирования нейросети я подготовил несколько вопросов. Сравнивать её буду с двумя другими: это ChatGPT-4o и Qwen-2.5-72B‑Instruct.
Почему именно эти модели? Во‑первых, они тоже нерассуждающие. Кроме того, ChatGPT-4o — одна из самых популярных ИИ сегодня, да и «Яндекс» не раз сравнивал свой новый движок именно с ним, — хотелось убедиться, что это действительно так. Qwen-2.5-72B‑Instruct тоже тесно связана: YandexGPT-5-Pro, как упоминалось, построена на основе схожей версии, дистиллята Qwen-2.5–32B‑Instruct. Ну и в общем, большинство современных LLM уже рассуждающие, так что круг конкурентов сузился сам собой.
Итак, начнём. Я подготовил 7 вопросов — причём все они являются уникальными, чтобы избежать случаев, когда у модели уже теоретически могут быть готовы ответы (ведь если бы эти вопросы уже были в интернете, модель могла бы знать о них заранее).
Какие тесты прошли модели:
Составление заголовков к тексту;
Рерайт текста;
Контент‑план для телеграм‑канала зоомагазина;
Написание игры — змейка (HTML/CSS/JS);
Вторая игра — тетрис (HTML/CSS/JS);
Создание описаний к новым сериям «Офиса»;
Логико‑математическая задача: пароль от лаборатории.
Ответы приводятся скриншотами, иногда — в виде исходного кода и интерактивных веб‑страниц (CodePen).
Стоит отметить один из минусов YandexGPT-5-Pro — он немультимодален, модель не умеет анализировать изображения и документы. Поэтому все промты будут только в виде текста (несмотря на то что один из оппонентов, 4o, поддерживает мультимодальный ввод).
Придумай десять заголовков для этой статьи.
----------
Кофе — не просто напиток, а неотъемлемая часть повседневной жизни миллионов людей. От ароматного эспрессо до нежного латте, его приготовление превратилось в искусство, где технологии играют ключевую роль. За последние десятилетия кофеварки прошли путь от простых гейзерных устройств до умных гаджетов, способных подстраиваться под индивидуальные предпочтения.
От кипячения к кастомизации: краткая история кофеварок
В середине XX века первые электрические кофеварки упростили процесс заваривания, заменив ручные методы. Однако настоящая революция началась с появления капсульных систем в 90-х, которые предложили скорость и разнообразие вкусов. Сегодня рынок переживает новый виток: устройства с поддержкой вайфая, датчиками помола и мобильными приложениями позволяют не только варить кофе одним касанием экрана, но и анализировать привычки пользователей.
Экология в каждой чашке
Производители всё чаще делают ставку на устойчивое развитие: например, Nespresso внедряет перерабатываемые алюминиевые капсулы, а Bosch разрабатывает модели с пониженным энергопотреблением. Тем не менее споры вокруг одноразовых капсул продолжаются — критики отмечают, что переход на многоразовые фильтры или френч‑прессы остаётся самым экологичным выбором.
Умные технологии и будущее кофепития
Современные кофеварки, такие как Sage Oracle Touch, объединяют функции баристы и робота: они автоматически перемалывают зёрна, взбивают молоко и даже обучаются через ИИ, запоминая любимые рецепты. Тренд на персонализацию набирает обороты — уже к 2026 году ожидается рост рынка умных кофемашин на 25%. Эксперты прогнозируют интеграцию с умным домом: представьте, что ваше устройство начинает готовить капучино, как только вы отключаете будильник на смартфоне.
Заключение
Кофеварки перестали быть просто кухонной техникой, превратившись в символ баланса между традицией и инновациями. Они экономят время, снижают нагрузку на природу и дарят свободу экспериментов — будь то редкий сорт из Эфиопии или авторский рецепт с корицей. Какой будет следующая глава в этой эволюции? Пока ясно одно: утро начинается не с кофе, а с технологии, которая его готовит.
Что тут можно сказать? Ответы YandexGPT-5-Pro кажутся более современными и соответствующими тому, что принято называть инфостилем. Не менее чем половина ответов нейросетей‑оппонентов выглядят более консервативно, и их скорее можно встретить в печатных газетах, чем современных интернет‑изданиях.
YandexGPT-5-Pro: ★★★★★
ChatGPT-4o: ★★★★☆
Qwen-2.5-72B‑Instruct: ★★★★☆
В релизах YandexGPT не раз подчёркивалось, что эта модель лучше адаптирована для русскоязычных контекстов. Кроме того, как мы увидели в результатах бенчмарка DROP RU, текущая модель примерно соответствует уровню Qwen-2.5–32B‑Instruct и ChatGPT-4o. Давайте убедимся во всём этом в задаче на переписывание рекламного текста.
Задание немного необычное — оно предполагает рерайт текста от лица рекламируемого товара. Я не указывал, насколько рерайт должен соответствовать оригиналу, поэтому посмотрим, как модели интерпретировали запрос.
Перепиши этот рекламный текст от лица лампы.
----------
Умная лампа «Люминова-Про» — это революция в освещении для дома и офиса. Благодаря технологии Adaptive Spectral Sync, устройство автоматически подстраивает цветовую температуру (от 1800 K до 6500 K) под ваш циркадный ритм, улучшая качество сна.
Ключевые особенности:
• Энергоэффективность — потребляет на 60% меньше энергии, чем аналоги, с сертификатом EnergyStar++.
• Голосовое управление — полная совместимость с голосовыми помощниками.
• Экодизайн — корпус из переработанного алюминия и биоразлагаемая упаковка.
• Режимы освещения — «Фокус», «Релакс» и «Кинотеатр», с точностью цветопередачи 98% (CRI).
• Мобильное приложение — персонализация через нейросеть, анализирующую ваши привычки.Для кого это?
Идеально для дизайнеров, работающих из дома, родителей, заботящихся о здоровье детей, и экоэнтузиастов. В комплекте — пожизненная гарантия и бесплатная замена при любом заводском браке.
Философия бренда: освещение должно не просто работать, а улучшать качество жизни, не жертвуя планетой.
На первый взгляд, ответ YandexGPT-5-Pro кажется более динамичным и современным, но, если присмотреться, он примерно на одном уровне с ChatGPT-4o — разница лишь в стиле подачи; один немного живее, другой формальнее, но оба справились на твёрдую четвёрку. А вот Qwen-2.5-72B‑Instruct заметно слабее: встречаются штампы, речевые шероховатости и в целом текст выглядит менее естественным.
YandexGPT-5-Pro: ★★★★☆
ChatGPT-4o: ★★★★☆
Qwen-2.5-72B‑Instruct: ★★★☆☆
Ты специалист по контент‑маркетингу. Составь подробный контент‑план (с описаниями) для телеграм‑канала зоомагазина.
Оба фаворита, YandexGPT-5-Pro и ChatGPT-4o, предложили детальные и разноплановые контент‑стратегии, охватывая не только продуктовые посты, но и интерактивные форматы, причём их подходы местами сильно различаются (несмотря на значительную длину, предполагающую бо́льшую вероятность повторений). Qwen-2.5-72B‑Instruct тоже справился неплохо, но его план менее креативен.
YandexGPT-5-Pro: ★★★★★
ChatGPT-4o: ★★★★★
Qwen-2.5-72B‑Instruct: ★★★★☆
Хотя, по заверениям «Яндекса», новый YandexGPT-5-Pro гораздо лучше справляется с написанием кода, тем не менее многие пользователи заявляют, что ничего не изменилось и она пишет код «всё так же плохо», как прошлая версия (привет, жестокий мир). Кто же на самом деле прав и как дела обстоят в действительности?
Напиши веб‑версию игры: змейка (на HTML+CSS+JavaScript, одним HTML‑файлом). Для управления применяются клавиши‑стрелки, а также WASD.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Змейка</title>
<style>
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: #222;
}
#game-container {
width: 400px;
height: 400px;
display: grid;
grid-template-columns: repeat(20, 1fr);
grid-template-rows: repeat(20, 1fr);
border: 2px solid #333;
box-shadow: 0 0 10px #000;
}
.snake-part {
background: #0f0;
border-radius: 4px;
}
.food {
background: #f00;
border-radius: 50%;
}
.score-board {
position: absolute;
top: 10px;
left: 10px;
color: #fff;
font-family: Arial, sans-serif;
font-size: 16px;
}
</style>
</head>
<body>
<div id="game-container"></div>
<div>
<p>Счет: <span id="score">0</span></p>
<p>Уровень: <span id="level">1</span></p>
</div>
<script>
const gameContainer = document.getElementById('game-container');
let snake = [{ x: 10, y: 10 }];
let dx = 1,
dy = 0;
let food = getRandomPosition();
let score = 0;
let level = 1;
let intervalId;
function startGame() {
createSnake();
createFood();
intervalId = setInterval(move, 1000 / level);
document.addEventListener('keydown', handleKeyPress);
}
function createSnake() {
snake.forEach(segment => {
const snakePart = document.createElement('div');
snakePart.classList.add('snake-part');
snakePart.style.gridRow = segment.y + 1;
snakePart.style.gridColumn = segment.x + 1;
gameContainer.appendChild(snakePart);
});
}
function createFood() {
const foodElement = document.createElement('div');
foodElement.classList.add('food');
foodElement.style.gridRow = food.y + 1;
foodElement.style.gridColumn = food.x + 1;
gameContainer.appendChild(foodElement);
}
function move() {
const head = { x: snake[0].x + dx, y: snake[0].y + dy };
// Проверка на столкновение с собой
if (snake.some(segment => segment.x === head.x && segment.y === head.y)) {
gameOver();
return;
}
// Проверка на выход за границы
if (head.x < 0 || head.x >= 20 || head.y < 0 || head.y >= 20) {
gameOver();
return;
}
snake.unshift(head);
// Если съели еду
if (head.x === food.x && head.y === food.y) {
food = getRandomPosition();
score++;
updateScore();
if (score % 5 === 0) {
level++;
clearInterval(intervalId);
intervalId = setInterval(move, 1000 / level);
}
createFood();
} else {
snake.pop();
const lastSegment = snake[snake.length - 1];
const lastElement = gameContainer.lastChild;
gameContainer.removeChild(lastElement);
}
}
// Продолжаем с места, где код был обрезан
// Обновление позиции змеи
const snakeElements = Array.from(gameContainer.children);
snakeElements.forEach((element, index) => {
element.style.gridRow = snake[index].y + 1;
element.style.gridColumn = snake[index].x + 1;
});
// Функция получения случайной позиции
function getRandomPosition() {
return {
x: Math.floor(Math.random() * 20),
y: Math.floor(Math.random() * 20)
};
}
// Обработка нажатий клавиш
function handleKeyPress(event) {
const key = event.key;
if (key === 'ArrowRight' || key === 'd') {
dx = 1;
dy = 0;
} else if (key === 'ArrowLeft' || key === 'a') {
dx = -1;
dy = 0;
} else if (key === 'ArrowUp' || key === 'w') {
dx = 0;
dy = -1;
} else if (key === 'ArrowDown' || key === 's') {
dx = 0;
dy = 1;
}
}
// Обновление счета
function updateScore() {
document.getElementById('score').textContent = score;
document.getElementById('level').textContent = level;
}
// Обработка проигрыша
function gameOver() {
clearInterval(intervalId);
alert('Игра окончена! Ваш счет: ' + score);
// Сброс игры
snake = [{ x: 10, y: 10 }];
dx = 1;
dy = 0;
food = getRandomPosition();
score = 0;
level = 1;
// Очистка игрового поля
while (gameContainer.firstChild) {
gameContainer.removeChild(gameContainer.firstChild);
}
// Перезапуск игры
startGame();
}
// Инициализация игры
snake = [{ x: 10, y: 10 }];
startGame();
// Конец скрипта
</script>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Змейка</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
canvas {
background-color: #000;
}
</style>
</head>
<body>
<canvas id="gameCanvas" width="400" height="400"></canvas>
<script>
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const gridSize = 20;
const tileCount = canvas.width / gridSize;
let snake = [{ x: 10, y: 10 }];
let direction = { x: 0, y: 0 };
let food = { x: 15, y: 15 };
let score = 0;
function drawGame() {
clearCanvas();
drawSnake();
drawFood();
moveSnake();
checkCollision();
drawScore();
}
function clearCanvas() {
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
function drawSnake() {
ctx.fillStyle = 'lime';
snake.forEach(segment => {
ctx.fillRect(segment.x * gridSize, segment.y * gridSize, gridSize, gridSize);
});
}
function drawFood() {
ctx.fillStyle = 'red';
ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize);
}
function moveSnake() {
const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y };
snake.unshift(head);
if (head.x === food.x && head.y === food.y) {
score += 10;
placeFood();
} else {
snake.pop();
}
}
function placeFood() {
food.x = Math.floor(Math.random() * tileCount);
food.y = Math.floor(Math.random() * tileCount);
}
function checkCollision() {
const head = snake[0];
if (head.x < 0 || head.x >= tileCount || head.y < 0 || head.y >= tileCount) {
resetGame();
}
for (let i = 1; i < snake.length; i++) {
if (head.x === snake[i].x && head.y === snake[i].y) {
resetGame();
}
}
}
function drawScore() {
ctx.fillStyle = 'white';
ctx.font = '20px Arial';
ctx.fillText(`Score: ${score}`, 10, 20);
}
function resetGame() {
snake = [{ x: 10, y: 10 }];
direction = { x: 0, y: 0 };
score = 0;
placeFood();
}
function changeDirection(event) {
const keyPressed = event.key;
const LEFT = 37;
const UP = 38;
const RIGHT = 39;
const DOWN = 40;
if (keyPressed === 'ArrowUp' || keyPressed === 'w' || event.keyCode === UP) {
if (direction.y === 0) {
direction = { x: 0, y: -1 };
}
} else if (keyPressed === 'ArrowDown' || keyPressed === 's' || event.keyCode === DOWN) {
if (direction.y === 0) {
direction = { x: 0, y: 1 };
}
} else if (keyPressed === 'ArrowLeft' || keyPressed === 'a' || event.keyCode === LEFT) {
if (direction.x === 0) {
direction = { x: -1, y: 0 };
}
} else if (keyPressed === 'ArrowRight' || keyPressed === 'd' || event.keyCode === RIGHT) {
if (direction.x === 0) {
direction = { x: 1, y: 0 };
}
}
}
document.addEventListener('keydown', changeDirection);
setInterval(drawGame, 100);
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Змейка</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
canvas {
background-color: #000;
}
</style>
</head>
<body>
<canvas id="gameCanvas" width="400" height="400"></canvas>
<script>
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const gridSize = 20;
const tileCount = canvas.width / gridSize;
let snake = [{ x: 10, y: 10 }];
let direction = { x: 0, y: 0 };
let food = { x: 15, y: 15 };
let score = 0;
function drawGame() {
clearCanvas();
drawSnake();
drawFood();
moveSnake();
checkCollision();
drawScore();
}
function clearCanvas() {
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
function drawSnake() {
ctx.fillStyle = 'lime';
snake.forEach(segment => {
ctx.fillRect(segment.x * gridSize, segment.y * gridSize, gridSize, gridSize);
});
}
function drawFood() {
ctx.fillStyle = 'red';
ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize);
}
function moveSnake() {
const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y };
snake.unshift(head);
if (head.x === food.x && head.y === food.y) {
score += 10;
placeFood();
} else {
snake.pop();
}
}
function placeFood() {
food.x = Math.floor(Math.random() * tileCount);
food.y = Math.floor(Math.random() * tileCount);
}
function checkCollision() {
const head = snake[0];
if (head.x < 0 || head.x >= tileCount || head.y < 0 || head.y >= tileCount) {
resetGame();
}
for (let i = 1; i < snake.length; i++) {
if (head.x === snake[i].x && head.y === snake[i].y) {
resetGame();
}
}
}
function drawScore() {
ctx.fillStyle = 'white';
ctx.font = '20px Arial';
ctx.fillText(`Score: ${score}`, 10, 20);
}
function resetGame() {
snake = [{ x: 10, y: 10 }];
direction = { x: 0, y: 0 };
score = 0;
placeFood();
}
function changeDirection(event) {
const keyPressed = event.key;
const LEFT = 37;
const UP = 38;
const RIGHT = 39;
const DOWN = 40;
if (keyPressed === 'ArrowUp' || keyPressed === 'w' || event.keyCode === UP) {
if (direction.y === 0) {
direction = { x: 0, y: -1 };
}
} else if (keyPressed === 'ArrowDown' || keyPressed === 's' || event.keyCode === DOWN) {
if (direction.y === 0) {
direction = { x: 0, y: 1 };
}
} else if (keyPressed === 'ArrowLeft' || keyPressed === 'a' || event.keyCode === LEFT) {
if (direction.x === 0) {
direction = { x: -1, y: 0 };
}
} else if (keyPressed === 'ArrowRight' || keyPressed === 'd' || event.keyCode === RIGHT) {
if (direction.x === 0) {
direction = { x: 1, y: 0 };
}
}
}
document.addEventListener('keydown', changeDirection);
setInterval(drawGame, 100);
</script>
</body>
</html>
Итак, начнём с неутешительного результата YandexGPT-5-Pro… в котором игра попросту не запускается. Каждый матч тут выглядит идентично: появляется зародыш змейки, один‑два фрукта, затем они поочерёдно исчезают, а спустя пару секунд всплывает торжественное «Игра окончена! Ваш счёт: 0» (я закомментил эту строку на CodePen, так как алерт выводится в верхнеуровневом окне, прямо на «Хабре»). К слову, сама модель иногда честно признаётся: «Я пока не эксперт в программировании, но постараюсь помочь» — видимо, стоит воспринимать это буквально.
Кстати, исходный код в интерфейсе YandexGPT-5-Pro не имеет подсветки, а ешё его нельзя скопировать одной кнопкой (нужно выделять вручную). Вообще говоря, эти моменты довольно‑таки несложны с точки зрения реализации, поэтому их я бы исправил в первую очередь, например привинтив в черновом режиме какую‑нибудь веб‑библиотеку для автоопределения и автоподсветки кода. Например, в ChatGPT так и сделано — язык определяется на ходу (и иногда это выглядит кривовато, но лучше, чем ничего).
Минус‑два: количество токенов, выводимых за одно сообщение, очень ограничено. При этом здесь даже не появилось сообщения о продолжении — текст исходного кода просто обрубался после вывода энного количества токенов. Повезло, что можно попросить нейросеть продолжить вывод (например, написав «Сообщение обрезалось, продолжи»), именно так я и поступил.
Теперь к оппонентам. Их результаты примерно схожи, немного различаются дизайном (цветами и присутствием индикатора счёта), но из‑за различия в обработке значений event.key
/event.keyCode
Qwen-2.5-72B‑Instruct поддерживает ввод WASD только при английской раскладке, в то время как в версии ChatGPT-4o он не зависит от языка. Поэтому генерации от 4o большой плюсик в виде дополнительного балла.
В общем, в очередной раз делаем вывод, что без режима рассуждений сегодня LLM‑моделям в программировании делать уже нечего, от слова «совсем». Ждём YandexGPT-6, скрестив пальцы.
YandexGPT-5-Pro: ★☆☆☆☆
ChatGPT-4o: ★★★★★
Qwen-2.5-72B‑Instruct: ★★★★☆
Напиши веб‑версию игры: тетрис (на HTML+CSS+JavaScript, одним HTML‑файлом). Для управления применяются клавиши‑стрелки и WASD, для поворота фигуры — пробел.
<!DOCTYPE html>
<html>
<head>
<title>Тетрис</title>
<style>
body {
margin: 0;
padding: 0;
background-color: #222;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.game-container {
width: 300px;
height: 600px;
background-color: #000;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border: 4px solid #fff;
border-radius: 10px;
position: relative;
}
.game-board {
width: 300px;
height: 600px;
display: grid;
grid-template-columns: repeat(10, 30px);
grid-template-rows: repeat(20, 30px);
gap: 1px;
background-color: #333;
}
.cell {
width: 30px;
height: 30px;
background-color: #fff;
border-radius: 4px;
}
.score-board {
margin-bottom: 20px;
color: #fff;
font-family: Arial, sans-serif;
font-size: 24px;
}
.game-over-screen {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #fff;
font-family: Arial, sans-serif;
font-size: 36px;
text-align: center;
display: none;
}
.game-over-screen.active {
display: flex;
}
</style>
</head>
<body>
<div>
<div>
<p>Счет: <span id="score">0</span></p>
<p>Уровень: <span id="level">1</span></p>
</div>
<div></div>
<div>
<h1>Игра окончена!</h1>
<p>Ваш счет: <span id="final-score"></span></p>
<button onclick="restartGame()">Начать заново</button>
</div>
</div>
<script>
// Настройки игры
const BOARD_WIDTH = 10;
const BOARD_HEIGHT = 20;
const CELL_SIZE = 30;
const SHAPE_SIZE = 4;
let score = 0;
let level = 1;
let dropInterval = 1000;
let gameOver = false;
// Фигуры
const shapes = [
[
[1, 1, 1, 1],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
],
[
[1, 1],
[1, 1]
],
[
[1, 1, 1],
[0, 1, 0],
[0, 0, 0]
],
[
[0, 1, 1],
[1, 1, 0],
[0, 0, 0]
],
[
[1, 1, 0],
[0, 1, 1],
[0, 0, 0]
],
// Продолжение массива фигур
[
0, 1, 1,
1, 1, 0,
0, 0, 0
],
[
1, 0, 0,
1, 1, 1,
0, 0, 0
],
[
0, 0, 1,
1, 1, 1,
0, 0, 0
]
];
// Массив цветов для фигур
const colors = [
'#4D90FE',
'#FF6B6B',
'#FFD166',
'#48CFAD',
'#3F51B5',
'#E67E22',
'#ECF0F1'
];
// Создаем игровое поле
let board = [];
for (let y = 0; y < BOARD_HEIGHT; y++) {
board[y] = [];
for (let x = 0; x < BOARD_WIDTH; x++) {
board[y][x] = 0;
}
}
// Текущая фигура
let currentShape = {
shape: null,
x: 0,
y: 0,
color: null
};
// Создаем DOM элементы
const gameBoard = document.querySelector('.game-board');
const scoreDisplay = document.getElementById('score');
const levelDisplay = document.getElementById('level');
const finalScoreDisplay = document.getElementById('final-score');
// Инициализация
function init() {
// Создаем ячейки
for (let y = 0; y < BOARD_HEIGHT; y++) {
for (let x = 0; x < BOARD_WIDTH; x++) {
const cell = document.createElement('div');
cell.classList.add('cell');
gameBoard.appendChild(cell);
}
}
// Запускаем новую фигуру
dropInterval = 1000;
gameOver = false;
score = 0;
level = 1;
updateScore();
updateLevel();
newShape();
setInterval(moveDown, dropInterval);
}
// Обновление счета
function updateScore() {
scoreDisplay.textContent = score;
}
// Обновление уровня
function updateLevel() {
levelDisplay.textContent = level;
}
// Создание новой фигуры
function newShape() {
const random = Math.floor(Math.random() * shapes.length);
currentShape = {
shape: shapes[random],
x: (BOARD_WIDTH / 2) - (SHAPE_SIZE / 2),
y: 0,
color: colors[random]
};
// Проверяем, не началась ли игра с проигрышем
if (checkCollision(0, 0, currentShape.shape)) {
gameOver = true;
document.querySelector('.game-over-screen').classList.add('active');
finalScoreDisplay.textContent = score;
clearInterval(dropInterval);
}
}
// Проверка столкновений
function checkCollision(x, y, shape) {
for (let y0 = 0; y0 < SHAPE_SIZE; y0++) {
for (let x0 = 0; x0 < SHAPE_SIZE; x0++) {
const cy = y + y0;
const cx = x + x0;
if (shape[y0][x0]) {
if (cy >= BOARD_HEIGHT || cx >= BOARD_WIDTH || cx < 0 || board[cy][cx]) {
return true;
}
}
}
}
return false;
}
// Очистка строки
function clearLine(y) {
for (let i = y; i > 0; i--) {
board[i] = board[i - 1];
}
board[0] = board[0].map(() => 0);
}
// Проверка и очистка полных строк
function checkLines() {
let lines = 0;
for (let y = BOARD_HEIGHT - 1; y >= 0; y--) {
let complete = true;
for (let x = 0; x < BOARD_WIDTH; x++) {
if (!board[y][x]) {
complete = false;
break;
}
}
if (complete) {
clearLine(y);
lines++;
}
}
if (lines > 0) {
score += lines * 100;
updateScore();
// Продолжение функции checkLines
level = Math.floor(score / 100) + 1;
updateLevel();
// Обновляем скорость падения
dropInterval = 1000 - (level * 50);
clearInterval(dropInterval);
setInterval(moveDown, dropInterval);
}
// Отрисовка фигуры
function drawShape(shape, x, y, color) {
for (let y0 = 0; y0 < SHAPE_SIZE; y0++) {
for (let x0 = 0; x0 < SHAPE_SIZE; x0++) {
if (shapey0x0) {
const cell = getCell(x + x0, y + y0);
cell.style.backgroundColor = color;
}
}
}
}
// Очистка фигуры
function clearShape(shape, x, y) {
for (let y0 = 0; y0 < SHAPE_SIZE; y0++) {
for (let x0 = 0; x0 < SHAPE_SIZE; x0++) {
if (shapey0x0) {
const cell = getCell(x + x0, y + y0);
cell.style.backgroundColor = '#fff';
}
}
}
}
// Получение ячейки по координатам
function getCell(x, y) {
return gameBoard.children[y * BOARD_WIDTH + x];
}
// Поворот фигуры
function rotateShape(shape) {
const newShape = ;
for (let y = 0; y < SHAPE_SIZE; y++) {
newShapey = ;
for (let x = 0; x < SHAPE_SIZE; x++) {
newShapeyx = shapeSHAPE_SIZE - 1 - x;
}
}
return newShape;
}
// Движение фигуры вниз
function moveDown() {
if (!gameOver) {
if (!checkCollision(currentShape.x, currentShape.y + 1, currentShape.shape)) {
clearShape(currentShape.shape, currentShape.x, currentShape.y);
currentShape.y++;
drawShape(currentShape.shape, currentShape.x, currentShape.y, currentShape.color);
} else {
// Зафиксируем фигуру на поле
for (let y = 0; y < SHAPE_SIZE; y++) {
for (let x = 0; x < SHAPE_SIZE; x++) {
if (currentShape.shapeyx) {
boardcurrentShape.y + ycurrentShape.x + x = currentShape.color;
}
}
}
// Проверяем полные строки
checkLines();
// Создаем новую фигуру
newShape();
}
}
}
// Обработка клавиш
document.addEventListener('keydown', (event) => {
if (!gameOver) {
const key = event.key;
const move = {
'ArrowLeft': -1,
'ArrowRight': 1,
'a': -1,
'd': 1
};
switch (key) {
case 'ArrowDown':
case 's':
moveDown();
break;
case 'ArrowLeft':
case 'a':
case 'ArrowRight':
case 'd':
if (!checkCollision(currentShape.x + movekey, currentShape.y, currentShape.shape)) {
clearShape(currentShape.shape, currentShape.x, currentShape.y);
currentShape.x += movekey;
drawShape(currentShape.shape, currentShape.x, currentShape.y, currentShape.color);
}
break;
case ' ':
case 'w':
const newShape = rotateShape(currentShape.shape);
if (!checkCollision(currentShape.x, currentShape.y, newShape)) {
clearShape(currentShape.shape, currentShape.x, currentShape.y);
currentShape.shape = newShape;
drawShape(currentShape.shape, currentShape.x, currentShape.y, currentShape.color);
}
break;
}
}
});
// Перезапуск игры
function restartGame() {
document.querySelector('.game-over-screen').classList.remove('active');
init();
}
// Запуск игры
init();
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tetris</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f0f0f0;
margin: 0;
}
canvas {
background-color: #fff;
border: 2px solid #333;
}
</style>
</head>
<body>
<canvas id="tetris" width="240" height="400"></canvas>
<script>
const canvas = document.getElementById('tetris');
const context = canvas.getContext('2d');
context.scale(20, 20);
const matrix = [
[0, 0, 0],
[1, 1, 1],
[0, 1, 0],
];
function createMatrix(w, h) {
const matrix = [];
while (h--) {
matrix.push(new Array(w).fill(0));
}
return matrix;
}
function drawMatrix(matrix, offset) {
matrix.forEach((row, y) => {
row.forEach((value, x) => {
if (value !== 0) {
context.fillStyle = 'red';
context.fillRect(x + offset.x, y + offset.y, 1, 1);
}
});
});
}
function draw() {
context.clearRect(0, 0, canvas.width, canvas.height);
drawMatrix(arena, { x: 0, y: 0 });
drawMatrix(player.matrix, player.pos);
}
function merge(arena, player) {
player.matrix.forEach((row, y) => {
row.forEach((value, x) => {
if (value !== 0) {
arena[y + player.pos.y][x + player.pos.x] = value;
}
});
});
}
function rotate(matrix, dir) {
for (let y = 0; y < matrix.length; ++y) {
for (let x = 0; x < y; ++x) {
[
matrix[x][y],
matrix[y][x],
] = [
matrix[y][x],
matrix[x][y],
];
}
}
if (dir > 0) {
matrix.forEach(row => row.reverse());
} else {
matrix.reverse();
}
}
function collide(arena, player) {
const [m, o] = [player.matrix, player.pos];
for (let y = 0; y < m.length; ++y) {
for (let x = 0; x < m[y].length; ++x) {
if (m[y][x] !== 0 &&
(arena[y + o.y] &&
arena[y + o.y][x + o.x]) !== 0) {
return true;
}
}
}
return false;
}
function playerDrop() {
player.pos.y++;
if (collide(arena, player)) {
player.pos.y--;
merge(arena, player);
playerReset();
arenaSweep();
}
dropCounter = 0;
}
function playerMove(dir) {
player.pos.x += dir;
if (collide(arena, player)) {
player.pos.x -= dir;
}
}
function playerReset() {
const pieces = 'ILJOTSZ';
player.matrix = createPiece(pieces[Math.floor(Math.random() * pieces.length)]);
player.pos.y = 0;
player.pos.x = (arena[0].length / 2 | 0) -
(player.matrix[0].length / 2 | 0);
if (collide(arena, player)) {
arena.forEach(row => row.fill(0));
}
}
function createPiece(type) {
if (type === 'T') {
return [
[0, 0, 0],
[1, 1, 1],
[0, 1, 0],
];
} else if (type === 'O') {
return [
[1, 1],
[1, 1],
];
} else if (type === 'L') {
return [
[0, 1, 0],
[0, 1, 0],
[0, 1, 1],
];
} else if (type === 'J') {
return [
[0, 1, 0],
[0, 1, 0],
[1, 1, 0],
];
} else if (type === 'I') {
return [
[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 0, 0],
];
} else if (type === 'S') {
return [
[0, 1, 1],
[1, 1, 0],
[0, 0, 0],
];
} else if (type === 'Z') {
return [
[1, 1, 0],
[0, 1, 1],
[0, 0, 0],
];
}
}
function arenaSweep() {
outer: for (let y = arena.length - 1; y > 0; --y) {
for (let x = 0; x < arena[y].length; ++x) {
if (arena[y][x] === 0) {
continue outer;
}
}
const row = arena.splice(y, 1)[0].fill(0);
arena.unshift(row);
++y;
}
}
let dropCounter = 0;
let dropInterval = 1000;
let lastTime = 0;
function update(time = 0) {
const deltaTime = time - lastTime;
lastTime = time;
dropCounter += deltaTime;
if (dropCounter > dropInterval) {
playerDrop();
}
draw();
requestAnimationFrame(update);
}
const arena = createMatrix(12, 20);
const player = {
pos: { x: 0, y: 0 },
matrix: null,
};
document.addEventListener('keydown', event => {
if (event.keyCode === 37 || event.keyCode === 65) {
playerMove(-1);
} else if (event.keyCode === 39 || event.keyCode === 68) {
playerMove(1);
} else if (event.keyCode === 40 || event.keyCode === 83) {
playerDrop();
} else if (event.keyCode === 32) {
rotate(player.matrix, 1);
while (collide(arena, player)) {
player.pos.x++;
}
}
});
playerReset();
update();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Тетрис</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #000;
}
canvas {
border: 1px solid #fff;
}
</style>
</head>
<body>
<canvas id="tetris" width="300" height="600"></canvas>
<script>
const canvas = document.getElementById('tetris');
const context = canvas.getContext('2d');
const ROW = 20;
const COL = 10;
const SQ = 30;
const VACANT = 'black';
const COLORS = [
'red', 'blue', 'green', 'yellow', 'purple', 'cyan', 'orange'
];
let board = [];
for (let row = 0; row < ROW; row++) {
board[row] = [];
for (let col = 0; col < COL; col++) {
board[row][col] = VACANT;
}
}
function drawBoard() {
for (let row = 0; row < ROW; row++) {
for (let col = 0; col < COL; col++) {
context.fillStyle = board[row][col];
context.fillRect(col * SQ, row * SQ, SQ, SQ);
}
}
}
const PIECES = [
[Z, 'red'],
[S, 'blue'],
[T, 'green'],
[O, 'yellow'],
[L, 'purple'],
[I, 'cyan'],
[J, 'orange']
];
const Z = [
[0, 0, 0],
[1, 1, 0],
[0, 1, 1]
];
const S = [
[0, 0, 0],
[0, 1, 1],
[1, 1, 0]
];
const T = [
[0, 0, 0],
[1, 1, 1],
[0, 1, 0]
];
const O = [
[0, 0, 0],
[0, 1, 1],
[0, 1, 1]
];
const L = [
[0, 0, 0],
[1, 1, 1],
[1, 0, 0]
];
const I = [
[0, 0, 0, 0],
[1, 1, 1, 1],
[0, 0, 0, 0],
[0, 0, 0, 0]
];
const J = [
[0, 0, 0],
[1, 1, 1],
[0, 0, 1]
];
let pIndex = 0;
let score = 0;
let piece = new Piece(PIECES[pIndex][0], PIECES[pIndex][1]);
function Piece(tetromino, color) {
this.tetromino = tetromino;
this.color = color;
this.tetrominoN = 0;
this.activeTetromino = this.tetromino[this.tetrominoN];
this.x = 3;
this.y = -2;
}
Piece.prototype.fill = function(color) {
for (let row = 0; row < this.activeTetromino.length; row++) {
for (let col = 0; col < this.activeTetromino[row].length; col++) {
if (this.activeTetromino[row][col]) {
context.fillStyle = color;
context.fillRect(this.x + col, this.y + row, 1, 1);
}
}
}
};
Piece.prototype.draw = function() {
this.fill(this.color);
};
Piece.prototype.unDraw = function() {
this.fill(VACANT);
};
Piece.prototype.moveDown = function() {
if (!this.collision(0, 1, this.activeTetromino)) {
this.unDraw();
this.y++;
this.draw();
} else {
this.lock();
pIndex = (pIndex + 1) % PIECES.length;
piece = new Piece(PIECES[pIndex][0], PIECES[pIndex][1]);
}
};
Piece.prototype.moveRight = function() {
if (!this.collision(1, 0, this.activeTetromino)) {
this.unDraw();
this.x++;
this.draw();
}
};
Piece.prototype.moveLeft = function() {
if (!this.collision(-1, 0, this.activeTetromino)) {
this.unDraw();
this.x--;
this.draw();
}
};
Piece.prototype.rotate = function() {
let nextPattern = this.tetromino[(this.tetrominoN + 1) % this.tetromino.length];
let kick = 0;
if (this.collision(0, 0, nextPattern)) {
if (this.x > COL / 2) {
kick = -1;
} else {
kick = 1;
}
}
if (!this.collision(kick, 0, nextPattern)) {
this.unDraw();
this.x += kick;
this.tetrominoN = (this.tetrominoN + 1) % this.tetromino.length;
this.activeTetromino = this.tetromino[this.tetrominoN];
this.draw();
}
};
Piece.prototype.collision = function(x, y, piece) {
for (let row = 0; row < piece.length; row++) {
for (let col = 0; col < piece[row].length; col++) {
if (!piece[row][col]) {
continue;
}
let newX = this.x + col + x;
let newY = this.y + row + y;
if (newX < 0 || newX >= COL || newY >= ROW) {
return true;
}
if (newY < 0) {
continue;
}
if (board[newY][newX] !== VACANT) {
return true;
}
}
}
return false;
};
Piece.prototype.lock = function() {
for (let row = 0; row < this.activeTetromino.length; row++) {
for (let col = 0; col < this.activeTetromino[row].length; col++) {
if (!this.activeTetromino[row][col]) {
continue;
}
if (this.y + row <= 0) {
alert('Game Over');
gameOver = true;
break;
}
board[this.y + row][this.x + col] = this.color;
}
}
for (let row = ROW - 1; row >= 0;) {
let isFull = true;
for (let col = 0; col < COL; col++) {
isFull = isFull && (board[row][col] !== VACANT);
}
if (isFull) {
for (let y = row; y > 1; y--) {
for (let col = 0; col < COL; col++) {
board[y][col] = board[y - 1][col];
}
}
for (let col = 0; col < COL; col++) {
board[0][col] = VACANT;
}
score += 10;
} else {
row--;
}
}
drawBoard();
drawNext();
};
function drawNext() {
let nextPiece = new Piece(PIECES[(pIndex + 1) % PIECES.length][0], PIECES[(pIndex + 1) % PIECES.length][1]);
context.fillStyle = 'white';
context.fillRect(330, 10, 100, 100);
nextPiece.draw();
}
function control(e) {
if (e.keyCode === 37) {
piece.moveLeft();
} else if (e.keyCode === 39) {
piece.moveRight();
} else if (e.keyCode === 38) {
piece.rotate();
} else if (e.keyCode === 40) {
piece.moveDown();
} else if (e.key === 'w' || e.key === 'W') {
piece.moveUp();
} else if (e.key === 's' || e.key === 'S') {
piece.moveDown();
} else if (e.key === 'a' || e.key === 'A') {
piece.moveLeft();
} else if (e.key === 'd' || e.key === 'D') {
piece.moveRight();
} else if (e.key === ' ') {
piece.rotate();
}
}
document.addEventListener('keydown', control);
function drop() {
piece.moveDown();
draw();
if (!gameOver) {
requestAnimationFrame(drop);
}
}
function draw() {
context.clearRect(0, 0, canvas.width, canvas.height);
drawBoard();
piece.draw();
}
draw();
drop();
</script>
</body>
</html>
Здесь запустилась только версия ChatGPT-4o. В ней всё хорошо: она правильно обрабатывает падение фигур, стирает заполненные ряды, а также поддерживает ускоренное опускание клавишей «Вниз» (что особенно приятно, ведь написать об этом в промте я позабыл).
Версия YandexGPT-5-Pro не завелась по ряду причин. Если в подробностях (благодарю ChatGPT‑o3-mini‑high за ускоренный разбор ошибок):
Первые пять фигур переданы как двумерные массивы, а следующие (как раз с того момента, где модель продолжила вывод) — как одномерные. В результате код падает, например, при обращении shape[y0][x0]
в функции checkCollision()
, так как запрашивается несуществующий элемент.
Используется константа SHAPE_SIZE = 4
, хотя некоторые фигуры (например, квадрат 2×2) имеют другой размер. Это приводит к тому, что циклы перебора всегда идут от 0 до 3, что может как выйти за пределы массива, так и пропустить часть фигуры.
Переменная dropInterval
изначально содержит число в миллисекундах, передаваемое в setInterval(moveDown, dropInterval)
, однако затем её используют в качестве идентификатора таймера для последующего вызова clearInterval(dropInterval)
. Кроме того, каждый раз при смене уровня создаётся новый интервал, не очищая предыдущий, что может привести к одновременному выполнению нескольких таймеров.
Плюс несколько других ошибок, например if(shapey0x0)
вместо if(shape[y0] && shape[y0][x0])
.
И напоследок, особенно понравились «строки сомнения» const newShape = ;
и newShapey = ;
, — где константе присваивается «ничего» (а также переменная объявляется в глобальном контексте window
).
Сгенерированная через Qwen-2.5-72B‑Instruct тоже не запустилась, но ошибки были другими:
В массиве PIECES
используются переменные Z
, S
, T
, O
, L
, I
, J
, хотя они ещё не определены — их объявление находится ниже.
В функции control()
предусмотрено условие для клавиши W, однако в прототипе Piece отсутствует реализация метода moveUp
.
В методе Piece.prototype.lock()
при обнаружении ситуации «Game over» делается присвоение, но переменная gameOver
не была ранее объявлена. Аналогичная проблема при проверке if(!gameOver)
в функции drop()
.
Функция drawNext()
пытается нарисовать следующую фигуру в области, заданной координатами (330, 10) и размерами 100×100, но ширина канвы составляет 300 пикселей, поэтому область находится за её пределами.
Ищете нейромодели, заточенные под программирование? В нашем агрегаторе нейросетей BotHub есть рассуждающие Claude-3.7 и o3-mini‑high, доступные без ВПН.
Здесь оценки очевидны:
YandexGPT-5-Pro: ★☆☆☆☆
ChatGPT-4o: ★★★★★
Qwen-2.5-72B‑Instruct: ★☆☆☆☆
Придумай сюжеты‑описания для новых 10 серий сериала «Офис» («The office», 2005–2013).
Оценивать креативные задания, как всегда, непросто, и всё же здесь ответы ChatGPT и YandexGPT чуть более креативные, чем у Qwen: их идеи выглядят ярче, лучше передают настроение оригинала и представляют героев в правдоподобных (и забавных) ситуациях. Сюжеты Qwen кажутся менее оригинальными.
YandexGPT-5-Pro: ★★★★★
ChatGPT-4o: ★★★★★
Qwen-2.5-72B‑Instruct: ★★★★☆
Нередко мы запоминаем пароли и коды не напрямую, а через ассоциации. Но хоть и имея на руках набор таких правил, вычислить исходный шифр — серьёзный вызов для нейросетей. Настолько серьёзный, что он даже поломал Qwen.
Логико‑математическая задача: пароль от лаборатории
В секретной лаборатории хранятся важные исследования, и доступ к ней защищён сложной системой: для входа нужно ввести четырёхзначный код.
Известно следующее:
— Код состоит из четырёх различных цифр.
— Если поменять местами первую и последнюю цифры, число увеличится на 1998.
— Сумма первой и третьей цифры равна сумме второй и четвёртой цифр.
— Разность второй и третьей цифр равна первой цифре.
— Сумма всех цифр кода — 18.Какой код открывает дверь в лабораторию?
Для решения этой задачи важно умение разбирать системы неявных уравнений, анализировать возможные четырёхзначные комбинации, в поисках решения исключать неподходящие варианты, а также, конечно, предоставлять пошаговый процесс решения (потому что этот формат технически близок к рассуждениям, а без этого в решении математики и логики винтики у LLM не закрутятся).
Qwen, увы, не смог решить задачу, застряв в бесконечном рассуждении (надеюсь, ваша видеокарта в порядке после просмотра этого скриншота), причём модель несколько раз возвращалась к предыдущим своим ответам, уже отмеченным как неправильные. Кстати, эта неполадка встречается до сих пор — у новой модели Qwen‑QwQ-32B. В качестве решения реддиторы предлагают установить температуру в 0,6, а значение TopP — в 0,95.
ChatGPT-4o почти пришёл к правильному решению — не было соблюдено одно условие: в предоставленном коде 3465
разность второй и третьей цифр на самом деле неравна первой цифре.
И YandexGPT-5-Pro тоже не справился с задачей — здесь, напротив, соблюдено лишь одно из пяти условий (все цифры должны быть разными).
Что ж, похоже, эта задача под силу только рассуждающим моделям (к примеру, o3-mini‑high её смогла решить). Кстати, правильный ответ тут один: 2574
. Оценки выставлены на основе того, какое количество из пяти условий исходной задачи было соблюдено.
YandexGPT-5-Pro: ★☆☆☆☆
ChatGPT-4o: ★★★★☆
Qwen-2.5-72B‑Instruct: ☆☆☆☆☆
| YandexGPT-5-Pro | ChatGPT-4o | Qwen-2.5-72B-Instruct |
Составление заголовков к тексту | ★★★★★ | ★★★★☆ | ★★★★☆ |
Рерайт текста | ★★★★☆ | ★★★★☆ | ★★★☆☆ |
Контент-план для телеграм-канала зоомагазина | ★★★★★ | ★★★★★ | ★★★★☆ |
Написание игры: змейка | ★☆☆☆☆ | ★★★★★ | ★★★★☆ |
Написание игры: тетрис | ★☆☆☆☆ | ★★★★★ | ★☆☆☆☆ |
Создание описаний к новым сериям «Офиса» | ★★★★★ | ★★★★★ | ★★★★☆ |
Пароль от лаборатории | ★☆☆☆☆ | ★★★★☆ | ☆☆☆☆☆ |
ИТОГО | 22/35 баллов | 32/35 балла | 20/35 баллов |
Итак, вот финальный рейтинг: ChatGPT-4o в протестированных задачах лидирует с отрывом. YandexGPT-5-Pro, как и Qwen-2.5-72B‑Instruct, просели в основном в задачах по программированию и математике, поэтому на сегодняшний день 4o остаётся более универсальной моделью. Однако в направлении русскоязычного контента у YandexGPT-5-Pro хорошие возможности — во многих вещах эта модель может дополнить DeepSeek‑r1.
YandexGPT-5-Pro получился любопытным — он явно лучше предшественников, но до лидеров рынка ещё не дотягивается. С текстами тут всё в порядке, но, когда дело доходит до сложных вычислений, механизм начинает поскрипывать. Пока это скорее эволюция, чем прорыв. Если же нужен универсальный ИИ‑помощник на все случаи жизни… ну, вы знаете, куда идти.
Если работать с русскоязычным контентом — вполне стоит пробовать, однако в этой сдержанной революции кодинг и математика всё ещё остаются ахиллесовой пятой. Известно, что уже сейчас «Алису» обучают рассуждать.
Напишите в комментариях, удалось ли вам уже протестировать YandexGPT-5?