Практические заметки: Как на самом деле работают большие языковые модели: от прогнозирования следующего слова до
Пошаговое руководство по практическим заметкам: как на самом деле работают большие языковые модели — от прогнозирования следующего слова до использования контрактов, проверок и готовых блоков кода для команд, внедряющих эту модель.
Используйте это как переработанную версию идей из книги «Как на самом деле работают LLM: от прогнозирования следующего слова до написания кода», ориентированную на операторов: четкие этапы, упорядоченные блоки кода и записи о восстановлении, сохраняющиеся при передаче задач. Этап обзора работает лучше всего, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг терпит неудачу, причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций.
Все начинается с одного вопроса
На этапе «Всё начинается с одного» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия результатам работы, определите критерии успеха и не допускайте молчаливого частичного завершения задачи. При следующем шаге, представляющем собой код или вызов инструмента, отдавайте предпочтение структурированным выходным данным с проверкой по шаблону перед свободным текстовым форматом.
Что вообще такое токен?
Для этапа «Что это вообще такое?» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение стоимости заранее помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой схемы перед свободным текстом.
Цикл прогнозирования
На этапе цикла прогнозирования необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф. При следующем шаге, являющемся кодом или вызовом инструмента, предпочтительнее использовать структурированные выходные данные с проверкой схемы вместо свободного текста. На этапе цикла прогнозирования необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Предпочтительнее небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой обработки данных.
P(next_token | "The", "cat", "sat", "on", "the")
P(token_i) = exp(logit_i) / Σⱼ exp(logit_j)
Архитектура: Transformer
При работе над этапом «Архитектура Transformer» сначала запишите условия соглашения: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет избежать ошибок при последующих изменениях кода. Рассматривайте этот этап как соглашение между входными данными и проверенными выходными результатами. Дайте названия соответствующим элементам, определите критерии успешности и не допускайте молчаливого частичного выполнения задачи. Храните в кэше стабильные системные инструкции и схемы инструментов. Повторная отправка одинакового входного данных — частая причина избыточных ресурсов.
Token IDs → Embedding layer → [Attention + FFN] × N layers → Linear head → Softmax → P(next token)
Самообращение внимания: основной механизм
При работе над этапом «Основной механизм самообратной связи» сначала запишите требования: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет избежать ошибок при последующих изменениях кода. Рядом с функциональными результатами записывайте время выполнения и стоимость обработки токенов или запросов. Отслеживание затрат с самого начала предотвращает неожиданные расходы при переходе с демо-среды в общедоступные среды. Храните в кэше стабильные системные инструкции и схемы инструментов. Повторная отправка одинаковых данных — частая причина лишних затрат.
Q = XWᴬ_Q (Query: what am I looking for?)
K = XWᴬ_K (Key: what do I contain?)
V = XWᴬ_V (Value: what do I contribute?)
score(i, j) = qᵢ · kⱼᵀ / √dₖ
Attention(Q, K, V) = softmax(QKᵀ / √dₖ) · V
MultiHead(Q, K, V) = Concat(head₁, ..., headₕ) · W_O
headᵢ = Attention(QWᵢ_Q, KWᵢ_K, VWᵢ_V)
Сеть с прямой передачей
При работе над этапом сети типа «Feed-Forward» сначала запишите условия взаимодействия: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список помогает сохранять честность последующих изменений в коде. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинакового преамбула — частая причина износа ресурсов. При работе над этапом сети типа «Feed-Forward» сначала запишите условия взаимодействия: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список помогает сохранять честность последующих изменений в коде. Воздерживайтесь от использования обширных скриптов в пользу небольших, тестируемых единиц. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций.
FFN(x) = max(0, xW₁ + b₁)W₂ + b₂
FFN(x) = (SiLU(xW_gate) ⊙ xW_up) · W_down
Почему ЯЗЫКИ больших моделей пишут код: аргумент прогнозирования
Этап «Почему ЯЗЫКИ больших моделей пишут код» работает наилучшим образом, когда его рассматривают как измеримую основу. Сначала соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объем работ. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия создаваемым файлам, определите критерии успешного выполнения и не допускайте молчаливого частичного завершения задачи. Установите лимит токенов на каждый ход и за всю сессию. Инструменты агентов активно расширяют объем контекста; строгие ограничения предотвращают появление неожиданных счетов.
P("(" | ..., "def", " quicksort") ≈ 1.0
P(":" | ..., "def", " quicksort", "(", "arr", ")") ≈ 1.0
P("return" | context inside function body) >> P("import" | same context)
Конкретный пример: генерация функции сортировки
Конкретный пример создания этапа работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-версии к общедоступным средам. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентного типа активно расширяют контекст; жесткие ограничения не позволяют демо-версиям превращаться в неожиданные счета.
Температура и выборка при генерации кода
Параметры Temperature и Sampling на этапе разработки работают наилучшим образом, когда их рассматривают как измеримые показатели. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Установите лимиты на количество токенов за раунд и сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов. Параметры Temperature и Sampling на этапе разработки работают наилучшим образом, когда их рассматривают как измеримые показатели. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг сбивается, причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций.
Аргумент о масштабе: почему больше — это не всегда лучше
На этом этапе аргументации «The Scale Argument Why» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывания скрытого состояния. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия результатов работы, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. При следующем шаге, представляющем собой код или вызов инструмента, предпочтительнее использовать структурированные выходные данные с проверкой по шаблону вместо свободного текста.
Чего не могут делать ЯЗЫКИ БОЛЬШИХ МОДЕЛЕЙ (по своей конструкции)
На этапе «Чего не могут делать ЯЗЫКИ» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, используя известную точку контроля, без необходимости угадывать скрытое состояние. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение затрат с самого начала помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой схемы перед свободным текстом.
Краткое резюме
На этапе подведения итогов необходимо определить входные данные, ответственного за шаг и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф. Предпочитайте структурированные выходные данные с проверкой схемы вместо свободного текста, когда следующим шагом является обработка кода или вызов инструмента. На этапе подведения итогов необходимо определить входные данные, ответственного за шаг и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину, а не на сложную структуру всей обработки.
Чек-лист операций
При работе над этапом операционного чек-листа сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист помогает сохранять честность последующих изменений в коде.
Документируйте одновременно «успешный путь» и путь восстановления. Повторные попытки, проверки со стороны человека и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинакового вступительного фрагмента — частая причина избыточных нагрузок.
Сохраняйте затраты на обработку данных на минимум и откладывайте дорогостоящие вычисления с использованием мемоизации только после их оценки. Преждевременное применение мемоизации может скрыть ошибки, связанные с устаревшими данными.
Каждый раз, когда это позволяют бюджетные ограничения, добавляйте тест на базовую работоспособность, который проверяет критически важные этапы в рамках CI с использованием фикстчеров, а не реальных платных API.
Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее помогает избежать неожиданных счетов при переходе с демо-среды в общедоступные среды.
Перед тем как переводить стек в более серьезное использование, заморозьте версии, сохраните эталонный отчет для критического пути и уточните шаги возврата к предыдущему состоянию. В общедоступных средах необходимы ограничения на количество запросов, проверки принадлежности и четко определенный ответственный за обновление секретов. Лучше выбирать надежность, чем креативные одноразовые демонстрации.
Примечание для задачи 9267285893fa: не храните ключи поставщика в репозитории, установите лимит на количество токенов за сессию и сохраняйте отчеты рядом с фикстурами для оценки, чтобы последующие замены моделей оставались сопоставимыми.