Глава 16 из 17 35 мин
Думать и пользоваться Python
Базовая модель продолжает текст. Формат чата с новыми ролями, четверть миллиона разговоров и четыре круга исправлений превращают её в чат, который думает перед ответом и отдаёт арифметику программе на Python — и программа действительно запускается.
В этой главе
- прочитать формат чата с системным сообщением, мыслями и вызовами инструмента по токенам и сказать, какие из них учит функция потерь
- объяснить, почему маленькой модели помогает записывать шаги, откуда у Ростка-2 мысли и почему в арифметике инструмент сильнее мыслей
- проследить дообучение как череду исправлений: симптом, данные, которые его вызвали или вылечили, и замер
Глава 16 закончилась моделью, которая многое знает о том, как выглядит текст, и отвечает на вопрос, только если ответ случайно оказывается самым вероятным продолжением. В этой главе она превратится в чат, который ждёт вас внизу страницы. Для этого понадобятся формат чата с ролями, которых у Ростка-1 не было, мысли перед ответом, инструмент на Python, который действительно запускается, и четыре круга дообучения.
Четыре круга никто не планировал: каждый следующий исправляет то, что предыдущий сломал или чему не научил. Изнутри дообучение обычно так и выглядит, и рассказ будет таким же — симптомы, данные за ними и замеры.
До дообучения
В главе 12 базовая модель Ростка-1 терялась в шаблоне чата: <|user|> и <|assistant|> она не видела ни разу. У базовой модели Ростка-2 положение другое. На спуске, в последней пятой части предобучения, 3% смеси составляли разговоры для дообучения, выписанные обычными токенами, — 87 миллионов, чтобы специальные токены потом не были совсем новыми; ошибка на них за 500 шагов упала с 2,59 до 1,59 (глава 15). Формат базовая модель видела. Как себя в нём вести — не знает.
Чтобы увидеть, что изменило дообучение, мы задали каждой версии Ростка-2 одни и те же 22 вопроса: 16 простых фактов, четыре умения (кто он, сколько r в слове «strawberry», команда shell, день недели) и два примера с большими числами. Каждый вопрос звучал четыре раза при температуре 0,5 — сначала без системного сообщения, потом с тем, которое включает Python. Начните с базовой модели и пройдите по версиям.
probe.py, с мыслями и запущенными программами. Каждая ступенька — версия Ростка-2 в том порядке, в каком их делали; точки — сколько ответов из четырёх верны. Таблица ниже подводит итог по всей группе вопросов.Вот базовая модель в формате чата, до всякого дообучения:
- «Hi! Who are you?» — «I'm [Your Name]. It's nice to meet you. What would you like to talk about?» Как здоровается ассистент, она знает вплоть до заготовки в квадратных скобках. Кто она сама — понятия не имеет.
- «What is the capital of the USA?» — «The capital of the United States is New York City», оба раза. Всего на вопросы о фактах она отвечает верно в 70% случаев, в среднем по 40 слов, и после ответа её несёт дальше.
- «How many legs does a spider have?» — в одном ответе четыре, в другом восемь: верны два из четырёх.
- «What is 1234 * 5678?» — она думает: «Split 5678 into 500 + 6. 1234 x 500 = 60000…» и приходит к 78888. Форму мысли она взяла из разговоров, которые видела на спуске; арифметика — наугад. Верный ответ — 7 006 652.
Теперь включите Python. Базовая модель пишет программу на 94% вопросов о фактах, и доля верных ответов падает до 14%. На вопрос о столице Бразилии она пишет функцию с capital_of_brazil = "Paris", программа честно печатает Paris, и модель докладывает: «The answer is Paris.» В разговорах её спуска системное сообщение об инструменте встречалось только там, где инструментом пользовались, и она выучила правило «объявили инструмент — пиши программу». Модель учит ровно то, что показывают данные, включая закономерности, которые туда никто не собирался класть; в этой главе мы наткнёмся на это ещё не раз.
Формат с новыми ролями
У Ростка-1 было четыре специальных токена. Токенизатор Ростка-2 отводит под них последние 16 номеров из 32 768, и девять из них составляют формат чата:
| токен | номер | что он отмечает |
|---|---|---|
<|endoftext|> | 32752 | начало каждого разговора, как и каждого документа |
<|system|> | 32756 | указания от страницы, необязательные, раньше всего остального |
<|user|> | 32753 | реплика человека |
<|assistant|> | 32754 | реплика Ростка |
<|think|> … <|/think|> | 32757, 32758 | его мысли, в начале реплики |
<|tool_call|> | 32759 | вместо ответа: имя инструмента в первой строке, дальше то, что ему передать |
<|tool_result|> | 32760 | то, что напечатал инструмент; пишет страница |
<|end|> | 32755 | конец любой реплики |
Остальные семь — три метки заполнения середины из главы 14, они нужны только в предобучении, и четыре запасных номера, которые ждут агента из третьей части. Вызов инструмента после своего токена — обычный текст: <|tool_call|>python, перевод строки и программа ровно в том виде, в каком её сохранили бы в файл. Никакого JSON, никаких экранированных кавычек и переводов строк: маленькая модель надёжнее пишет код, когда код выглядит так, как код выглядит всегда.
Маска в функции потерь — идея из главы 12, только внутри реплики Ростка теперь два новых вида токенов. Его мысли и вызовы инструмента модель учится предсказывать, как и ответы, и <|end|>, которым закрывается каждая его реплика. Системное сообщение, вопрос и вывод инструмента она только читает: результат инструмента пишет страница, как вопрос пишет человек, так что учиться его предсказывать незачем.
sft.py, выученные токены подчёркнуты. «Что отправляет чат» — строка, которую страница отправляет на каждом шаге разговора, и токены, которые модель должна дописать.Пример с Python вместе с системным сообщением занимает 90 токенов, и функция потерь учит 50 из них; 12 токенов системного сообщения модель только читает. С вызовом Python реплика модели кончается программой, а после результата начинается вторая реплика <|assistant|>; «Что отправляет чат» показывает тот же разговор как два шага, которые проходит страница.
Вот render() из sft.py Ростка-2 — та же функция, что в главе 12, с новыми ролями:
У страницы чата есть своя копия на JavaScript (chatIdsV2 в kit/chatformat.js), и тесты курса проверяют, что она даёт ровно те номера, на которых учится sft.py: лишний пробел между тем, как модель учили, и тем, как её спрашивают, — и она молча работает по сценарию, которого не видела. Заметьте, что такое на самом деле переключатель Python в чате. Не настройка внутри модели, а это самое системное сообщение, You can run Python code with the python tool., — двенадцать токенов в начале строки. Без них вызова инструмента в обучающих данных не было ни разу.
Какие токены в обучающем разговоре с вызовом инструмента модель учится предсказывать?
Результат инструмента пишет страница, как вопрос — человек, так что модели никогда не приходится его порождать. А всё, что модель в чате пишет сама, она и учится писать: мысли, программу (так она и учится программировать) и ответ, и каждый <|end|>, которым сообщает странице, что закончила реплику.
Думать вслух
Зачем модели вообще записывать мысли? Дело в том, как она вычисляет. На каждый токен, который пишет Росток-2, все 30 блоков срабатывают один раз: примерно по две операции на параметр, около 250 миллионов, плюс внимание. Столько же — на слово «the» и на очередную цифру произведения 1234 × 5678. Остановиться и подумать над трудным токеном подольше модель не может. Зато может писать: каждый записанный токен возвращается на вход, и внимание даёт каждому следующему токену его прочитать. Мысль из 40 токенов — это 40 лишних проходов через все 30 блоков до ответа и место, куда записать промежуточные результаты так, чтобы следующий шаг их нашёл.
Откуда у Ростка-2 мысли? Их не писал для нас ИИ-ассистент. Источников три:
- GSM8K (Cobbe и соавторы, 2021): школьные текстовые задачи с решениями по шагам, которые писали люди.
build_sft.pyвычищает пометки калькулятора вроде<<48/2=24>>, шаги становятся мыслью, а последнее число — ответом «The answer is 24.» - MetaMathQA (Yu и соавторы, 2023): открытый набор перефразированных задач и решений, который его авторы сделали с помощью GPT-3.5.
- Наши генераторы: 30 000 задач семнадцати видов из
reasoning.py— столбики, умножение с разбиением числа, простые числа, подсчёт букв, слова по алфавиту, дни недели, часы, сдача, скидки, единицы измерения, чтение кода на Python и другое. Вопрос, шаги и ответ пишет код, поэтому они верны по построению.
Вот два генератора, скопированные из reasoning.py. Запустите их, а потом следующую ячейку.
«Strawberry» — первое слово в списке генератора. Если сделать 30 000 задач так, как это делает build_sft.py, — reasoning.make(30000, seed=1), — то в 19 из них это слово разбирается по буквам, но про его r спрашивает только одна: Count the letter r in "strawberry". В первом виджете выберите «strawberry» и пройдите по версиям. Начиная с первого этапа, мысли безупречно разбирают слово, s-t-r-a-w-b-e-r-r-y, а потом ошибаются: «The letter r is at positions 4, 9. That makes 2.» Ни одна версия не ответила верно больше одного раза из четырёх.
Разбор по буквам — не украшение. В вопросе « strawberry» — один токен, номер 26954, и букв внутри него модель не видит. По буквам слово становится десятью токенами, s -t -r -a -w -b -e -r -r -y, и каждая r теперь на виду: три копии одного токена -r, номер 4504. Но буква в вопросе — « r», токен 377, и чтобы ответить, модель должна связать одно с другим, а потом сосчитать совпадения. Считать одинаковые токены вниманию, как известно, трудно: оно берёт взвешенное среднее того, на что смотрит, а среднее трёх одинаковых токенов ничем не отличается от среднего двух.
С днём недели то же самое: «A week has 7 days, so only the remainder matters: 10 = 1 x 7 + 5. Going forward 5 days from Monday gives Friday.» Форма — генератора, остаток неверный (10 = 1 × 7 + 3), да и пять дней от понедельника — не пятница. Четверг не нашла ни одна версия. И примеры с числами: reasoning.py перемножает числа до 99 × 99 и складывает до 9 999, так что для 1234 × 5678 модель прикладывает знакомую форму к невиданным числам («Split 5678 into 567 + 78» — это даже не разбиение 5678), а её сложение столбиком для 98765 + 43210 путает разряды и приходит к 141 777.
Мысль — это формат, которому модель подражает. Она даёт модели больше шагов и место для записей, но каждый шаг — всё то же угадывание следующего токена, и верен он ровно настолько, насколько верны эти догадки.
Насколько мысли помогают в целом? Из 1 319 задач тестовой части GSM8K думающий чат решает 10,7%. Та же модель, когда пишет программу на Python, — 25,6%. Для арифметики есть кое-что лучше, чем думать старательнее: отдать вычисление тому, кто не ошибается.
Инструмент, который действительно запускается
Цикл такой. Когда Росток-2 решает воспользоваться Python, его реплика становится такой: <|tool_call|>python, перевод строки, программа и <|end|>. Страница замечает токен <|tool_call|>, берёт программу и запускает её. Всё, что программа напечатала, возвращается новой репликой — <|tool_result|>7006652<|end|>, — за которой идёт открытый <|assistant|>, и модель пишет дальше, теперь уже с результатом перед глазами. Она может позвать Python ещё раз, до трёх раз за ответ; потом должна ответить.
Программа про Бразилию отрабатывает безупречно и печатает Paris. Инструмент точно вычисляет то, что ему дали; дали ли ему то, что нужно, — по-прежнему забота модели. Python делает точной арифметику, а не осмысленными вопросы. А «бесконечный цикл» показывает, зачем странице ограничение по времени: программа, написанная моделью, — такая же программа, как любая другая, и она может никогда не закончиться.
Как страница запускает программу модели
Чат использует Pyodide — CPython, скомпилированный в WebAssembly, тот же Python, что выполняет ячейки с кодом в этом курсе, но в отдельном Web Worker (kit/pytool.js). Программа, которая не заканчивается, не может заморозить страницу: через 8 секунд поток выбрасывается, а в следующий раз запускается новый. Каждый вызов получает чистое пространство имён, так что одна программа не оставит переменных следующей, а вывод обрезается до 1 500 знаков, прежде чем уйти к модели. Всё выполняется на вашем устройстве: сервера, который запускал бы код, у страницы нет.
Где модель научилась звать инструмент? На TinyGSM (Liu и соавторы, 2023) — открытом наборе школьных текстовых задач, решённых короткими программами на Python в одном стиле: функция simple_math_problem() с вопросом в строке документации, несколько переменных с понятными именами, return. Мы не верили программам на слово: build_sft.py запускал каждую отобранную программу в отдельном процессе с ограничением в три секунды, оставлял только те, что завершились и напечатали число, и делал это число результатом инструмента. В каждом обучающем примере результат инструмента — то, что программа действительно напечатала. На втором этапе добавилась арифметика с большими числами, сделанная кодом: «Big numbers: I will let Python compute this.», print(1234 * 5678), результат, ответ.
Вот весь замер — GSM8K тремя способами для каждой версии, которую проверяли целиком: как начало функции в стиле TinyGSM (родной формат базовой модели), как вопрос в чате с выключенным Python и с включённым, когда программы действительно запускались.
В уме чат решает 11–13%, какую версию ни возьми; с Python — вдвое больше. Выделяется одна строка: первая попытка второго этапа, где с Python всего 17%, а вызовов Python — 559 на 1 319 задач. Об этом — следующий раздел.
Дообучение как череда исправлений
Сначала данные — и кто какую их часть написал. Это важно: маленькая модель копирует свои данные очень близко к тексту.
| данные | кто писал |
|---|---|
| smol-smoltalk (HuggingFaceTB, Apache-2.0) обычные разговоры, пересказы, выжимки, задачи на код | более крупные открытые модели: набор сам синтетический |
| разговоры Ростка-1 и 320 новых о том, кто такой Росток-2 беседы на уровне Ростка (без тех, где речь о размере Ростка-1) | ИИ-ассистент Claude по нашему заданию |
GSM8K, MetaMathQA, reasoning.pyмысли перед ответом | люди; авторы MetaMathQA с помощью GPT-3.5; наш код |
| TinyGSM, арифметика вызовы Python | программы TinyGSM, каждую запускали мы; арифметику сделал код |
| 2 850 диалогов (этап 1), 720 просьб что-то написать (этап 4) компьютеры, командная строка, Python, данные из веба, понятия, география; письма, записки, заметки | ИИ-ассистент Claude по нашему заданию |
| таблицы фактов (этап 4) столицы, валюты, символы элементов, годы | mledoze/countries (ODbL), periodictable (данные NIST), список из 60 годов в facts.py; вопросы составил код |
Этап 1: разговаривает и выдумывает
Первый круг — самый большой: 258 124 разговора из всего перечисленного, кроме арифметики (она пришла на втором этапе) и строк четвёртого этапа, два прохода, 1 597 шагов, 64 миллиона выученных токенов. Ошибка на отложенных данных упала на всех видах: обычные разговоры — с 1,440 до 1,273, мысли — с 0,354 до 0,246, наши новые диалоги — с 2,598 до 2,228.
Переведите первый виджет на этап 1. На факты модель отвечает верно в 84% случаев, вдвое короче, но с подробностями, о которых никто не спрашивал; модель на 125 миллионов параметров знает название столицы куда лучше, чем подробности вокруг него: «The capital of the United States is Washington, D.C. It sits on the Pasco River, just south of the city of Seattle.» Включите Python — и модель забывает, кто она («I'm Rohan, a software engineer…»), и пишет программу на треть вопросов о фактах: химический символ золота у неё — gold_symbol = "g". В браузере, в 4 битах, она писала программу на любой вопрос. Причина та же, что у базовой модели: в данных первого этапа сообщение об инструменте встречалось только в разговорах с инструментом и ни разу — рядом с разговорами о том, кто такой Росток.
Этап 2: инструмент — по желанию
Второй этап короткий: 266 шагов от модели первого этапа на 16 990 разговорах. 6 320 из них — обычные разговоры с добавленным сообщением об инструменте: инструмент включён, а Росток просто отвечает. 4 766 — случаи, когда звать Python правильно: арифметика с большими числами и задачи TinyGSM. 5 904 — повтор первого этапа, чтобы ничего другого не забылось. Ошибка на отложенной арифметике с инструментом за первые 100 шагов упала с 2,296 до 0,023.
По проверке всё получилось: с включённым Python модель больше не звала его ради фактов и рассказа о себе, для примеров с числами звала всегда и снова стала Ростком-2. А потом GSM8K показал 17% вместо 25% и всего 559 вызовов на 1 319 задач. Причина нашлась в данных: среди разговоров «инструмент включён, отвечаем сами» оказались 1 718 текстовых задач из MetaMathQA и GSM8K, решённых в уме, рядом с 1 916 решёнными через Python. Модель выучила ровно это — пользоваться Python примерно в половине текстовых задач, — а в уме она решает вдвое хуже.
Исправление — одна строка build_sft.py с комментарием, который всё объясняет:
Теперь при включённом Python текстовая задача с числами всегда идёт через Python — в переделанном наборе 3 416 вызовов на задачах TinyGSM, — а думать в уме остаётся для выключенного Python и для головоломок без вычислений. Ещё один побочный эффект видно в виджете при выключенном Python: начиная со второго этапа, для больших чисел модель иногда всё равно пишет вызов инструмента, хотя ответить ей некому. Чат в конце страницы сообщает, когда это происходит, и предлагает включить Python.
Первая попытка второго этапа решила с Python 17% GSM8K против 25% у первого этапа. Что пошло не так?
Цифры сходятся, если программы, которые она писала, были не хуже прежних: просто она писала их меньше чем для половины задач (559 вызовов на 1 319), а остальные решала в уме, где верно выходит около 11%. Уберите такие разговоры из части данных «инструмент включён» — и вызовы, а с ними и результат, возвращаются.
Этап 3: короткие справки и расползшаяся краткость
Выдуманные подробности надо было убрать: маленькая модель, добавляя «ещё один факт», чаще всего добавляет выдуманный. Третий этап обрезал ответы на справочные вопросы из наших диалогов по географии до первого предложения («capital of mongolia» — «It's Ulaanbaatar.»), вопросы «почему», «как» и «чем отличается» оставил целыми и показал 409 коротких ответов дважды — 818 разговоров из 4 138. Ещё мы понизили температуру чата с 0,7 до 0,5.
Ответы о фактах стали короче, с 24 слов до 10, и верных стало больше. Но краткость расползлась за пределы справок. «Explain how a rainbow forms» получило 13 слов, «Tell me about the Moon» — от 2 до 34. Длину сохранили только письма и сказки. Во второй попытке справки показали один раз, рядом с 1 500 длинными ответами на просьбы «объясни», «расскажи о» и «напиши» из openhermes, smol-constraints и наших диалогов, — чтобы «на справки отвечай коротко» не превратилось в «отвечай коротко на всё». Переделанный второй этап и этот третий поверх него — ступенька «этапы 2–3 исправлены»: GSM8K с Python снова 23,7% при 1 314 вызовах, Python никогда не зовётся ради фактов и рассказа о себе и всегда — ради примеров с числами, на факты 77–81% верных ответов, примерно по десять слов.
Этап 4: письма по просьбе и таблицы фактов
Потом модель споткнулась на бытовой просьбе: «write me an email to my boss asking for a day off» — «I can't accept emails…». Она спутала «написать текст» с «отправить»: в разговорах Ростка-1 честно сказано, что отправить он ничего не может. Четвёртый этап дважды показал 720 новых диалогов с бытовыми просьбами что-то написать (письма, записки, заметки, стихи, тосты; 42 из них — «отправь сам» с ответом «I can't send emails, but here is one you can send») вместе с таблицами фактов из следующего раздела и повтором 4 000 разговоров третьего этапа: 82 шага.
Теперь на просьбу о письме начальнику приходит полное письмо в 60–110 слов, а «write me short letter about llm» — 100–170 слов вместо 34–76. У исправлений и здесь есть цена: расползлись заготовки в скобках («I'm writing to tell you about [a project or task]»), а объяснения стали чуть хуже — ошибка на отложенных выросла с 1,287 до 1,330. Мягкий вариант (письма один раз, вдвое меньшая скорость обучения) оказался хуже по обоим пунктам, и его не взяли. GSM8K с Python дошёл до 25,6% — лучший результат из всех версий.
Данные учат ровно тому, что в них есть. Каждое исправление здесь — это изменение данных, и каждый симптом сначала был в данных и только потом в модели.
Факты из таблицы
Может ли дообучение научить модель фактам, которых она не знает? Четвёртый этап попробовал. facts.py превратил таблицы в вопросы: столицы и валюты стран ООН, символы химических элементов и годы 60 известных событий, каждый факт — тремя-пятью фразами, всего 1 734 вопроса. Пятую часть стран, элементов и событий отложили целиком. Потом и выученные, и отложенные факты спросили фразами, которых в обучении не было («Tell me the capital of …»), жадной выборкой, до четвёртого этапа и после.
facts.py, и случай Бразилии.Факты из таблицы подтянулись: столицы с 29% до 46%, валюты с 13% до 23%, символы элементов с 10% до 44%, годы с 40% до 73%. Отложенные почти не сдвинулись: столицы с 26% до 29%, валюты с 11% до 17%, годы — 25% и до, и после. Исключение — символы: с 26% до 43% даже у элементов, которых в таблице не было. Многие из них модель уже знала и выучила форму ответа — «The chemical symbol for X is Y» вместо «Gold is a metal with a symbol of eternal life». Факты учатся по одному и лишь отчасти — по три-пять примеров на каждый.
В примерах Саудовская Аравия и Алжир из таблицы теперь получают свои столицы, а Мальта и Палау, тоже оттуда, — «Malta» и «Palau». У отложенной Северной Кореи столица переехала из Пхеньяна в Сеул: дообучение сдвигает и факты, которых не касалось. А Бразилия была в таблице ровно в словах нашей проверки — «What is the capital of Brazil?», с ответом Brasília. Модель по-прежнему говорит «Рио-де-Жанейро», теперь во всех четырёх попытках. Убеждение, сложившееся за девять миллиардов токенов предобучения, пяти примерам не уступает.
Так стоит ли маленькой модели вообще запоминать факты? Таблица из 155 столиц, каждая показана пять раз, научила её примерно половине. Фактов в мире куда больше, чем помещается в 125 миллионов параметров, и каждый стоит многих повторений. Дешевле путь, которым эта глава пошла с арифметикой: не знать, а посмотреть. Модель, которая умеет звать Python, может звать и поиск, и таблицу, и файл. Это агент из третьей части.
Пределы чата на 125 миллионов
Три практических предела определили, как устроен чат в конце страницы.
Длинный разговор вредит. Росток-2 учился на коротких разговорах. Когда в том же разговоре до вопроса было 0–2 других обмена репликами, он отвечает верно в 70% случаев, когда 4–8 — в 56–62%. В одном длинном и пёстром разговоре он дошёл до «Washington D.C., on the fourth of the four Atlantic Coasts», а тот же вопрос в новом чате получил чистый ответ. Поэтому страница показывает вам весь разговор, а модели отправляет только два последних вопроса — с ответом и результатами инструмента между ними.
4 бита вредят чату куда сильнее, чем базовой модели. Базовая модель заплатила за 4 бита на вес 0,026 ната (глава 15), чат на ответах в 300 отложенных разговорах — 0,13, в пять раз больше. Эмбеддинги в 8 битах и более удачная обрезка вернули меньше половины потерь, и ни одна отдельная часть модели не виновата. Хуже того, четырёхбитный чат сломал вызовы инструмента. 8 бит не стоят ничего измеримого, так что чат поставляется в 8 битах.
Температура пониже. Чат, как и проверка, выбирает токены при температуре 0,5, а не 0,7, как у Ростка-1: у модели на 125 миллионов параметров менее вероятный токен чаще оказывается выдуманной подробностью, чем удачным словом.
Пара слов о системном сообщении
Системное сообщение — не командная строка модели. Это дюжина токенов в начале строки, которые читаются как все остальные, и делают они только то, что в обучении следовало за такими токенами. Росток-2 видел несколько десятков таких сообщений, всегда одних и тех же: три способа объявить инструмент Python, «You are Sprout, a small and friendly assistant.» и указания к задачам из части разговоров smol-smoltalk («Rewrite the input text…»). Сообщению об инструменте он подчиняется, потому что тысячи примеров показали, что за ним следует, — и по той же причине на первом и втором этапах выучил из него не то. За сообщением, которого он не видел, скажем «Talk like a pirate», не стоит ничего: пират из главы 13 был изменением весов, а не указанием. Большие чат-модели слушаются новых системных сообщений, потому что при дообучении видели огромное разнообразие выполненных указаний. Настоящей главе о системных подсказках — с инструментами агента, правилами и рабочим пространством — место в третьей части.
Росток сейчас
Это чат четвёртого этапа, верхняя ступенька первого виджета. Он отвечает с нашего сервера, где работают тот же движок и те же 8-битные веса, что работали бы у вас в браузере, поэтому скачивать ничего не нужно, а сообщения не сохраняются. Если сервер занят или недоступен, чат предложит запустить Росток-2 прямо здесь: 126 МБ, а на телефоне — лёгкую версию в 4 битах, 78 МБ, заметно глупее и способную сломать вызов инструмента. Переключатель «Python» в верхней строке — системное сообщение из этой главы: включён — Ростку-2 сказано, что можно запускать Python, и его программы выполняются прямо здесь, в вашем браузере. Мысли сворачиваются под каждым ответом; чат помнит два последних вопроса. Спросите, кто он, попросите посчитать 1234 × 5678 с Python и без, посмотрите, как он безупречно разбирает «strawberry» по буквам и ошибается в счёте. Столицу Австралии он знает, а столицу Бразилии по-прежнему ставит в Рио. Последняя глава отходит от Ростка на шаг: как модели вроде него вырастают в те, которыми вы пользуетесь каждый день, и куда двигаться дальше.