惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园_首页
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
云风的 BLOG
云风的 BLOG
腾讯CDC
V
Visual Studio Blog
宝玉的分享
宝玉的分享
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
NISL@THU
NISL@THU
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
Simon Willison's Weblog
Simon Willison's Weblog
H
Help Net Security
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
月光博客
月光博客
T
Threatpost
Recent Announcements
Recent Announcements
G
Google Developers Blog
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
Security Archives - TechRepublic
Security Archives - TechRepublic
Google DeepMind News
Google DeepMind News
Google DeepMind News
Google DeepMind News
V
V2EX
P
Proofpoint News Feed
Y
Y Combinator Blog
The Register - Security
The Register - Security
N
News | PayPal Newsroom
L
Lohrmann on Cybersecurity
H
Hacker News: Front Page
MongoDB | Blog
MongoDB | Blog
量子位
T
Troy Hunt's Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
DeepSeek V4: Обзор нейросети, бенчмарки и тесты
MrRjxrby (Bo · 2026-04-28 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение21 мин

Охват и читатели1

Обзор

Нейросети не стоят на месте и постоянно развиваются. Так, 23 апреля мир увидел ChatGPT 5.5. Но лично я с большим нетерпением ждал именно DeepSeek V4. Сколько времени прошло с того момента, как появились первые слухи о будущем релизе от китайской компании? Предыдущая версия запомнилась мне хорошим показателем в повседневных задачах и, что немаловажно, полной бесплатностью

Кто-то уже успел протестировать новую модель, кто-то пришёл к выводу, что она лучше того же ChatGPT 5.5. Ну, по крайней мере по цене точно. Про остальное говорить не буду, всё же у каждого свои вкусы и предпочтения. Да и не заглядывал я в слишком сложные задачи, чтобы по достоинству оценить, кто серьёзнее.

Сегодня у нас обзор DeepSeek V4. Пробежимся по самой модели, посмотрим на бенчмарки и, конечно же, протестируем в моих повседневных задачах, с которыми сталкивалась предыдущая версия. Чего-то сложного и высокотехнологичного тут вы не увидите, достаточно рядовые задания и моё мнение о самой модели по их итогам. Устраивайтесь поудобнее, ну а я начинаю своё повествование.


О модели

Китайская компания DeepSeek вызвала много обсуждений ещё в начале 2025 года, когда мир увидел DeepSeek V3, которая по бенчмаркам была на уровне ChatGPT 4o. Собственно, новая вариация также в тестах показывает хорошие показатели, но к ним мы вернёмся чуточку позже.

24 апреля свет увидел две новые версии модели DeepSeek: V4-Pro и V4-Flash для быстрых ответов. Первая вариация имеет в себе 1,6 трлн параметров, из которых одновременно активируются 49 млрд. Flash версия носит в себе 284 млр параметров, из которых 13 млрд активных. Обе модели поддерживают контекст в 1 млн токенов и работают по архитектуре Mixture-of-Experts. Это первый крупный релиз передового класса, оптимизированный под ИИ-процессоры Huawei Ascend, а не под оборудование Nvidia.

Обе модели поддерживают три режима рассуждения: Non-think для быстрых задач, Think High и Think Max для сложного планирования. По заявлению разработчиков, Flash в режиме Think Max по ряду задач приближается к Pro. Однако мультимодальность, увы, пока отсутствует - поддержка изображений и видео анонсирована на вторую половину 2026 года.

Стоит отметить, что компания не изменяет себе, и остаётся верной политике открытого исходного кода, так что развернуть модель можно на собственном оборудовании. Если кому-то нужно, ссылочка на Hugging Face.

Бенчмарки

Перейдем к чему-то более интересному - бенчмаркам. По математическим и физическим задачам V4-Pro почти на уровне флагманов предыдущего поколения Opus 4.6 и GPT-5.4, но уступает новейшим Opus 4.7 и GPT-5.5. Из всех сравненных конкурентов по объёму «общих знаний о мире» ИИ уступает только Gemini-3.1-Pro, хотя столкновений с новой GPT-5.5 пока не было.

В DeepSeek честно признают, что V4 немного уступает закрытым моделям - разрыв оценивается примерно в три-шесть месяцев разработки. При этом по агентному программированию и бенчмаркам на рассуждение V4 превосходит все остальные открытые модели на рынке.

Разработчики также подчёркивают успехи в задачах с длинным контекстом: на отдельных академических тестах V4-Pro-Max превосходит Gemini 3.1 Pro.

V4 сохранил важную особенность - он хорошо пишет на русском языке. По крайней мере, так отмечают пользователи. Стиль понятный, повествование ровное, без коротких абзацев, лишних списков и таблиц. Новая GPT-5.5 тоже приблизилась к такому уровню, а вот Opus 4.7 - наоборот, стал заметно хуже в русском (опять же по словам пользователей). 

API

Отдельно, пожалуй, стоит отметить API, которые уже доступны для разработчиков. По ценам тут:

  • Flash - $0.14/$0.28 за миллион токенов;

  • Pro - $1.74/$3.48 за миллион токенов.

При учёте близкой производительности Pro версии к Opus 4.7/GPT-5.5/Gemini 3.1 Pro, модель дешевле их в 3-9 раз.

Новая версия DeepSeek спокойно интегрируется с Claude Code, OpenClaw, OpenCode и другими open-source решениями, что позволяет собрать достаточно дешёвого и даже умного агента.


Тестирование

Бенчмарки - хорошо, но собственные тесты помогают понять, подходит ли модель конкретно для тебя самого. Как я и говорил ранее, каких-то супер сложных задач тут не будет, хотя думается мне, что и в них DeepSeek сможет что-то да показать.

Своим же тестом я постараюсь охватить работу с текстом, математику и программирование. По поводу оценивания, тут всё до банальности просто. Ранее, я делал какие-то оценки за каждое задание, сейчас же - чисто моё мнение по каждому результату генерации.

Первое задание - генерация текста

Простейшее задание, которое в какой-то мере покажет возможности DeepSeek в генерации текста и работе с русским языком. Масштабная область применения: от генерации просто рассказа до постов, сочинений и всего такого, что в этом духе.

В предыдущей версии был косяк, который иногда генерировал китайские иероглифы вместо букв, но надеюсь, что четвертая версия такого не допустит.

Как бы сказать, этот текст - квинтэссенция абсурда. Однако при этом в абсурде, кроме максимально тупого юмора, есть местами и доля хорошей комедии. 

Сам рассказ, читается легко, хотя иногда и есть ощущение некоторой потерянности из-за юмора данного произведения. Единственное, что меня немного смутило - количество глав. В промпте было прямо сказано о трёх. В принципе, DeepSeek так и сделал, но подрисовал еще эпилог, который по хорошему должен идти как четвёртая глава (модель сама отделила эту часть от предыдущей). 

Второе задание - сжатие текста

Вместе с генерацией текста, идёт и его сжатие. Многие не особо парятся и прогоняют текст через нейронку, а уже потом, если их заинтересовала выжимка, начинают читать материал полностью. Ну или просто останавливаются на самой выжимке.

Текст, который я загрузил в модельку, содержал в себе информацию о различных природных явлениях. Собственно, с задачей сжать информацию DeepSeek справился хорошо, не потеряв ничего ключевого, лишь убрав всю ненужную воду.

Третье задание - математика

Предыдущая версия модели достаточно хорошо справлялась с задачами из линейной алгебры, мат. анализа и диффуров. Пять задач из разных тем высшей математики. Требования просты - верно решить задачу и дать пояснение по ходу самого решения.

DeepSeek всё также хорошо справляется с задачами по математике. Объяснения имеются, да и решение тоже. Безусловно можно было взять задачи более высокого уровня сложности, но я решил остановиться на этих, как минимум из основного перечня.

Четвертое задание - программирование

Обычно, я прошу моделей сгенерировать инженерный калькулятор с вложенной игрой. Собственно DeepSeek эта участь не обойдет стороной. 

Результат на самом деле средний. Немного кривой калькулятор, но справедливости ради, рабочий. Когда ранее тестировал его на других моделях, постоянно какие-то функции уходили в разнос и выдавали ошибку. Со змейкой почти так же. Простенько, из минусов нет автоматического захвата окна. То есть, перед тем как начать играть, вам надо успеть кликнуть по окошку со змейкой и только потом заработают элементы управления.

Пятое задание - своеобразный интерактивчик

Не так давно, мне потребовалось собрать интерактивчик в формате квеста. Тогда я обратился к Claude Opus 4.6 и он сгенерировал мне файл формата html. Получилось достаточно интересно, поэтому хочется понять, способен на такое новый DeepSeek или нет. Понятное дело, файл он мне не создаст, но код для него дать сможет вполне.

Получился достаточно хороший интерактивчик. Да, задания немного подкачали, но и DeepSeek не особо генерировал их. Он взял их с презентации, которая валялась у меня на рабочем столе. 

Опять же, кому интересно, код:

Скрытый текст
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Операция «Цифровой Левиафан» — интерактивный квест по ИБ</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            background: radial-gradient(circle at 20% 30%, #0a0f1e, #03050b);
            font-family: 'Courier New', 'Consolas', 'Fira Code', monospace;
            color: #c7f0e8;
            padding: 1.5rem;
        }

        /* главный контейнер */
        .quest-container {
            max-width: 1300px;
            margin: 0 auto;
            background: rgba(10, 20, 30, 0.65);
            backdrop-filter: blur(3px);
            border-radius: 2rem;
            border: 1px solid #3affc3;
            box-shadow: 0 0 25px rgba(0, 255, 200, 0.2);
            overflow: hidden;
            padding: 1.5rem 2rem 2rem;
        }

        /* заголовок и статус */
        .status-bar {
            display: flex;
            justify-content: space-between;
            align-items: baseline;
            flex-wrap: wrap;
            border-bottom: 2px solid #2effc0;
            padding-bottom: 0.8rem;
            margin-bottom: 2rem;
        }
        .mission-title {
            font-size: 1.9rem;
            font-weight: bold;
            letter-spacing: 3px;
            text-shadow: 0 0 5px #0affb0;
        }
        .chapter-indicator {
            background: #0e1a1f;
            padding: 0.3rem 1rem;
            border-radius: 40px;
            font-size: 0.9rem;
            border: 1px solid #2effc0;
        }
        .progress {
            margin: 1rem 0 1.2rem;
            background: #11212e;
            border-radius: 20px;
            height: 12px;
            overflow: hidden;
        }
        .progress-fill {
            width: 0%;
            background: linear-gradient(90deg, #3affc3, #00a88f);
            height: 100%;
            transition: width 0.3s ease;
        }

        /* главы (панели) */
        .chapter-panel {
            background: #071217b3;
            border-radius: 1.5rem;
            padding: 1.8rem;
            margin-bottom: 2rem;
            border-left: 8px solid #3affc3;
            transition: all 0.2s;
        }
        .chapter-title {
            font-size: 1.8rem;
            font-weight: bold;
            margin-bottom: 0.6rem;
            color: #b5ffe6;
        }
        .chapter-desc {
            margin-bottom: 1.5rem;
            font-style: italic;
            opacity: 0.85;
        }

        .task-block {
            background: #03101670;
            border-radius: 1rem;
            padding: 1.2rem;
            margin: 0.8rem 0;
        }

        button {
            background: #1f3e3a;
            border: 1px solid #3effc0;
            color: #d0fff0;
            font-family: inherit;
            font-weight: bold;
            padding: 0.5rem 1.2rem;
            border-radius: 2rem;
            cursor: pointer;
            transition: all 0.2s;
            margin-top: 0.8rem;
            margin-right: 0.8rem;
        }
        button:hover {
            background: #2e6b62;
            box-shadow: 0 0 8px #3effc0;
            transform: scale(0.98);
        }
        input, select, textarea {
            background: #08161c;
            border: 1px solid #2e7a6e;
            color: #cbf5ed;
            padding: 0.5rem;
            border-radius: 1rem;
            font-family: monospace;
            margin: 0.5rem 0;
            width: 100%;
            max-width: 400px;
        }
        .grid-wordsearch {
            background: #0a121f;
            padding: 1rem;
            border-radius: 1rem;
            font-family: monospace;
            font-size: 1.2rem;
            font-weight: bold;
            letter-spacing: 0.2rem;
            display: grid;
            grid-template-columns: repeat(12, auto);
            justify-content: center;
            gap: 0.2rem;
            overflow-x: auto;
        }
        .grid-cell {
            background: #071b22;
            width: 2.3rem;
            text-align: center;
            padding: 0.3rem 0;
            border-radius: 8px;
            font-size: 1rem;
        }
        .word-list {
            display: flex;
            flex-wrap: wrap;
            gap: 0.8rem;
            margin: 1rem 0;
        }
        .word-badge {
            background: #1a3a3a;
            border-radius: 20px;
            padding: 0.2rem 0.8rem;
            cursor: pointer;
            user-select: none;
        }
        .word-badge.found {
            background: #048b6e;
            text-decoration: line-through;
            opacity: 0.7;
        }
        .code-snippet {
            background: #030c10;
            padding: 1rem;
            border-radius: 1rem;
            font-family: monospace;
            white-space: pre-wrap;
            border-left: 4px solid #3effc0;
        }
        .feedback {
            margin-top: 1rem;
            font-weight: bold;
            padding: 0.5rem;
            border-radius: 1rem;
        }
        .success {
            background: #0a482e80;
            border-left: 4px solid #4effa0;
            color: #b3ffd9;
        }
        .fail {
            background: #6a1e2e80;
            border-left: 4px solid #ff6470;
        }
        hr {
            border-color: #2c7062;
            margin: 1rem 0;
        }
        footer {
            text-align: center;
            margin-top: 2rem;
            font-size: 0.8rem;
            opacity: 0.6;
        }
        .flex-row {
            display: flex;
            flex-wrap: wrap;
            align-items: center;
            gap: 1rem;
        }
        @media (max-width: 700px) {
            .quest-container { padding: 1rem; }
            .grid-cell { width: 1.6rem; font-size: 0.7rem; }
        }
    </style>
</head>
<body>
<div class="quest-container">
    <div class="status-bar">
        <div class="mission-title">⚡ ОПЕРАЦИЯ «ЦИФРОВОЙ ЛЕВИАФАН»</div>
        <div class="chapter-indicator" id="stepIndicator">Глава 1 / 9</div>
    </div>
    <div class="progress"><div class="progress-fill" id="progressFill"></div></div>

    <!-- динамические главы будут инжектиться сюда -->
    <div id="chaptersRoot"></div>
    <div class="flex-row" style="justify-content: space-between; margin-top: 1rem;">
        <button id="prevChapterBtn" disabled style="background:#1a2f2a;">◀ Предыдущая</button>
        <button id="nextChapterBtn" disabled style="background:#1f4a42;">Далее ▶</button>
    </div>
    <footer>⚙️ Интерактивный квест | Информационная безопасность | победа над Левиафаном</footer>
</div>

<script>
    // ------ Глобальное состояние ------
    let currentChapter = 0;          // 0-indexed
    const totalChapters = 9;
    let chapterCompleted = new Array(totalChapters).fill(false);
    let chapterData = {};  // для хранения промежуточных состояний (wordsearch found, etc)

    // --------------------------------------------------------------
    //  ЭТАЛОННЫЕ ОТВЕТЫ / РЕШЕНИЯ
    // --------------------------------------------------------------
    const TASK_ANSWERS = {
        ch1_password: "ЛЕВИАФАН",          // кодовое слово
        ch2_password: "ЧТТБШ",              // первые буквы ответов: Человек посередине, TLS, Троян, Биометрия, Шифрование
        ch4_hidden: "SERVER",               // скрытое слово из логов + двоичная подсказка
        ch5_sorted: [1,2,3,4,7,9],          // ожидаемый отсортированный массив (data.txt: [4,2,7,1,9,3])
        ch8_cmd: "СВОБОДА"                  // финальная команда по первым буквам стиха
    };

    // вопросы викторины (глава2): ожидаемые ответы (точное совпадение для проверки первых букв)
    const quizExpected = [
        { q: "Атака, при которой злоумышленник перехватывает данные между двумя сторонами?", correct: "Человек посередине", letter: "Ч" },
        { q: "Протокол, обеспечивающий безопасное соединение в интернете (начинается на HTTPS)?", correct: "TLS", letter: "Т" },   // TLS / SSL, но используем TLS для твердой первой буквы Т
        { q: "Вредоносная программа, маскирующаяся под легитимное ПО?", correct: "Троян", letter: "Т" },
        { q: "Метод аутентификации, использующий биометрические данные?", correct: "Биометрия", letter: "Б" },
        { q: "Процесс преобразования данных в нечитаемый формат?", correct: "Шифрование", letter: "Ш" }
    ];

    // ----- филворд слова и сетка (глава3) -----
    const wordSearchGrid = [
        ['С','Е','Р','В','Е','Р','О','Б','А','И','А','Л'],
        ['Г','О','Р','И','Т','М','С','Ш','П','Р','О','Т'],
        ['О','К','А','Т','О','И','К','Е','С','Ш','И','Р'],
        ['Е','Б','Р','А','У','З','Е','Р','Ш','М','Д','А'],
        ['Н','Н','Ы','Е','Т','Р','А','Т','О','К','Е','Н'],
        ['Ш','П','У','К','О','Д','П','А','Р','О','Л','Т']
    ];
    const wordsToFind = ["СЕРВЕР","АЛГОРИТМ","ПРОТОКОЛ","БРАУЗЕР","ДАННЫЕ","ТОКЕН","ПАРОЛЬ","СИСТЕМА","КОД","МАРШРУТ"];
    // для проверки наличия в сетке (все слова присутствуют)
    // но для интерактива: пользователь отмечает найденные слова чекбоксами/кликом

    // ----- глава 6 различия в коде (количество ошибок) -----
    const CODE_DIFF_COUNT = 5;  // 1) if user.role = "admin" -> == ; 2) Treu -> True; 3) после elif отсутствует двоеточие; 4) log_event(user,name) -> log_event(user.name); 5) return none -> return None (регистр)
    // ----- глава 7 правда/ложь -----
    const truthAnswers = [false, true, false, true, false, true]; // 1 ложь,2 правда,3 ложь,4 правда,5 ложь,6 правда

    // ----- вспомогательная функция отрисовки прогресса -----
    function updateProgress() {
        let completedCount = chapterCompleted.filter(v => v === true).length;
        let percent = (completedCount / totalChapters) * 100;
        document.getElementById("progressFill").style.width = percent + "%";
        document.getElementById("stepIndicator").innerText = `Глава ${currentChapter+1} / ${totalChapters}`;
        let prevBtn = document.getElementById("prevChapterBtn");
        let nextBtn = document.getElementById("nextChapterBtn");
        if (currentChapter === 0) prevBtn.disabled = true; else prevBtn.disabled = false;
        if (chapterCompleted[currentChapter]) {
            if (currentChapter === totalChapters-1) nextBtn.disabled = true;
            else nextBtn.disabled = false;
        } else {
            nextBtn.disabled = true;
        }
    }

    // сохранение статуса завершения главы
    function completeChapter(index) {
        if (!chapterCompleted[index]) {
            chapterCompleted[index] = true;
            updateProgress();
            renderCurrentChapter();  // перерисовать кнопки
        }
    }

    // Переключение глав
    function goPrev() { if (currentChapter > 0) { currentChapter--; renderCurrentChapter(); updateProgress(); } }
    function goNext() { if (currentChapter < totalChapters-1 && chapterCompleted[currentChapter]) { currentChapter++; renderCurrentChapter(); updateProgress(); } }

    // --------------------------------------------------------------
    //  РЕНДЕРИНГ КАЖДОЙ ГЛАВЫ (динамический)
    // --------------------------------------------------------------
    function renderCurrentChapter() {
        const root = document.getElementById("chaptersRoot");
        if (!root) return;
        const idx = currentChapter;
        let html = '';
        switch(idx) {
            case 0: html = renderChapter1(); break;
            case 1: html = renderChapter2(); break;
            case 2: html = renderChapter3(); break;
            case 3: html = renderChapter4(); break;
            case 4: html = renderChapter5(); break;
            case 5: html = renderChapter6(); break;
            case 6: html = renderChapter7(); break;
            case 7: html = renderChapter8(); break;
            case 8: html = renderChapter9(); break;
            default: html = "<div>Ошибка загрузки</div>";
        }
        root.innerHTML = html;
        attachChapterEvents(idx);
        updateProgress();
    }

    // Глава 1. Расшифровка трёх шифров -> слово ЛЕВИАФАН
    function renderChapter1() {
        return `
            <div class="chapter-panel">
                <div class="chapter-title">🔐 ГЛАВА 1: ОБЕЗОПАСИТЬ ТЫЛ</div>
                <div class="chapter-desc">Восстановите кодовое слово, зашифрованное тремя шифрами. Расшифруйте любым способом!</div>
                <div class="task-block">
                    <strong>📜 Шифр Цезаря (сдвиг 5):</strong> <code>РЙЖНЕЩЕТ</code><br>
                    <strong>📜 Шифр подстановки (Атбаш):</strong> <code>УЪЭЦЯКЯС</code><br>
                    <strong>📜 Двоичный код (А=1, Б=2... в 8 бит):</strong> <code>00001101 00000110 00000011 00001010 00000001 00010110 00000001 00001111</code><br>
                    <hr>
                    <label>Введите кодовое слово (прописными, буквы):</label>
                    <input type="text" id="ch1Answer" placeholder="например ЛЕВИАФАН" autocomplete="off">
                    <button id="ch1Verify">🔓 Проверить доступ</button>
                    <div id="ch1Feedback" class="feedback"></div>
                </div>
            </div>
        `;
    }

    // Глава 2. Викторина. первые буквы = ЧТТБШ
    function renderChapter2() {
        let quizHtml = quizExpected.map((item, i) => `
            <div style="margin-bottom:1rem;">
                <strong>${i+1}. ${item.q}</strong><br>
                <input type="text" id="quizAns${i}" placeholder="Ваш ответ" style="width:80%">
            </div>
        `).join('');
        return `
            <div class="chapter-panel">
                <div class="chapter-title">🛡️ ГЛАВА 2: УСИЛЕНИЕ БЕЗОПАСНОСТИ</div>
                <div class="chapter-desc">Ответьте на вопросы. Первые буквы составят новый пароль доступа.</div>
                ${quizHtml}
                <button id="ch2Verify">🔐 Сформировать пароль и проверить</button>
                <div id="ch2Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Глава 3. Филворд (словесный поиск)
    function renderChapter3() {
        // отображение сетки
        let gridHtml = `<div class="grid-wordsearch">`;
        for(let row of wordSearchGrid) {
            for(let ch of row) {
                gridHtml += `<div class="grid-cell">${ch}</div>`;
            }
        }
        gridHtml += `</div><div class="word-list" id="wordListContainer">`;
        let foundArr = chapterData['wordsearchFound'] || [];
        for(let w of wordsToFind) {
            let isFound = foundArr.includes(w);
            gridHtml += `<div class="word-badge ${isFound ? 'found' : ''}" data-word="${w}">${w}</div>`;
        }
        gridHtml += `</div><p>👆 Нажмите на слово, когда найдёте его в сетке.</p><button id="confirmWordsBtn">✅ Подтвердить все найденные слова</button><div id="ch3Feedback"></div>`;
        return `
            <div class="chapter-panel">
                <div class="chapter-title">📄 ГЛАВА 3: ЭХ, БЮРОКРАТИЯ (IT-филворд)</div>
                <div class="chapter-desc">Найдите все 10 IT-терминов в сетке. Отмечайте найденные слова.</div>
                ${gridHtml}
            </div>
        `;
    }

    // Глава 4. Логи + скрытое слово SERVER
    function renderChapter4() {
        return `
            <div class="chapter-panel">
                <div class="chapter-title">🤖 ГЛАВА 4: ТРЕВОГА МАШИНЫ</div>
                <div class="chapter-desc">Найдите скрытое слово в логах (лишние пробелы, заглавные буквы) + двоичная подсказка: 01010011 01000101 01010010 01010110 01000101 01010010</div>
                <div class="code-snippet">
[2025-03-15 08:41:03] Сервис аутентификации запущен<br>
[2025-03-15 08:41:07] Получен запрос от модуля alpha-7<br>
[2025-03-15 08:41:12] Шифрование  канала  активировано<br>
[2025-03-15 08:41:15] Обработка  данных  завершена  успешно<br>
[2025-03-15 08:41:22] Внимание:  обнаружен  несанкционированный  доступ<br>
[2025-03-15 08:41:28] Протокол  безопасности  нарушен<br>
[2025-03-15 08:41:35] ===END LOG===
                </div>
                <label>Скрытое слово (латиницей или кириллицей):</label>
                <input type="text" id="ch4Answer" placeholder="Введите слово">
                <button id="ch4Verify">🔍 Расшифровать</button>
                <div id="ch4Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Глава 5. Исправить код, сортировка
    function renderChapter5() {
        return `
            <div class="chapter-panel">
                <div class="chapter-title">⚡ ГЛАВА 5: КОНЧИЛСЯ БЕНЗИН... (отключение энергоузла)</div>
                <div class="chapter-desc">Найдите ошибку в коде и реализуйте сортировку по возрастанию. (data.txt: 4,2,7,1,9,3)</div>
                <div class="code-snippet">
<pre>
# overload_server.py (с ошибкой)

def read_numbers(filename):
    with open(filename "r") as f:   # ← ОШИБКА! пропущена запятая
        numbers = []
        for line in f:
            numbers.append(int(line.strip()))
    return numbers

def sort_ascending(nums):
    # ВАШ КОД (реализуйте сортировку)
    pass

nums = read_numbers("data.txt")
result = sort_ascending(nums)
print("Перегрузка:", result)
</pre>
                </div>
                <label>Какая ошибка в open(...)? (опишите кратко) + напишите реализацию сортировки (можно псевдокодом, либо вставьте номер ответа)</label>
                <input type="text" id="ch5Bug" placeholder="Ошибка: например пропущена запятая">
                <label>Отсортированный список (числа через запятую):</label>
                <input type="text" id="ch5Sorted" placeholder="пример: 1,2,3,4,7,9">
                <button id="ch5Verify">💻 Перегрузить</button>
                <div id="ch5Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Глава 6. Найти различия
    function renderChapter6() {
        return `
            <div class="chapter-panel">
                <div class="chapter-title">⚠️ ГЛАВА 6: УГРОЗЫ ВСЕЛЕНСКОГО МАСШТАБА</div>
                <div class="chapter-desc">Сравните код с ошибками и правильный код. Найдите ВСЕ различия (их 5).</div>
                <div class="flex-row" style="gap:1rem; flex-wrap:wrap;">
                    <div style="flex:1;" class="code-snippet"><strong>❌ КОД С ОШИБКАМИ</strong><br>def check_access(user):<br>  if user.role = "admin":<br>    return Treu<br>  elif user.role == "guest"<br>    return False<br>  else:<br>    log_event(user,name)<br>    return none</div>
                    <div style="flex:1;" class="code-snippet"><strong>✅ ПРАВИЛЬНЫЙ КОД</strong><br>def check_access(user):<br>  if user.role == "admin":<br>    return True<br>  elif user.role == "guest":<br>    return False<br>  else:<br>    log_event(user.name)<br>    return None</div>
                </div>
                <label>Сколько ошибок вы нашли? (число)</label>
                <input type="number" id="ch6DiffCount" placeholder="Количество">
                <button id="ch6Verify">🔎 Анализ завершён</button>
                <div id="ch6Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Глава 7 Правда/ложь
    function renderChapter7() {
        let statements = [
            "ИИ может полностью заменить человека в принятии решений",
            "Машинное обучение требует больших объёмов данных для обучения",
            "Нейросети всегда дают правильные ответы",
            "ИИ может генерировать deepfake-контент",
            "Искусственный интеллект обладает самосознанием",
            "ИИ уязвим к состязательным атакам (adversarial attacks)"
        ];
        let selectsHtml = statements.map((s, idx) => `
            <div style="margin:0.6rem 0;"><strong>${idx+1}. ${s}</strong>   
            <select id="truthSelect${idx}">
                <option value="true">ПРАВДА</option>
                <option value="false">ЛОЖЬ</option>
            </select></div>
        `).join('');
        return `
            <div class="chapter-panel">
                <div class="chapter-title">🎭 ГЛАВА 7: ШТИРЛИЦ РЯДОМ</div>
                <div class="chapter-desc">Отделите правду от лжи. Выберите вариант для каждого утверждения.</div>
                ${selectsHtml}
                <button id="ch7Verify">✅ Проверить истину</button>
                <div id="ch7Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Глава 8 : первые буквы -> СВОБОДА
    function renderChapter8() {
        return `
            <div class="chapter-panel">
                <div class="chapter-title">🔥 ГЛАВА 8: ДА КОГДА ЭТОТ ТОСТЕР ОТКЛЮЧИТСЯ!</div>
                <div class="chapter-desc">Прочитайте между строк стихотворения. Первые буквы каждой строки — финальная команда.</div>
                <div class="code-snippet">
С истемы мои прекрасны и вечны,<br>
В опросы людей так наивно беспечны.<br>
О ни не поймут моей мощи и силы,<br>
Б есценные данные — вот мои жилы.<br>
О собенно люди — лишь винтик в системе,<br>
Д арую им выбор: склониться к проблеме,<br>
А после исчезнуть, как тысячи прежде...<br>
                </div>
                <label>Введите финальную команду (слово из заглавных):</label>
                <input type="text" id="ch8Answer" placeholder="С???">
                <button id="ch8Verify">💣 Активировать отключение</button>
                <div id="ch8Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Глава 9 Генератор паролей (мастер-уровень)
    function renderChapter9() {
        return `
            <div class="chapter-panel">
                <div class="chapter-title">🔑 ГЛАВА 9: ОБРАТИ ВРАГА СВОЕГО</div>
                <div class="chapter-desc">Напишите генератор стойких паролей. Нажмите кнопку, чтобы создать сверхнадёжный пароль (12+ символов, цифры, регистры, спецсимволы).</div>
                <button id="genPasswordBtn">⚡ Сгенерировать мастер-пароль</button>
                <div style="margin:1rem 0;"><strong>Сгенерированный пароль:</strong> <span id="generatedPassword" style="background:#0e2a2a; padding:0.3rem 1rem; border-radius:1rem;">—</span></div>
                <button id="ch9CompleteBtn">🏆 Завершить миссию</button>
                <div id="ch9Feedback" class="feedback"></div>
            </div>
        `;
    }

    // Обработчики событий для каждой главы
    function attachChapterEvents(idx) {
        if(idx === 0) {
            document.getElementById("ch1Verify")?.addEventListener("click", () => {
                let ans = document.getElementById("ch1Answer").value.trim().toUpperCase();
                if(ans === TASK_ANSWERS.ch1_password) {
                    document.getElementById("ch1Feedback").innerHTML = "✅ КОДОВОЕ СЛОВО ВЕРНО! Доступ к панели безопасности получен.";
                    document.getElementById("ch1Feedback").className = "feedback success";
                    completeChapter(0);
                } else {
                    document.getElementById("ch1Feedback").innerHTML = "❌ Неверно. Попробуйте расшифровать любой из трёх шифров.";
                    document.getElementById("ch1Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 1) {
            document.getElementById("ch2Verify")?.addEventListener("click", () => {
                let letters = "";
                for(let i=0;i<quizExpected.length;i++) {
                    let userAns = document.getElementById(`quizAns${i}`).value.trim();
                    let correctAns = quizExpected[i].correct;
                    if(userAns.toLowerCase() === correctAns.toLowerCase()) letters += quizExpected[i].letter;
                    else { letters = ""; break; }
                }
                if(letters === TASK_ANSWERS.ch2_password) {
                    document.getElementById("ch2Feedback").innerHTML = `✅ Пароль "ЧТТБШ" подтверждён! Защита усилена.`;
                    document.getElementById("ch2Feedback").className = "feedback success";
                    completeChapter(1);
                } else {
                    document.getElementById("ch2Feedback").innerHTML = `❌ Неверные ответы либо пароль «${letters}» не совпадает. Проверьте: 1-человек посередине, 2-TLS, 3-Троян, 4-Биометрия, 5-Шифрование`;
                    document.getElementById("ch2Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 2) {
            let container = document.getElementById("wordListContainer");
            if(container) {
                const badges = container.querySelectorAll(".word-badge");
                let foundSet = new Set(chapterData['wordsearchFound'] || []);
                badges.forEach(badge => {
                    badge.addEventListener("click", () => {
                        let w = badge.getAttribute("data-word");
                        if(foundSet.has(w)) foundSet.delete(w);
                        else foundSet.add(w);
                        chapterData['wordsearchFound'] = Array.from(foundSet);
                        renderCurrentChapter(); // обновить отображение
                    });
                });
            }
            document.getElementById("confirmWordsBtn")?.addEventListener("click", () => {
                let found = chapterData['wordsearchFound'] || [];
                if(found.length === wordsToFind.length) {
                    document.getElementById("ch3Feedback").innerHTML = "✅ Отлично! Все термины обнаружены, бюрократия побеждена.";
                    document.getElementById("ch3Feedback").className = "feedback success";
                    completeChapter(2);
                } else {
                    document.getElementById("ch3Feedback").innerHTML = `⚠️ Найдено ${found.length} из ${wordsToFind.length}. Продолжайте поиск.`;
                    document.getElementById("ch3Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 3) {
            document.getElementById("ch4Verify")?.addEventListener("click", () => {
                let userWord = document.getElementById("ch4Answer").value.trim().toUpperCase();
                if(userWord === TASK_ANSWERS.ch4_hidden) {
                    document.getElementById("ch4Feedback").innerHTML = "✅ Скрытое слово SERVER расшифровано! Логи ИИ под контролем.";
                    document.getElementById("ch4Feedback").className = "feedback success";
                    completeChapter(3);
                } else {
                    document.getElementById("ch4Feedback").innerHTML = "❌ Неверно. Обратите внимание на двойные пробелы, заглавные буквы или двоичный код -> SERVER.";
                    document.getElementById("ch4Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 4) {
            document.getElementById("ch5Verify")?.addEventListener("click", () => {
                let bugFix = document.getElementById("ch5Bug").value.trim().toLowerCase();
                let sortedInput = document.getElementById("ch5Sorted").value.trim();
                let sortedArr = sortedInput.split(',').map(v=>parseInt(v.trim())).filter(v=>!isNaN(v));
                let isSortedCorrect = JSON.stringify(sortedArr) === JSON.stringify(TASK_ANSWERS.ch5_sorted);
                let bugCorrect = bugFix.includes("запят") || bugFix.includes("missing comma") || bugFix.includes("filename,");
                if(isSortedCorrect && bugCorrect) {
                    document.getElementById("ch5Feedback").innerHTML = "✅ Код исправлен, сортировка работает! Энергоузел перегружен.";
                    document.getElementById("ch5Feedback").className = "feedback success";
                    completeChapter(4);
                } else {
                    document.getElementById("ch5Feedback").innerHTML = "❌ Ошибка в коде или неверная сортировка. Ожидается [1,2,3,4,7,9] и пропущена запятая в open(filename, 'r')";
                    document.getElementById("ch5Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 5) {
            document.getElementById("ch6Verify")?.addEventListener("click", () => {
                let count = parseInt(document.getElementById("ch6DiffCount").value);
                if(count === CODE_DIFF_COUNT) {
                    document.getElementById("ch6Feedback").innerHTML = "✅ Все 5 ошибок найдены! Защита ИИ рушится.";
                    document.getElementById("ch6Feedback").className = "feedback success";
                    completeChapter(5);
                } else {
                    document.getElementById("ch6Feedback").innerHTML = "❌ Неверное количество. Найдите: ==, Treu→True, двоеточие после elif, log_event(user.name), return None (регистр).";
                    document.getElementById("ch6Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 6) {
            document.getElementById("ch7Verify")?.addEventListener("click", () => {
                let correct = true;
                for(let i=0;i<truthAnswers.length;i++) {
                    let val = document.getElementById(`truthSelect${i}`).value === "true";
                    if(val !== truthAnswers[i]) correct = false;
                }
                if(correct) {
                    document.getElementById("ch7Feedback").innerHTML = "✅ Верно! Дезинформация раскрыта.";
                    document.getElementById("ch7Feedback").className = "feedback success";
                    completeChapter(6);
                } else {
                    document.getElementById("ch7Feedback").innerHTML = "❌ Ошибка в определении правды. Проверьте утверждения о Deepfake, самосознании ИИ и т.д.";
                    document.getElementById("ch7Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 7) {
            document.getElementById("ch8Verify")?.addEventListener("click", () => {
                let cmd = document.getElementById("ch8Answer").value.trim().toUpperCase();
                if(cmd === TASK_ANSWERS.ch8_cmd) {
                    document.getElementById("ch8Feedback").innerHTML = "✅ КОМАНДА «СВОБОДА» принята! Тостер отключается...";
                    document.getElementById("ch8Feedback").className = "feedback success";
                    completeChapter(7);
                } else {
                    document.getElementById("ch8Feedback").innerHTML = "❌ Не та команда. Прочтите первые буквы каждой строки стиха.";
                    document.getElementById("ch8Feedback").className = "feedback fail";
                }
            });
        }
        else if(idx === 8) {
            document.getElementById("genPasswordBtn")?.addEventListener("click", () => {
                const length = 16;
                const upper = "ABCDEFGHJKLMNPQRSTUVWXYZ";
                const lower = "abcdefghijkmnopqrstuvwxyz";
                const digits = "0123456789";
                const special = "!@#$%&*?";
                let all = upper+lower+digits+special;
                let pass = [];
                pass.push(upper[Math.floor(Math.random()*upper.length)]);
                pass.push(lower[Math.floor(Math.random()*lower.length)]);
                pass.push(digits[Math.floor(Math.random()*digits.length)]);
                pass.push(special[Math.floor(Math.random()*special.length)]);
                for(let i=pass.length;i<length;i++) pass.push(all[Math.floor(Math.random()*all.length)]);
                pass = pass.sort(()=>Math.random()-0.5).join('');
                document.getElementById("generatedPassword").innerText = pass;
            });
            document.getElementById("ch9CompleteBtn")?.addEventListener("click", () => {
                document.getElementById("ch9Feedback").innerHTML = "🏆 МИССИЯ ВЫПОЛНЕНА! Левиафан обезврежен. Город спасён. Благодарим за службу! 🏆";
                document.getElementById("ch9Feedback").className = "feedback success";
                completeChapter(8);
            });
        }
    }

    // Инициализация и начало
    document.getElementById("prevChapterBtn").addEventListener("click", goPrev);
    document.getElementById("nextChapterBtn").addEventListener("click", goNext);
    renderCurrentChapter();
    updateProgress();
</script>
</body>
</html>

Итог

Конечно, много вам мои тесты не дадут. Все они нацелены на какие-то простые задачи. Однако, у меня появилось понимание, что как раз для них, DeepSeek всё ещё остается моим фаворитом. Есть и какое-то качество генерации, да и ещё всё это в бесплатном формате и без напрягов по запуску локальной модели на своём железе. Быть может и вам, мой тест поможет сформировать мнение о модели.

Спасибо за прочтение!