Языковые модели: предсказание следующего слова

Языковая модель — это программа, которая угадывает, какое слово идёт дальше, и из этого простого фокуса вырастает весь 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) + "%");

Что тут происходит по шагам:

  1. Мы записали кандидатов и их вероятности в объект — это и есть «список с числами», который выдала бы модель.
  2. Перебираем всех кандидатов и запоминаем того, у кого число больше.
  3. Печатаем фразу с дописанным словом и уверенность в процентах.

Вывод:

Кошка пьёт молоко
Уверенность модели: 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. Тот же самый сквозной пример «Кошка пьёт ...», с которого мы начали наивно, теперь выглядит как настоящая, пусть и крошечная, задача предсказания.

Мы прошли наш сквозной пример «Кошка пьёт ...» от ощущения в голове до распределения вероятностей в коде. Но откуда модель вообще берёт эти числа? Она же не просто заучила пары слов из словаря. В следующем уроке заглянем глубже: как модель учится этим вероятностям на огромных текстах и почему именно для этого ей нужна архитектура под названием трансформер.

Проверьте себя
1. Что в первую очередь делает языковая модель?
AПонимает смысл фразы как человек
BПредсказывает, какое слово (токен) идёт следующим
CПереводит текст на другой язык
DПроверяет факты в интернете
2. Что модель выдаёт на каждом шаге?
AРовно одно слово и больше ничего
BЦелое готовое предложение сразу
CСписок слов-кандидатов с вероятностями
DСлучайную букву
3. Почему ChatGPT может по-разному отвечать на один и тот же вопрос?
AПотому что у него ломается память
BПотому что он немного случайничает, бросая взвешенный кубик
CПотому что он каждый раз заново обучается
DПотому что он спрашивает у других пользователей
4. Почему уверенный ответ модели может оказаться неправдой (галлюцинацией)?
AМодель выбирает вероятное продолжение, а вероятное не равно правдивому
BМодель специально врёт пользователю
CМодель не умеет считать вероятности
DЭто случается только при поломке сервера
5. Как модель собирает длинный ответ?
AПишет сразу весь текст за один проход
BДописывает по одному слову, приклеивает и спрашивает себя снова
CБерёт готовый ответ из базы данных
DСоединяет случайные предложения
6. Для фразы «Кошка пьёт ...» какое слово модель оценит как самое вероятное?
Aасфальт
Bтаблицу
Cмолоко
Dфотосинтез