Языковые модели: предсказание следующего слова
Языковая модель — это программа, которая угадывает, какое слово идёт дальше, и из этого простого фокуса вырастает весь ChatGPT.
Языковая модель — модель, которая предсказывает следующее слово в тексте и так умеет генерировать осмысленные ответы.
Помнишь автодополнение в телефоне? Ты пишешь «Сегодня я пойду в...», и над клавиатурой выскакивают три кнопки: «школу», «кино», «гости». Ты не задумывался, но это и есть крошечная языковая модель: она угадала, какое слово, скорее всего, идёт дальше. ChatGPT устроен по той же идее, только размер у него в миллиарды раз больше.
Зачем это вообще нужно
Давай сразу к результату, к которому мы придём в этом уроке. Возьмём наш сквозной текстовый пример из прошлых уроков — фразу «Кошка пьёт ...». Что идёт дальше? Ты почти не думая ответишь: «молоко». А почему не «асфальт» и не «таблицу»? Потому что ты тысячи раз слышал и читал, что кошки пьют именно молоко (ну или воду). У тебя в голове сложилось ощущение: одни продолжения вероятны, другие — почти невозможны.
Языковая модель делает ровно то же самое, только вместо «ощущения» у неё числа. К концу урока мы напишем маленькую программу, которая по фразе «Кошка пьёт» выдаст список слов-кандидатов с их вероятностями и выберет самое подходящее. Это и есть сердце любой языковой модели, от автодополнения до ChatGPT.
И тут важно поймать одну простую мысль, которая многих удивляет. Когда ты болтаешь с ChatGPT и он выдаёт длинный, красивый, складный ответ, кажется, будто внутри сидит кто-то умный, кто заранее придумал, что сказать, а потом аккуратно это записал. На самом деле всё гораздо приземлённее: модель не держит в голове готовый ответ. Она просто очень-очень хорошо угадывает, какое слово стоит дописать следующим, — и делает это много раз подряд. Из тысячи таких маленьких угадываний и складывается то, что выглядит как осмысленная речь. В этом уроке мы разберём именно это угадывание: что оно такое, как выглядит «в цифрах» и как его повторить в нескольких строчках кода. Понять этот механизм — значит понять, на чём держится вообще весь современный ИИ для текста.
Главная идея: всё сводится к одному вопросу
Звучит почти обидно, но это правда: огромный ChatGPT всё время отвечает на один и тот же вопрос — «какое слово (точнее, токен) идёт следующим?». Один раз. Потом ещё раз. И ещё. Так, слово за словом, и собирается целый ответ.
Если ты читал прошлый урок про то, как компьютер представляет слова токенами, то помнишь: модель работает не с буквами и не с целыми предложениями, а с токенами — кусочками текста. Дальше для простоты я буду говорить «слово», но в голове держи, что под капотом это токены.
Метафора: игра «угадай продолжение»
Представь компанию друзей, которые играют в игру. Один начинает фразу и обрывает её на полуслове: «Перед контрольной я всю ночь...». Остальные хором кричат продолжения: «зубрил!», «спал!», «играл!». Кто-то кричит увереннее, кто-то тише. Самый частый и уверенный выкрик — это и есть выбор модели.
Только модель не «знает» смысла. Она просто очень-очень много читала и запомнила, какие слова обычно стоят рядом. После «всю ночь» гораздо чаще встречалось «зубрил» или «не спал», чем «фотосинтез». Поэтому она и ставит на привычные продолжения высокие шансы.
Давай ещё на секунду задержимся на этой метафоре, потому что она объясняет очень многое. Заметь: в нашей игре участники кричат продолжения не наугад. Тот, кто прочитал сотни книг и видел тысячи мемов, угадывает гораздо точнее, чем тот, кто читал мало. Чем больше текстов «прослушал» игрок, тем тоньше он чувствует, что обычно идёт после чего. С моделью так же: всю свою «интуицию» она получает из гигантского количества текстов, которые ей показали при обучении. Если в этих текстах фраза «Кошка пьёт молоко» встречалась тысячи раз, а «Кошка пьёт асфальт» — ни разу, модель просто перенимает эту статистику. Она не рассуждает «асфальт твёрдый, его нельзя пить» — она лишь помнит, что такого сочетания почти не бывает. Это важная разница: у модели нет картины мира, у неё есть статистика языка. И, как мы увидим дальше, именно из-за этого она иногда уверенно говорит неправду.
Вероятности: не один ответ, а целый список
Вот ключевой момент, который многие пропускают. Модель не выдаёт один ответ. Она выдаёт распределение вероятностей — список всех возможных следующих слов с числом напротив каждого. Числа показывают, насколько модель уверена в каждом варианте, и в сумме дают единицу (то есть 100%).
Для фразы «Кошка пьёт» это могло бы выглядеть так:
| Слово-кандидат | Вероятность |
| молоко | 0.55 |
| воду | 0.30 |
| чай | 0.08 |
| сок | 0.05 |
| асфальт | 0.02 |
Видишь? «Молоко» и «воду» забрали почти всё, «асфальт» получил жалкие 2% — модель как бы говорит: «теоретически возможно, но крайне странно». Это похоже на ленту рекомендаций в соцсети: тебе не показывают один ролик, а ранжируют сотни и ставят сверху те, что вероятнее тебе зайдут.
Зачем вообще нужен целый список, если в итоге всё равно выберется одно слово? Затем, что список — это и есть «честный» ответ модели, а выбор одного слова — уже отдельный шаг поверх него. Имея список, можно вести себя по-разному: можно строго брать верхушку, можно иногда заглядывать ниже ради разнообразия, можно вообще показать пользователю несколько вариантов на выбор (так и делает автодополнение, предлагая три кнопки). Кроме того, по этим числам видно, насколько модель вообще уверена. Если у верхнего кандидата 95% — модель почти не сомневается. Если же у топового слова всего 12%, а за ним плотной кучей идут ещё десять кандидатов, это сигнал: фраза неоднозначная, продолжений много, и любой ответ тут — лишь один из многих возможных. Настоящие модели работают не с пятью кандидатами, как в нашей табличке, а со всем своим словарём — это десятки тысяч токенов сразу, и у каждого есть своё число. Просто почти у всех оно крошечное, близкое к нулю, а заметную вероятность набирает лишь горстка подходящих по смыслу слов.
Разбор на примерах
Пример 1: выбираем самое вероятное слово
Давай оживим нашу таблицу в коде. Сделаем словарь «слово → вероятность» и найдём кандидата с максимальным числом.
// Распределение вероятностей для фразы "Кошка пьёт ..."
const candidates = {
"молоко": 0.55,
"воду": 0.30,
"чай": 0.08,
"сок": 0.05,
"асфальт": 0.02,
};
// Ищем слово с наибольшей вероятностью
let best = null;
let bestProb = 0;
for (const word in candidates) {
if (candidates[word] > bestProb) {
bestProb = candidates[word];
best = word;
}
}
console.log("Кошка пьёт " + best);
console.log("Уверенность модели: " + (bestProb * 100) + "%");Что тут происходит по шагам:
- Мы записали кандидатов и их вероятности в объект — это и есть «список с числами», который выдала бы модель.
- Перебираем всех кандидатов и запоминаем того, у кого число больше.
- Печатаем фразу с дописанным словом и уверенность в процентах.
Вывод:
Кошка пьёт молоко Уверенность модели: 55%
Выбор слова с максимальной вероятностью называют «жадным» — модель просто хватает самый большой кусок. Это надёжно, но скучновато: при одной и той же фразе ответ всегда один и тот же.
Пример 2: ответ не всегда самый вероятный
Если бы ChatGPT всегда выбирал только топовое слово, он отвечал бы как заевшая пластинка. Поэтому модели часто немного случайничают: бросают «кубик», но взвешенный — у кого вероятность выше, тот выпадает чаще. Так у «воду» (30%) есть реальный шанс, а у «асфальт» (2%) — почти нет.
const candidates = {
"молоко": 0.55,
"воду": 0.30,
"чай": 0.08,
"сок": 0.05,
"асфальт": 0.02,
};
// Бросаем "взвешенный кубик": выбираем слово с учётом вероятностей
function pickWeighted(probs, roll) {
let sum = 0;
for (const word in probs) {
sum += probs[word];
if (roll <= sum) {
return word;
}
}
}
// Прогоним несколько фиксированных "бросков" от 0 до 1
const rolls = [0.1, 0.45, 0.7, 0.95, 0.99];
for (const r of rolls) {
console.log("бросок " + r + " -> " + pickWeighted(candidates, r));
}Идея простая: мы выкладываем вероятности в линию от 0 до 1 (молоко занимает участок 0–0.55, воду 0.55–0.85 и так далее) и смотрим, на чей участок попал «бросок».
Вывод:
бросок 0.1 -> молоко бросок 0.45 -> молоко бросок 0.7 -> воду бросок 0.95 -> сок бросок 0.99 -> асфальт
Заметь: чаще всего выпадает «молоко», иногда «воду», а «асфальт» вылез только при броске 0.99 — то есть почти никогда. Именно поэтому ChatGPT на один и тот же вопрос может ответить чуть по-разному: он каждый раз бросает такой взвешенный кубик. За «степень случайности» отвечает настройка, которую называют температурой.
Про температуру стоит сказать чуть подробнее, потому что это слово ты не раз встретишь, играясь с нейросетями. Низкая температура — кубик «утяжелён» в сторону самых вероятных слов, модель ведёт себя осторожно и почти всегда выбирает верхушку: ответы получаются предсказуемыми и сухими, зато надёжными. Высокая температура — кубик «разболтан», и у редких слов появляется заметный шанс выпасть: ответы становятся неожиданными и творческими, но растёт риск, что модель свернёт куда-то не туда и начнёт нести бессмыслицу. Это как настройка отваги у игрока в нашей игре: на низкой он кричит только самое очевидное, на высокой — выдаёт смелые варианты, среди которых попадаются и гениальные, и совсем мимо. Когда люди просят нейросеть придумать рэп или сказку, ставят температуру повыше; когда нужен точный технический ответ — пониже. Никакого «правильного» значения тут нет, это просто ручка громкости для случайности.
Пример 3: ответ собирается слово за словом
Теперь самое важное: модель не придумывает весь ответ сразу. Она дописывает одно слово, приклеивает его к фразе и спрашивает себя снова — какое слово дальше? И так по кругу.
// Очень упрощённая "модель": знает пару продолжений
const rules = {
"Кошка": "пьёт",
"Кошка пьёт": "молоко",
"Кошка пьёт молоко": "из",
"Кошка пьёт молоко из": "миски",
};
let phrase = "Кошка";
// 4 раза дописываем по одному слову
for (let step = 1; step <= 4; step++) {
const next = rules[phrase];
if (!next) break;
phrase = phrase + " " + next;
console.log("Шаг " + step + ": " + phrase);
}Разбор: на каждом шаге мы смотрим текущую фразу, находим для неё следующее слово и приклеиваем. Фраза растёт по одному слову за итерацию — точно как печатает ChatGPT, когда ты видишь, как текст появляется кусочками.
Вывод:
Шаг 1: Кошка пьёт Шаг 2: Кошка пьёт молоко Шаг 3: Кошка пьёт молоко из Шаг 4: Кошка пьёт молоко из миски
Вот и весь фокус. Настоящая модель вместо словаря с правилами использует нейросеть с миллиардами весов, но логика «дописал слово → спросил заново» абсолютно та же.
Обрати внимание на одну деталь, которая многое объясняет в поведении ChatGPT. На каждом новом шаге модель смотрит не только на исходный вопрос, но и на всё, что уже успела написать сама. То есть свежедописанное слово тут же становится частью «контекста» для следующего предсказания. Это и хорошо, и опасно. Хорошо — потому что ответ получается связным: модель помнит, о чём начала фразу, и аккуратно её продолжает. Опасно — потому что если она один раз ошиблась и вставила неудачное слово, дальше она будет честно достраивать ответ уже вокруг этой ошибки, а не вопреки ей. Никакого внутреннего редактора, который оглянулся бы назад и сказал «стоп, тут чушь», у неё нет — она всё время смотрит только вперёд. Поэтому иногда ответ начинается бодро и по делу, а к концу уезжает в сторону: одно неточное слово потянуло за собой другое.
Частые ошибки и подводные камни
- «Модель понимает смысл фразы». Нет. Она опирается на статистику: какие слова обычно стоят рядом. Поэтому она уверенно ставит «молоко» после «кошка пьёт», но это не значит, что она знает, что такое кошка или жажда.
- «Раз ответ звучит уверенно — он верный». Опасная ловушка. Модель всегда выбирает вероятное продолжение, а вероятное не равно правдивому. Так рождаются галлюцинации — уверенно звучащие, но выдуманные ответы. Высокая вероятность слова в тексте и факт из жизни — разные вещи.
- «Модель выдаёт один правильный ответ». На самом деле она выдаёт целый список кандидатов с числами и лишь потом выбирает один. Если думать, что ответ ровно один, не понять, почему ChatGPT отвечает по-разному на один вопрос.
- «Случайность — это баг». Наоборот, это специально. Без лёгкой случайности (температуры) ответы были бы однообразными, как у автодополнения. Но если случайности слишком много, модель начинает нести чушь — выбирает редкие, неподходящие слова.
- «Модель видит сразу всё предложение». Она строит ответ по одному слову, опираясь на уже написанное. Поэтому ранняя ошибка в ответе может потянуть за собой следующие — модель честно продолжает то, что уже сказала.
Мини-практика: свой мини-предсказатель
Теперь твоя очередь. Ниже заготовка — распределение для новой фразы «Перед контрольной я всю ночь ...». Допиши код так, чтобы он: (1) напечатал всех кандидатов с их вероятностями в процентах и (2) вывел самого вероятного.
const candidates = {
"зубрил": 0.50,
"не спал": 0.25,
"играл": 0.15,
"гулял": 0.10,
};
// 1) Напечатай каждого кандидата в виде "слово: 50%"
for (const word in candidates) {
console.log(word + ": " + (candidates[word] * 100) + "%");
}
// 2) Найди и напечатай самое вероятное продолжение
let best = null;
let bestProb = 0;
for (const word in candidates) {
if (candidates[word] > bestProb) {
bestProb = candidates[word];
best = word;
}
}
console.log("Самый вероятный ответ: " + best);Вывод:
зубрил: 50% не спал: 25% играл: 15% гулял: 10% Самый вероятный ответ: зубрил
Когда заработает — попробуй усложнить: добавь своего кандидата «смотрел мемы» с маленькой вероятностью и проследи, чтобы сумма всех чисел оставалась около единицы. Можешь подключить «взвешенный кубик» из примера 2 и посмотреть, как меняются ответы.
Итоги
- Языковая модель снова и снова отвечает на один вопрос: какое слово (токен) идёт следующим.
- Она выдаёт не один ответ, а список кандидатов с вероятностями, которые в сумме дают единицу.
- Можно брать самое вероятное слово («жадно») или слегка случайничать — поэтому ответы ChatGPT бывают разными.
- Ответ собирается слово за словом: дописал — спросил снова.
- Вероятное не значит правдивое — отсюда галлюцинации; модель опирается на статистику, а не на понимание.
Если связать это с тем, что было раньше в курсе, картинка складывается вот в такую цепочку. Сначала наш сквозной пример был просто фразой, которую человек продолжает по привычке. Потом мы научились дробить текст на токены — кусочки, которыми оперирует модель. Теперь добавилось главное: модель не просто хранит токены, она для любого начала текста умеет назвать вероятность каждого следующего токена. Это и есть языковая модель — и ровно эта способность, повторённая миллионы раз, превращается в диалог с ChatGPT. Тот же самый сквозной пример «Кошка пьёт ...», с которого мы начали наивно, теперь выглядит как настоящая, пусть и крошечная, задача предсказания.
Мы прошли наш сквозной пример «Кошка пьёт ...» от ощущения в голове до распределения вероятностей в коде. Но откуда модель вообще берёт эти числа? Она же не просто заучила пары слов из словаря. В следующем уроке заглянем глубже: как модель учится этим вероятностям на огромных текстах и почему именно для этого ей нужна архитектура под названием трансформер.