Главная / Статьи / Практические заметки: от прогнозирования следующего токена до ChatGPT <> Создание LLM с нуля

Практические заметки: от прогнозирования следующего токена до ChatGPT <> Создание LLM с нуля

Пошаговое руководство по практическим заметкам: от прогнозирования следующего токена до ChatGPT <> Создание LLM с использованием контрактов, проверок и готовых блоков кода для команд, внедряющих эту модель.

2460 слов

Используйте это как переработанную версию идей из статьи «От прогнозирования следующего токена к ChatGPT <> Создание LLM с нуля [6]», ориентированную на операторов: четкие этапы, упорядоченные блоки кода и записи для восстановления, которые сохраняются при передаче задач. Этап обзора работает лучше всего, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и записи о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф.

Акт 1: Предобучение обеспечивало завершение задач, а не послушание

На этапе предобучения первого акта необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки сохранения, не догадываясь о скрытом состоянии. Необходимо одновременно задокументировать успешный сценарий выполнения и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой по схеме перед свободным текстовым описанием.

Explain why the sky appears blue.
Explain why the sky appears blue.
The following questions are commonly asked in introductory physics...
The sky appears blue because Earth's atmosphere scatters
shorter wavelengths of sunlight more strongly than longer
wavelengths...
What text probably comes next?
When the text looks like an instruction,
what kind of continuation should I produce?

Акт 2: Преобразование разговоров в примеры для обучения

На этапе ведения диалогов на втором акте необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага он должен указывать на конкретную проблему, а не на сложную цепочку операций. При следующем шаге, представляющем собой код или вызов инструмента, лучше использовать структурированные выходные данные с проверкой по схеме вместо свободного текста.

example = {
    "instruction": "Convert the following sentence to passive voice.",
    "input": "The developer fixed the bug.",
    "output": "The bug was fixed by the developer."
}
Below is an instruction that describes a task.

### Instruction:
Convert the following sentence to passive voice.

### Input:
The developer fixed the bug.

### Response:
The bug was fixed by the developer.
instruction
    ↓
optional context
    ↓
response

Что на самом деле видит модель

На этом этапе необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия результатам работы, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. При следующем шаге, представляющем собой код или вызов инструмента, предпочитайте структурированные результаты с проверкой по шаблону вместо свободного текста. На этом этапе необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, которое операторы могут проверять, не читая весь кодовый граф.

[21106, 318, 281, 12064, ... 4435, 257, 3126, ...]
Tokens:
[A, B, C, D, E]

Input:
[A, B, C, D]

Labels:
[B, C, D, E]
instruction → useful response

Для обработки заполнения требуется особый подход

На этапе, когда необходим особый подход к обработке заполнения, сначала запишите условия контракта: требуемые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Задокументируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки со стороны оператора и обработка некорректных сообщений являются частью продукта, а не элементами последующей доработки. Сохраняйте в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых заголовков — распространенная причина избыточных нагрузок.

Example 1:
[10, 20, 30, 40]

Example 2:
[11, 21]
Example 1:
[10, 20, 30, 40]

Example 2:
[11, 21, PAD, PAD]
PAD → PAD → PAD → PAD
ignore_index = -100
loss = cross_entropy(
    logits.reshape(-1, vocab_size),
    targets.reshape(-1),
    ignore_index=-100,
)

Этап 3: Точная настройка поведения

При работе над этапом тонкой настройки в 3-м акте сначала запишите контракт: необходимые входные данные, сигнал успешного завершения и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, проверяемые единицы кода вместо обширных скриптов. Когда какой-то шаг терпит неудачу, ошибка должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинакового преамбула — частая причина избыточных ресурсов.

for batch in train_loader:
    optimizer.zero_grad()

    input_ids = batch[:, :-1]
    targets = batch[:, 1:]

    logits = model(input_ids)

    loss = cross_entropy(
        logits.flatten(0, 1),
        targets.flatten(),
        ignore_index=-100,
    )

    loss.backward()
    optimizer.step()
model.learn_to_be_helpful()
### Instruction:
Summarize this paragraph.

### Response:
<clear concise summary>
### Instruction:
Write Python code that reverses a string.

### Response:
def reverse_string(s):
    return s[::-1]
The CPU cache is...
### Instruction:
Explain CPU caching to a beginner.

### Response:
A CPU cache is...

Акт 4: Оценка становится проблематичной

При работе над этапом «Оценка превращается в действие» четвертого акта сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список помогает сохранять честность последующих изменений в коде. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия соответствующим элементам, определите критерии успешности и не допускайте молчаливого частичного выполнения задачи. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых данных является распространенной причиной избыточных ресурсов. При работе над этапом «Оценка превращается в действие» четвертого акта сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список помогает сохранять честность последующих изменений в коде. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код.

Prediction: SPAM
Label:      SPAM

Correct.
Recursion is when a function solves a problem by calling
itself on a smaller version of the same problem.
Recursion is a technique where a problem is reduced into
smaller instances of itself until a stopping condition is reached.

Ориентировочные ответы по-прежнему полезны.

Метод «Ориентировочные ответы по-прежнему полезны» работает наилучшим образом, когда его рассматривают как измеримую основу. Соберите один идеальный пример выполнения, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Документируйте одновременно успешный сценарий выполнения и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки.

{
    "instruction": "Explain recursion simply.",
    "reference": "Recursion solves a problem by repeatedly reducing it...",
    "model_response": "A recursive function calls itself..."
}

Попросите другой ЯИИ оценить ответ

Запрос к другому LLM для выполнения задачи наилучшим образом работает, если рассматривать его как измеримую единицу. Соберите один идеальный пример выполнения, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые блоки кода вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Установите лимит токенов на один ход и на всю сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов.

Instruction:
Explain recursion simply.

Reference answer:
...

Model answer:
...

Rate the model answer from 0 to 100 based on correctness,
relevance, and clarity.
1. Inspect representative outputs manually
2. Compare against reference answers where useful
3. Use an LLM judge for aggregate comparison

Этап 5: Затем мы сталкиваемся с более сложной проблемой <> Предпочтения

Методология Act 5 Then We stage работает наилучшим образом, когда рассматривается как измеримая структура. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия всем элементам, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задач. Установите лимиты на количество операций за раз и за сессию. Инструменты агентов активно расширяют контекст; жесткие ограничения предотвращают появление неожиданных счетов. Методология Act 5 Then We stage работает наилучшим образом, когда рассматривается как измеримая структура. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, которое операторы могут проверять, не читая весь код.

Ответ А

На этапе Ответ A необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Необходимо задокументировать как успешный, так и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой по схеме перед свободным текстовым описанием.

Recursion is when a function calls itself.

Ответ B

На этапе Response B необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой обработки данных. При следующем шаге, представляющем собой код или вызов инструмента, целесообразно использовать структурированные выходные данные с проверкой соответствия шаблону вместо свободного текста.

Recursion is a technique where a function solves a problem
by calling itself on a smaller version of that problem.
The process stops when it reaches a base case.
correct vs incorrect
chosen vs rejected
{
    "prompt": "Explain recursion simply.",
    "chosen": """
    Recursion solves a problem by repeatedly reducing it
    until reaching a base case.
    """,
    "rejected": """
    Recursion is when recursion happens recursively.
    """
}
Prompt
   ↓
Chosen response ─────┐
                     ├── preference objective
Rejected response ───┘
                     ↓
               model update
Pretraining
    ↓
learn language patterns

------------------------------

Instruction fine-tuning
    ↓
learn instruction → response behavior

------------------------------

Preference tuning
    ↓
learn which acceptable responses we prefer

Что на самом деле изменилось?

На этапе «Что на самом деле изменилось» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия результатам работы, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. При следующем шаге, представляющем собой код или вызов инструмента, предпочитайте структурированные результаты с проверкой по шаблону вместо свободного текста. На этапе «Что на самом деле изменилось» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, которое операторы могут проверять, не читая весь кодовый граф.

### Instruction:
Pretraining:
What token should come next?

Instruction tuning:
What does a good answer look like after an instruction?

Preference tuning:
Of several reasonable answers, which behavior should we prefer?

На этапе заключительных замечаний сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки со стороны человека и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинакового вступительного блока — распространенная причина избыточных ресурсов.

Если эта инструкция вам помогла…

При работе над этапом «Если данный руководство помогло», сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист обеспечивает прозрачность последующих изменений в коде.

Чек-лист операционной работы

При работе над этапом чек-листа операционной работы сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист обеспечивает прозрачность последующих изменений в коде.

Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам.

Храните в кэше стабильные системные инструкции и схемы инструментов. Повторная отправка идентичных данных является распространенной причиной сбоев.

Старайтесь снизить затраты на обработку данных и откладывайте дорогостоящие вычисления на этап мемоизации только после их оценки. Преждевременная мемоизация может скрыть ошибки, связанные с устаревшими данными.

При наличии бюджета добавляйте тесты, проверяющие критически важные этапы в процессе интеграционного тестирования с использованием фикстур, а не реальных платных API.

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

Перед внедрением новых компонентов заморозьте версии, сохраните эталонный вариант работы критически важных этапов и убедитесь, что существуют шаги для возврата к предыдущему состоянию. В совместных средах необходимы ограничения на частоту запросов, проверки прав доступа и четко определенный ответственный за обновление секретов. Лучше надежность, даже если она кажется скучной, чем красивые, но единоразовые демонстрации.

Примечание к заданию 6748f099cda4: не хранить ключи поставщиков в репозитории, установить лимит токенов на сессию и сохранять транскрипции рядом с фиксами для оценки, чтобы последующие замены моделей оставались сопоставимыми.