Проблема сегодня: человек сам переключается между десятком приложений, копирует данные, помнит контексты - тратит когнитивные ресурсы на работу коммутатора.
Идея цифрового двойника: персональный ИИ-агент, который знает вас, представляет в цифровом мире и возвращает только то, что требует внимания.
Уровень 1 - Ядро личности: профиль ценностей (векторная база предпочтений), контекстная память (короткая / средняя / долгая), стиль коммуникации (из переписки).
Уровень 2 - Оркестратор: классификатор событий (срочное / рутинное / фоновое) + диспетчер задач с очередями приоритетов.
Уровень 3 - Функциональные модули: коммуникатор, планировщик, транзакции, RAG-поиск, контроль безопасности.
Проблема идентичности: когда двойник действует от вашего имени, стирается грань - друзья общаются с ним, думая, что это вы.
Проблема приватности: двойник хранит всё - ценности, переписки, финансы; это идеальная мишень для хакеров («стеклянный человек»).
Этическая дилемма: права двойника - можно ли его оскорблять, удалять, оставлять после смерти (цифровое бессмертие)?
Практический пример
Минимальный прототип цифрового двойника: API на FastAPI с интеграцией LLM, кэшированием в Redis и короткой памятью. Код и инструкция по запуску - в Приложении 5.4.
1. В чём заключается проблема «человека как узкого горлышка»? Почему современный цифровой мир неэффективен для человека?
2. Что такое цифровой двойник и какую идею он реализует? Как меняется взаимодействие человека с цифровым миром?
3. Опишите трёхуровневую архитектуру цифрового двойника. Что входит в ядро личности, чем занимается оркестратор и какие функции выполняют модули?
4. Как в сценарии «утро с двойником» распределяются задачи между человеком и двойником? Что берёт на себя двойник, а что остаётся человеку?
5. Какие технические компоненты входят в архитектуру двойника? Какие базы данных, модели и интерфейсы там используются?
6. С какими проблемами столкнётся человечество при внедрении цифровых двойников? Назовите и кратко опишите 2-3 основные проблемы.
Знание, которое вы получили, ничего не стоит, если не применять его на практике. Вот несколько направлений, где вы можете его использовать:
Если вы инженер
Возьмите open-source модель (Mistral, LLaMA, Qwen) и разверните её локально. Почувствуйте разницу между API и собственным железом.
Поэкспериментируйте с разными архитектурами на небольших задачах. Сравните трансформер с Mamba или RWKV.
Посчитайте TCO для вашего проекта. Удивитесь, сколько денег можно сэкономить или, наоборот, потерять на неправильном выборе.
Если вы менеджер или продакт
Перечитайте спецификации моделей с новым пониманием. Задайте поставщикам правильные вопросы про активные параметры и реальную работу long context.
Спроектируйте систему с роутингом под ваши задачи. Не бойтесь комбинировать разные модели - это часто дешевле и эффективнее, чем брать одну «универсальную».
Заложите в бюджет не только стоимость токенов, но и инженерное сопровождение, дообучение, версионирование.
Если вы просто интересуетесь
Следите за новыми архитектурами - теперь вы понимаете, о чём говорят в блогах и на конференциях.
Критически оценивайте новости про «прорывные модели». Отделяйте реальные достижения от маркетинга.
Думайте о том, каким вы хотели бы видеть своего цифрового двойника. Какие задачи вы готовы ему делегировать уже сегодня?
НАЧАЛО
1. РАЗБИВАЕМ ТЕКСТ НА КУСОЧКИ
• Берём предложение: "Кот съел мышь"
• Режем на токены: [Кот] [съел] [мышь]
• Каждый токен получает свой номер (как в школьном журнале)
2. ПРЕВРАЩАЕМ НОМЕРА В ТОЧКИ В ПРОСТРАНСТВЕ
• Берём номер "Кот" → идём в таблицу (embedding matrix) → достаём готовый вектор - список из 4096 чисел. Это и есть эмбеддинг.
• Каждое число - координата в многомерном пространстве. Теперь "Кот" и "кошка" - рядом, "кот" и "астероид" - далеко.
• Добавляем к каждой точке информацию о позиции - иначе фразы "кот укусил собаку" и "собака укусила кота" были бы одинаковыми.
3. ПОМЕЧАЕМ, КТО ЗА КЕМ СТОИТ
• Добавляем к каждой точке информацию о позиции
• Теперь [Кот] знает, что он первый, а [мышь] - последняя
• Модель отличает "кот укусил собаку" от "собака укусила кота"
4. СЛОВА ЗНАКОМЯТСЯ И ОБМЕНИВАЮТСЯ ИНФОРМАЦИЕЙ (САМОЕ ВАЖНОЕ)
Каждое слово задаёт три вопроса:
• ЧТО Я ИЩУ? - (Query / Запрос) - "Кот" ищет, кто что делает
• ЧТО Я МОГУ ДАТЬ? - (Key / Ключ) - "съел" говорит: "я про действие"
• ЧТО У МЕНЯ ВНУТРИ? - (Value / Значение) - у каждого слова есть своё содержание
Все слова одновременно:
• Сравнивают, что они ищут, с тем, что могут дать другие
• Находят, кто кому нужен
• Забирают нужную информацию у других
РЕЗУЛЬТАТ:
"Кот" узнал, что он что-то делает, "съел" понял, кто ест, "мышь" поняла, что её едят. Теперь слова знают контекст!
5. ПРОВЕРЯЕМ, НЕ ПОТЕРЯЛИ ЛИ МЫ НАЧАЛО
• После того как слова обменялись информацией (шаг 4), у каждого токена есть новое представление - учёл ли он соседей.
• Но есть риск: если сеть глубокая (32+ слоя), информация с первого слоя может «затухнуть» к последнему. Градиенты становятся слишком маленькими - сеть перестаёт учиться.
• Add (остаточная связь):
берём исходный вектор токена (то, что было ДО внимания) и прибавляем к нему результат внимания. Если новый слой ничего полезного не добавил - модель может «скопировать» вход дальше, не испортив его.
• Norm (нормализация):
«причёсываем» получившиеся числа - приводим их к стандартному разбросу (среднее 0, отклонение 1). Без этого одни нейроны будут «кричать», другие - «шептать», и обучение станет нестабильным.
• Вместе Add и Norm позволяют обучать сети глубиной в сотни слоёв. Без Add градиенты затухнут. Без Norm сеть развалится от перекоса чисел.
6. КАЖДОЕ СЛОВО ОСМЫСЛЯЕТ УСЛЫШАННОЕ
• После общего разговора (внимание) каждое слово уходит в свой "кабинет" - это слой FFN (Feed-Forward Network).
• Внутри кабинета: сначала вектор слова расширяется в 4 раза (чтобы было где записать сложные выводы), потом сжимается обратно.
• Что здесь происходит: слово "переваривает" услышанное от соседей, делает выводы, формулирует свою новую позицию.
• Без этого шага модель была бы просто «пересказчиком»: собрала бы информацию от соседей, но не смогла бы её переработать в новые смыслы. Attention - совещание, FFN - личный кабинет. Нужны оба.
7. СНОВА ПРОВЕРЯЕМ, НЕ ПОТЕРЯЛИ ЛИ НАЧАЛО
• После того как слово осмыслило услышанное в FFN, мы снова применяем Add&Norm.
• Add :
берём результат после внимания (то, что было ДО FFN) и прибавляем к результату FFN. Если FFN ничего полезного не добавил - можно вернуться к тому, что было после внимания.
• Norm :
снова «причёсываем» числа, чтобы обучение оставалось стабильным.
• Почему второй раз? Потому что FFN - это тоже обучаемый слой, который может испортить информацию. Страховка нужна после каждого преобразования.
8. ПОВТОРЯЕМ ШАГИ 4-7 МНОГО РАЗ (обычно 32–128 раз)
• Первый раз: слова понимают простые связи
• Пятый раз: начинают понимать словосочетания
• Десятый раз: видят, кто в предложении главный
• Тридцатый раз: улавливают настроение, иронию, скрытый смысл
9. ВЫБИРАЕМ СЛЕДУЮЩЕЕ СЛОВО
После того как все слои трансформера обработали входную последовательность, у нас есть вектор только последнего токена. Почему только последнего? Потому что он уже «впитал» через внимание информацию обо всех предыдущих.
9.1. LM Head - превращаем вектор в сырые оценки
LM Head (Language Modeling Head) - это финальный линейный слой. Он берёт вектор последнего токена (например, 4096 чисел) и умножает его на матрицу размера (размер_словаря × 4096). На выходе - логиты: вектор длины, равной размеру словаря (обычно 32 000 – 256 000). Каждое число - «сырая оценка» для одного токена.
Логиты могут быть любыми: положительными, отрицательными, большими или маленькими. Они не являются вероятностями. Чем больше логит, тем сильнее модель «склоняется» к этому токену.
Пример логитов (условно):
кот → 15.3
собака → 12.1
астероид → -2.0
9.2. Softmax - превращаем оценки в вероятности
Логиты неудобны для выбора: среди них есть отрицательные числа, и они не нормированы. Функция softmax решает обе задачи через экспоненту:
вероятность_ i = exp (логит_ i ) / sum ( exp (логит_ j ))
Почему экспонента?
Превращает любое число в положительное (e⁻² ≈ 0.14 - отрицательный логит стал маленьким, но положительным).
Сумма всех exp всегда положительна (деление на ноль исключено).
Сохраняет порядок: чем больше логит, тем больше экспонента, тем выше вероятность.
Даже очень плохой вариант получает ненулевой (пусть и крошечный) шанс - свойство «мягкого нормирования».
Считаем для примера:
Токен / Логит / exp(логит) / Вероятность
кот / 5.0 / e⁵ ≈ 148.4 / 148.4 / 168.6 ≈ 88%
собака / 3.0 / e³ ≈ 20.1 / 20.1 / 168.6 ≈ 12%
астероид / -2.0 / e⁻² ≈ 0.14 / 0.14 / 168.6 ≈ 0.08%
9.3. Выбираем токен (не всегда самый вероятный)
Если бы модель всегда выбирала токен с максимальной вероятностью (жадный поиск), текст был бы скучным и предсказуемым. Поэтому используют параметры:

10. ДОБАВЛЯЕМ ВЫБРАННОЕ СЛОВО И ПОВТОРЯЕМ (ЦИКЛ ГЕНЕРАЦИИ)
Выбранный токен (например, «кот») добавляется в конец входной последовательности.
Было: [Кот] [съел] [мышь]
Стало: [Кот] [съел] [мышь] [кот]
Теперь модель возвращается к шагу 4 (внимание), но с одним отличием: при вычислении внимания для нового токена «кот» она не видит будущих токенов (потому что их ещё нет). Это называется каузальным вниманием - как читать книгу, закрывая рукой ещё не прочитанные страницы.
Цикл повторяется:
Шаг 4–8: трансформер обрабатывает обновлённую последовательность (используя KV Cache, чтобы не пересчитывать старые токены каждый раз - см. Главу 4.1).
Шаг 9: выбирает следующий токен (например, «сказал»).
Шаг 10: добавляет его.
И так далее.
Генерация продолжается, пока:
не будет выбран специальный токен конца (EOS), или
не достигнут лимит длины.
КЛЮЧЕВОЕ ОТЛИЧИЕ ОТ ОБРАБОТКИ ВХОДА

ИТОГ ОДНОЙ ФРАЗОЙ
Чтобы получить ответ из N токенов, модель проходит шаги 4–10 N раз. Каждый раз - предсказание, добавление, повтор.
КОНЕЦ (получили осмысленный ответ)
Шаги 1–8 описывают обработку входного текста (промпта). При генерации ответа модель делает то же самое, но с одним отличием: она не видит будущие токены (потому что их ещё нет). Это называется каузальным вниманием.
Процесс генерации (на выход):
Шаг 9 выбрал токен → добавил его к входу → вернулся к шагу 4.
Снова внимание (только к прошлым токенам) → FFN → Add&Norm → шаг 9.
Повторять, пока не будет токен «стоп» или не достигнут лимит длины.
Поэтому один проход шагов 1–8 - это один шаг генерации. Чтобы получить ответ из 100 токенов, модель пройдёт этот цикл 100 раз.