Книга: Инжиниринг искусственного интеллекта
Назад: 7.4 Сценарий: утро с двойником
Дальше: 2. КЛЮЧЕВЫЕ МЫСЛИ КНИГИ 1

РЕЗЮМЕ К ГЛАВЕ 7

Проблема сегодня: человек сам переключается между десятком приложений, копирует данные, помнит контексты - тратит когнитивные ресурсы на работу коммутатора.



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



Уровень 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. КАК ТРАНСФОРМЕР ПОНИМАЕТ

НАЧАЛО

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 раз.





Назад: 7.4 Сценарий: утро с двойником
Дальше: 2. КЛЮЧЕВЫЕ МЫСЛИ КНИГИ 1