Дистилляция с мягкими метками для агента SQL объемом 0.8 млрд: почему победил более слабый учитель Qwen
Тонкая настройка LoRA с использованием мягких меток типа top-k из замороженных записей позволила агенту SQL объемом 0,8 млрд выполнить 55 из 220 задач, причем более слабая модель Qwen превзошла более мощную модель GPT.
Источники: Small-Model Distillation — Part 2: Off-Policy Soft-Label KD for a 0.8B SQL Agent
Краткая версия
В предыдущей попытке агент размером 0.8B SQL, работавший над 1 решенной задачей из 220, смог решить 46 задач, заставив его копировать более крупный образец по одному токену за раз. На этот раз изменилось лишь одно. Что произойдет, если ученик также увидит часть неопределенности у учителя, а не только тот токен, который он в итоге выбрал? Все остальное остается прежним: структура обучения, оценка 220 задач, схема действий, ученик размером 0.8B и настройки тонкой настройки LoRA. Изменяется только сигнал обучения.
Замеренные значения учителя были пересчитаны. На каждой позиции сохранялись вероятности 20 наиболее вероятных токенов, а также небольшая оставшаяся масса, представляющая все остальное. Затем было сравнено обычное обучение с взвешенными жесткими токенами с методом дистилляции мягких меток top-k. В лучшей попытке было решено 55 из 220 задач, тогда как ученик с жесткими токенами решил 46 задач, а комбинированная версия с жесткими токенами — 49 задач.
Основная цифра — это не самая интересная часть. Мягкие метки усугубили ситуацию в двух из восьми тестов с одним источником данных. Лучшим учителем также оказался не самый сильный модель. Qwen, более слабая модель из той же семьи с оценкой 96/220, гораздо точнее воспроизводила собственные результаты, чем более мощная модель GPT (115/220), поэтому её вероятности позволяли ученику получить более чёткие уроки. Настоящий успех был достигнут за счёт смешивания обоих источников.
Сразу стоит отметить одно ограничение: вероятности токенов самих моделей GPT никогда не были доступны. Результаты модели GPT здесь оценивались моделью Qwen, что делает их лишь косвенным отражением истинных значений, а не результатом процедуры дистилляции логитов GPT.
Что проверялось
Более общая цель — сделать небольшие модели более эффективными для выполнения узких задач. Агент остается тем же, что и раньше — агентом для исправления SQL-кодов. Он получает описание проблемы пользователя вместе с ошибочным SQL-кодом, может просмотреть базу данных SQLite, выполнить тестовые запросы, прочитать результаты и отправить исправленный SQL-код. Оценка производится с помощью скрытых детерминистичных тестов, без участия ЯИИ-судьи.
Ранее проведенные тесты с использованием «жестких токенов» уже показали, что небольшая модель способна работать в этом цикле. Ненастроенная базовая модель в основном повторяла одни и те же действия и никогда ничего не отправляла. После обучения с использованием «жестких токенов» она гораздо чаще осматривала данные, выполняла запросы и отправляла результаты.
Обучение с использованием «твердых» токенов — это грубый инструмент. Ученику говорят воспроизводить любой токен, написанный учителем, без каких-либо указаний на то, насколько уверен был учитель, что еще он учитывал или был ли второй по качеству вариант почти таким же хорошим. Для SQL отсутствие этой информации может иметь значение для имён таблиц и столбцов, предикатов, операций соединения, литеральных значений и синтаксиса структурированных действий.
Вопрос заключался в том, улучшает ли метод дистилляции с использованием «мягких» меток top-k тот же агент объемом 0,8 млрд параметров при фиксированных трейсах и эталонах.
Были сравнены два исходных варианта. Один из них — базовая модель unsloth/Qwen3.5-0.8B. Другой — адаптер Qwen3.5-0.8B с поддержкой «твердых» токенов, обученный ранее на успешных траекториях из модели Qwen3.5-35B-A3B 8-битной версии. Другими словами: следует ли начинать обучение с использованием «мягких» меток с нуля или продолжать с модели, обученной с использованием «твердых» токенов?
Задача агента для SQL
Структура заданий соответствует предыдущей версии с использованием «жестких токенов». Каждое задание включает проблему пользователя, ошибочный запрос и базу данных SQLite. Модель выбирает одно из структурированных действий: проверить схему, выполнить SQL-запрос или отправить готовый SQL-запрос. Задание считается решенным только в том случае, если отправленный SQL-запрос проходит скрытые тесты.
Типичное небольшое, но реальное задание: в базе данных chinook пользователь хочет получить самый последний значением track_id, а затем использовать его для фильтрации строк таблицы track. Ошибочный запрос выглядит следующим образом:
WITH vars AS (SELECT COUNT(*) AS vars_id FROM track)
SELECT * FROM track WHERE track_id = vars_id
Эта ошибка не связана с форматированием. COUNT(*) не является самым новым идентификатором, поэтому требуется исправление в виде использования MAX(track_id). Модель должна решить эту проблему внутри цикла инструмента: возможно, проверить схему, выполнить зондирование, прочитать полученные данные и, наконец, отправить SQL-запрос в точно таком структурированном формате, который принимает система.
BAML, сокращение от Boundary Markup Language, по-прежнему используется для форматирования входных данных в виде структурированного вывода. Он определяет структуру решения и собирает запрос, отправляемый модели. Простой текст от человека-инструктора никогда не входит в данные обучения модели; она учится на стандартных JSON-решениях, состоящих из краткого draft и исполняемого output действия.
{"draft":"Need schema first.","output":{"action":"inspect_schema"}}
{"draft":"Test a candidate query.","output":{"action":"run_sql_query","sql":"SELECT ..."}}
{"draft":"Submit corrected SQL.","output":{"action":"submit_sql","sql":["SELECT ..."]}}
При каждой оценке использовались настройки предыдущей сессии, поэтому единственным изменяющимся элементом был сигнал обучения. Стоит упомянуть две настройки. Лимит длины последовательности в 8192 единицы представляет собой общий бюджет для промпта и генерации: системный промпт, задание, предыдущие действия, схема, результаты поиска, инструкции по структурированному выводу и резерв для генерации — всё это делится между собой. Максимальное количество генерируемых токенов указывается отдельно, поскольку оно ограничивает количество вызовов модели. Ученик может учитывать длинную историю действий, но при этом должен выполнять по одному компактному действию за ход. Результаты отображаются через вывод в терминале и показатели поведения, такие как количество отправленных ответов, количество неверных ответов, ошибки SQL, остановки из-за повторения действий и остановки по достижении максимального количества ходов.
Лучшие ученики не терпят неудач в основном из-за JSON. Они без проблем достигают этапа submit_sql. Самой сложной частью является оценка SQL-запросов и восстановление после неудачных попыток.
Идея обучения
Метод дистилляции с жесткими токенами предоставляет учащемуся по одному целевому токену на позицию. Вместо этого метод дистилляции с мягкими метками даёт небольшое распределение вероятностей. Предположим, что целевой пример учителя содержит токен таблицы вида ... FROM users .... При жестком обучении считается, что следующим токеном будет users. При обучении с мягкими метками также указывается, какую вероятность учитель придал нескольким близким альтернативам. Выбранный токен по-прежнему считается правильным, но учащийся также видит, что некоторые альтернативы были ближе к правильному ответу, чем другие.
Хранение вероятностей для всего словаря является затратным процессом для крупных языковых моделей. Словарь может включать сотни тысяч токенов, а каждое решение учителя касается множества позиций целевого примера. Практическим компромиссом стала разреженная версия: 20 самых высоких вероятностей учителя для каждой позиции целевого примера, плюс остаточная масса вероятностей для всех остальных токенов.
Зачем сохранять «хвост»? Предположим, сумма 20 самых высоких вероятностей, которые были сохранены, составляет 0,996. Оставшиеся 0,004 по-прежнему относятся к распределению учителя, и если увеличить сумму этих 20 значений до 1,0, у ученика возникнет чрезмерно высокая уверенность в результатах. Поэтому цель намеренно формируется таким образом, чтобы учитывать наличие части данных, не вошедших в список сохранённых.
Этот подход по-прежнему является off-policy. Ученик учится на данных, собранных ранее, и никогда не принимает действий во время процесса оценки.
Краткий обзор кода
Самый простой способ изучения этого метода — проследить за одной строкой данных во всей обработке. Для «мягких» меток не создавалась новая среда для агента. Использовались те же успешные решения учителя, полученные при обработке траектории с жёсткими токенами; они были переиспользованы, представлены в том же формате BAML-запроса, а затем дополнены информацией о вероятностях для токенов-целей помощника.
Вот строка, связанная с тщательной настройкой с использованием «жестких» токенов (SFT). При SFT происходит обучение на парах входа-выхода, при котором только токены ответа влияют на функцию потерь:
row = {
"messages": conversation_before_teacher_decision + [
{"role": "assistant", "content": canonical_decision_json(teacher_decision)}
],
"teacher_draft": teacher_decision.draft,
"teacher_action": teacher_decision.output,
}
Строка с мягкой меткой сохраняет те же канонические сообщения и метаданные учителя, а также получает оценки токенов, заданные учителем, в позициях цели ассистента. Под «принудительным воздействием учителя» здесь подразумевается передача известного текста цели вероятностной модели с запросом о том, насколько вероятен этот текст с учётом его контекста, по токенам. Сохраняются лог-вероятности, а не сырые, поскольку их гораздо безопаснее записывать и использовать для обучения:
row = {
"messages": [..., {"role": "assistant", "content": target_decision_json}],
"distillation": {
"probability_model": "Qwen3.5-35B-A3B 8-bit",
"top_k": 20,
"row_weight": 1.18,
"token_scores": [
{
"position": 1661, # full-sequence token position
"target_token_id": 412,
"target_logprob": -0.21,
"top_token_ids": [412, 879, 91],
"top_logprobs": [-0.21, -2.81, -3.51],
"top_mass": 0.90,
"tail_mass": 0.10,
}
],
},
}
Функция оценки выполняет единственную задачу: берет замороженную последовательность и присваивает ей вероятности токенов. От модели Qwen3.5-35B-A3B 8-bit в качестве оценщика никогда не требуется формировать новое решение. Подсказка отображается без ответа ассистента, полная последовательность — с ним, а целевая часть оценивается по одному токену за раз:
prompt = chat_template(messages[:-1], add_generation_prompt=True)
full = chat_template(messages, add_generation_prompt=False)
prompt_ids = tokenize(prompt)
full_ids = tokenize(full)
target_ids = full_ids[len(prompt_ids):]
prefill_teacher_cache(prompt_ids[:-1])
driver_ids = [prompt_ids[-1]] + target_ids[:-1]
for i, target_id in enumerate(target_ids):
logits = qwen_35b(driver_ids[i]).logits
logprobs = log_softmax(logits)
top_ids, top_logprobs = top_k(logprobs, k=20)
save_token_score(
position=len(prompt_ids) + i,
target_token_id=target_id,
target_logprob=logprobs[target_id],
top_token_ids=top_ids,
top_logprobs=top_logprobs,
tail_mass=1.0 - sum(exp(top_logprobs)),
)
Маскировка, касающаяся только ассистента, остаётся неизменной по сравнению с режимом использования «жёстких токенов». Токены вводного запроса представляют собой контекст, а целевые токены ассистента — элементы надзора. Это имеет большее значение для агента, чем для простого ответа на вопрос, поскольку вводный запрос содержит информацию о структуре данных, результаты предыдущей работы инструментов и результаты SQL-запросов. Эти токены предназначены для использования в качестве основы для принятия решений, а не для их прогнозирования:
labels = full_ids.copy()
labels[: len(prompt_ids)] = -100
hard_ce = cross_entropy(student_logits, labels)
Для обучения также требуется больше тензоров, чем при обычном SFT. Пакет, как обычно, содержит input_ids, attention_mask и маскированные labels, кроме того, в нем также хранится вес для каждой позиции, идентификаторы токенов из группы top-k с их лог-вероятностями, маска для этих k позиций и оставшиеся вероятности хвоста. Функция паддинга вставляет нейтральные значения в неактивные позиции, поэтому функция потерь без проблем их игнорирует:
batch = {
"input_ids": pad(input_ids, pad_id),
"attention_mask": pad(attention_mask, 0),
"labels": pad(labels, -100),
"position_weights": pad(position_weights, 0.0),
"topk_token_ids": pad(topk_token_ids, [0] * top_k),
"topk_logprobs": pad(topk_logprobs, [0.0] * top_k),
"topk_mask": pad(topk_mask, [False] * top_k),
"tail_probs": pad(tail_probs, 0.0),
}
Условие контроля представляет собой точечную настройку с использованием «твердых токенов». Один выбранный токен по-прежнему является целевым, но значение кросс-энтропии между токеном помощника и целевым токеном умножается на вес уверенности, взятый из лог-вероятности оценщика для данного целевого токена. Целевой токен, который легко определить для оценщика, может иметь более высокий вес, а тот, который определить сложно, — более низкий:
z = (mean_target_logprob - dataset_mean_logprob) / dataset_logprob_std
row_weight = clip(2 / (1 + exp(-z)), 0.25, 1.75)
loss = row_weight * hard_ce
Ограничение диапазона [0.25, 1.75] предотвращает то, чтобы какой-либо отдельный нестабильный ряд взял верх над всей группой, при этом надежные ряды по-прежнему могут значительно превзойти менее надежные по своим показателям.
Что касается мягких меток, то к функции потерь добавляется член, соответствующий вероятности. Ниже приведен краткий описание его формы, а не точный код реализации:
teacher_top_probs = exp(top_logprobs) * topk_mask
teacher_top_probs *= (1.0 - tail_mass) / sum(teacher_top_probs)
student_logprobs = log_softmax(student_logits_at_target_positions)
student_top_logprobs = gather(student_logprobs, topk_token_ids)
student_tail_prob = 1.0 - sum(exp(student_top_logprobs))
topk_kl = sum(teacher_top_probs * (log(teacher_top_probs) - student_top_logprobs))
tail_kl = tail_mass * (log(tail_mass) - log(student_tail_prob))
loss = hard_ce + topk_kl + tail_kl
Информация передаётся от учителя к ученику: целью ученика является распределение, заданное учителем, и наступает штраф, если этому распределению присваивается слишком мала вероятность. В реальном тренере кросс-ентропия и процесс дистилляции вычисляются только для смещённых позиций целей помощника.
Фактическая обучающая процедура ученика по-прежнему представляет собой тонкую настройку с использованием метода LoRA. LoRA, то есть адаптация низкого ранга, позволяет оставить базовую модель практически неизменной и добавляет небольшие обучаемые матрицы-адаптеры к выбранным модулям внимания и MLP. Благодаря этому становится дешево проводить множество пробных запусков, не выполняя каждый раз полную настройку модели объёмом 0,8 млрд параметров:
student = load_student("unsloth/Qwen3.5-0.8B", max_seq_length=4096)
student = add_lora_adapters(
student,
rank=32,
alpha=32,
target_modules=[
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
],
)
trainer_class = make_trainer_class(Trainer, soft_label_args)
trainer = trainer_class(
model=student,
train_dataset=scored_train_examples,
eval_dataset=scored_validation_examples,
data_collator=distillation_collator,
batch_size=1,
gradient_accumulation_steps=8,
learning_rate=5e-5,
epochs=3,
)
trainer.train()
adapter = save_lora_adapter(student)
Фактическая реализация соответствует этому принципу: функция make_trainer_class возвращает подкласс Hugging Face Trainer, который применяет сохранённую функцию потерь типа sparse top-k вместе с residual-tail. Обратите внимание, как это отличается от онлайн-версии DistillationTrainer из TRL, в которой оценка учителя производится внутри самого трейнера. Все три параметра мягких меток оставлены на уровне 1.0: для функции потерь hard cross-entropy, процесса дистилляции и параметра температуры. Параметр температуры намеренно оставлен без изменений, поскольку артефакты, связанные с разреженностью данных, были заданы равными 1.0, и целью не было проведение исследований по масштабированию температуры.
Оценка в конце представляет собой реальное тестирование, а не принудительное использование учителя. Обученный адаптер возвращается в среду SQL-agent и должен выполнить 220 задач, оставленных для тестирования, действуя по одному шагу за раз:
for task in held_out_eval_tasks:
state = start_sql_agent_task(task)
for turn in range(8):
messages = render_baml_messages(state)
decision = model_with_adapter.generate_action(
messages,
max_new_tokens=512,
temperature=0.0,
)
state = execute_action_and_append_observation(state, decision)
if state.solved or state.stopped:
break
results.append(score_final_submission(state))
Многие идеи оффлайн-дистилляции терпят неудачу на этом последнем этапе. Задание от учителя проверяет, способен ли ученик предсказать, что сделает учитель дальше в контексте, созданном самим учителем. Тестирование в реальных условиях проверяет, может ли ученик смириться со своими предыдущими выборами, выбирать полезные вопросы для исследования, избегать повторений и отправлять корректный SQL-код. Здесь важен только второй показатель.
Как проходит эксперимент
Можно легко принять это за дистилляцию в рамках текущей политики, но это не так. Ничто из того, что генерирует ученик, никогда не оценивается. Он учится лишь позже, на основе следов, уже созданных учителем.
Данные получаются путем оценки прохождения по замороженным успешным трейсам. Действия учителя уже существуют, а модель вероятностей лишь определяет, насколько вероятно появление каждого выбранного токена в данном контексте. Она никогда не принимает новое решение. Два набора данных, прошедшие оценку, хранились отдельно (трейсы GPT, оцененные Qwen, и трейсы Qwen, оцененные Qwen), причем каждый из них фильтровался по длине всей генерированной последовательности, поскольку наблюдения структуры и результаты предыдущих инструментов являются частью того, что студент должен усвоить, а не только окончательный ответ. Границы: трейсы GPT считаются оцененными с помощью Qwen-proxy и не оценивались с использованием собственных вероятностей GPT, причем студент никогда не действует во время процесса оценки.
К оцененным данным были применены три варианта обучения:
- Тонкая настройка с взвешенными жесткими токенами (метод управления). Для каждой позиции выбирается по одному токену, причем каждая строка взвешивается в зависимости от уровня уверенности оценщика. Это метод SFT с регулировкой по уровню уверенности. Отличие: это не дистилляция с мягкими метками, поскольку «ученик» видит веса, но никогда не видит распределение top-k.
- Дистилляция с мягкими метками top-k (метод, находящийся на тестировании). Используется тот же жесткий целевой сигнал, плюс второй сигнал, требующий от «ученика» распределить вероятности между top-k вариантов, указанных оценщиком, оставляя оставшуюся часть вероятностей для всех остальных вариантов. Отличие: это метод, работающий вне политики обучения и с принудительным управлением со стороны «учителя» на замороженных данных, причем «учитель» никогда не оценивает собственные примеры «ученика».
Смешивание источников даёт наиболее чистый и понятный результат: больше разнообразных успешных примеров, а также более подробные целевые значения для каждого токена, что позволяет небольшой базовой модели извлечь больше информации для обучения, чем при использовании любого из источников по отдельности.
Набор данных и фильтрация
Примеры работы учителей намеренно не генерировались заново. Они были зафиксированы во время работы с «трудными токенами», чтобы сравнение касалось исключительно сигнала контроля, а не нового цикла генерации данных.
В том предыдущем этапе обучения оба учителя обрабатывали одни и те же 879 учебных заданий. GPT 5.5 medium правильно решил 446 из 879 заданий, что привело к получению 1046 строк данных SFT. Qwen3.5-35B-A3B 8-bit правильно решил 394 задания, что дало 1232 строки, поскольку его успешные пути обработки были длиннее. При оценке на 220 заданиях GPT 5.5 medium показал лучшие результаты — 115 против 96, так что в данном случае тест с Qwen относится к тестам внутри одной семьи моделей, а не к тестам с самым сильным учителем.
Аргумент о заместителе имеет вес. Для получения честных оценок от GPT 5.5 medium потребовались бы собственные вероятности токенов этой модели, которые не были доступны. Поэтому эксперимент с отслеживанием действий GPT ставит более узкую задачу: добавляет ли оценщик из семьи Qwen что-то полезное к выбранным действиям GPT?
Для каждой строки был отрендерен тот вопрос BAML, который действительно использовался системой. Затем известная цель помощника была принудительно применена с помощью Qwen3.5-35B-A3B; оценки в 8 бит и по токенам хранились только для позиций цели помощника.
Перед любой обработкой необходимо проверить два аспекта данных с оценками: какая их доля вписывается в лимит в 4096 токенов и насколько точно оценщик Qwen совпадает с каждым исходным источником. Чем ниже значение отрицательной лог-вероятности, тем лучше, поскольку это означает, что модель вероятностей считает целевые действия более легкими для объяснения. Именно поэтому данные с самооценкой Qwen сильно отличаются от данных с косвенной оценкой GPT: Qwen был гораздо увереннее в своих собственных данных, чем в данных GPT 5.5 medium. Среднее значение отрицательной лог-вероятности цели составило 0,297 для строк с самооценкой Qwen и 0,876 для строк с косвенной оценкой GPT. Во всех позициях с самооценкой Qwen целевой токен входил в топ-20 сохраненных данных (100,00%), а в 98,56% позиций с косвенной оценкой GPT — также входил в топ-20.
Исходный набор после слияния содержал 2278 строк. После фильтрации на 4096 токенов осталось 2253 строки, которые были разделены на 2141 для обучения и 112 для проверки. Перед разделением строки были перетасованы с использованием фиксированного семени, чтобы набор для проверки не отражал порядок исходных данных.
Настройки обучения
Основную сетку образовали восемь серий экспериментов, представляющих полное пересечение трех бинарных параметров: источник данных для тренировки (прокси GPT или модель Qwen), метод обработки данных (взвешенные жесткие или мягкие метки) и способ начала обучения ученика (начало с базовых данных или с использованием жестких токенов). Еще две серии экспериментов, проведенные как с базовой моделью, так и с объединенными данными, с использованием соответственно взвешенных жестких токенов и мягких меток, привели к обучению десяти учеников в общей сложности. Эксперименты с комбинированным способом начала обучения были исключены. Первые восемь серий показали, что способ начала обучения в значительной степени зависит от источника данных, а эксперименты с комбинированными данными были предназначены для ответа на более простой вопрос: помогает ли смешивание различных моделей при обучении с базовой моделью?
Гиперпараметры обучения были выбраны в соответствии с базовой схемой hard-token trajectory. Для адаптеров использовался формат LoRA с рангом 32 и параметром alpha 32 для проекций внимания (q_proj, k_proj, v_proj, o_proj) и проекций MLP (gate_proj, up_proj, down_proj). Другие настройки: скорость обучения 5e-5, размер батча по одному экземпляру на устройство с 8 шагами накопления, три эпохи, формат bf16 на GPU NVIDIA, библиотеки Unsloth и FlashAttention 2 при наличии. Остальные параметры включали разделение данных на валидационную группу в 5%, использование метода packing off, начальное значение семени 42 и ограничение длины полных последовательностей для обучения 4096 токенами.
Для мягких меток температура составляла 1,0, а веса для методов жесткой кросс-ентропии и дистилляции также были равны 1,0. Код сохраняет хранимую массу top-k наряду с остаточной массой хвоста — это простое числовое решение для вероятностей, которые были сериализованы в разреженном виде.
Размеры пакетов данных не были идентичными. Запуски с использованием GPT proxy-score были обучены на 990 строках, запуски с Qwen self-score — на 1151 строке, а комбинированные запуски — на 2141 строке. При размере пакета 1 и 8 шагах накопления за три эпохи было выполнено соответственно 372, 432 и 804 обновления оптимизатора. В метках запусков Base обозначает неотрегулированную модель unsloth/Qwen3.5-0.8B, GPT proxy — данные от модели GPT 5.5 medium, оцененные моделью Qwen3.5-35B-A3B 8-bit, Qwen self — данные от самой модели Qwen, оцененные ею же, а Combined — объединенные наборы оценок перед началом обучения.
Будьте осторожны с показателями потерь при валидации. Они имеют смысл в рамках одной цели, но результаты экспериментов с жестким и мягким подсчетом оценок нельзя сравнивать между собой, поскольку их показатели потерь включают разные компоненты. Наименьший показатель потерь при валидации был у варианта базового Qwen с жестким подсчетом оценок, который решил всего 40 из 220 задач, тогда как лучший результат был получен при использовании комбинированного метода с мягким подсчетом оценок, несмотря на более высокие потери.
Подготовка и обучение проводились на разном оборудовании. Устройство с большим объемом памяти удобно использовалось для локальной загрузки и оценки модели Qwen3.5-35B-A3B в 8 битах, хотя точный процесс оценки с использованием метода «учитель-ученик» занимал довольно много времени: примерно 60 минут для данных GPT и 41 минута для данных Qwen. Студенты обучались на GPU NVIDIA. Одиночные эксперименты с записью времени выполнения длились примерно от 23 до 30 минут, а более крупные комбинированные эксперименты занимали около 52 минут (с жестким подсчетом оценок) и 55 минут (с мягким подсчетом оценок).
Результаты, сгруппированные по вопросам
В первой диаграмме пытались показать всё сразу, что привело к путанице между двумя отдельными вопросами: что происходит, когда обучение начинается с базовой модели, и что происходит, когда оно продолжается с модели траекторий hard-token. Поэтому результаты были разделены по исследовательским вопросам.
Для сравнения: результаты учителей и базовых моделей в тестировании на 220 задачах были следующими: без доработки — 1/220, студент с использованием hard-token — 46/220, Qwen в роли учителя — 96/220, а GPT в роли учителя — 115/220. Целью эксперимента с мягкими метками top-k никогда не было превзойти учителей. Целью было выяснить, может ли более сильный сигнал контроля помочь студенту с моделью объемом 0,8 млрд параметров добиться лучших результатов при тех же условиях.
Начиная с базовой модели. Все тестированные варианты превзошли результат ненастроенной модели 1/220. Результаты обучения только с использованием GPT и только с использованием Qwen оказались примерно одинаковыми: в зависимости от метода решалось от 41 до 43 задач. Сочетание обоих подходов привело к более значительной разнице: вариант с взвешенными сложными токенами показал результат 49/220, а вариант с топ-к мягкими метками — 55/220, что составляет примерно четверть от общего числа задач. В абсолютных цифрах это небольшие показатели, далекие от лучшего результата «учителя» — 115/220, но важно то, насколько модель объемом 0,8 млрд параметров совершает прогресс от почти нулевого уровня, а не соответствие уровню «учителя». Учитывая старт с базовой модели, вывод заключается в необходимости использования обоих источников данных, причем при объединении мягкие метки оказались эффективнее взвешенных сложных токенов.
Продолжаем рассмотрение случая с использованием «твердых токенов» для студентов. Здесь ситуация менее ясна. Чекпоинт уже решил 46 из 220 задач. Дополнительная обработка трасс GPT с использованием взвешенных «твердых токенов» позволила ему добраться до уровня 48 из 220, тогда как использование «мягких меток» для тех же трасс привело к снижению результатов до 44 из 220. В случае трасс Qwen, оцененных самим алгоритмом, ситуация изменилась: с использованием взвешенных «твердых токенов» результаты упали до 38 из 220, а «мягкие метки» повысили их до 49 из 220.
Неожиданным результатом стало то, что «мягкие метки» помогали лишь тогда, когда оценка алгоритма совпадала с реальным результатом. Модель Qwen3.5-35B-A3B 8-bit показала худшие результаты — 96 из 220 по сравнению с 115 из 220 у GPT, однако ее вероятности соответствовали собственным трассам, и в этом случае «мягкие метки» сработали (49 из 220), тогда как на трассах GPT, оцененных через прокси, они привели к снижению результатов (44 из 220). Согласованность оценок оказалась важнее абсолютной силы модели-учителя.
Что изменилось в цикле агента. Базовая модель почти никогда не отправляла данные. Метод SFT с использованием жестких токенов научил её входить в цикл и отправлять данные, но многие из этих отправлений были неверными. Сочетание метода с мягкими метками снова повысило уровень успеха, и это стало лучшим результатом в целом. Тем не менее модель отправила 171 задачу и решила 55 из них, что означает, что 116 отправленных запросов не прошли скрытые тесты, к тому же произошло 39 остановок из-за повторения действий.
Такова истинная картина результата. Модель терпит неудачу не столько потому, что не может генерировать корректные действия в формате BAML, сколько из-за плохих решений в формате SQL и иногда застревания в цикле.
Наиболее надежным показателем поведения оказалось количество сделанных поворотов. Среднее значение для метода с комбинированными мягкими метками составило 3,39 поворота, тогда как для метода с жесткими токенами при теплом запуске — 3,48 поворота; разница настолько незначительна, что дополнительные шаги не могут объяснить улучшение. Легкое улучшение в составе действий действительно наблюдается: больше правильных ответов по сравнению с теплым запуском, меньше ошибок по сравнению с методом с комбинированными взвешенными жесткими токенами, а также меньше ошибок SQL и меньше ситуаций, когда достигается предельное количество поворотов. Количество сгенерированных токенов за каждый этап оценки не фиксировалось, поэтому цифры по сгенерированным токенам приводиться не будет. Цифры, которые можно с уверенностью привести, связаны с процессом обучения: сколько было токенов входного запроса и целевого ответа, полная длина последовательности и уровень покрытия методом top-k.
Примечание к просмотру таблиц, расположенных за диаграммами: показатель «submitted» включает как правильные, так и неправильные отправки, а показатель «wrong submits» равен общему числу отправок за вычетом успешных. Столбец «SQL-error tasks» не является исчерпывающим; задача попадает в него, если хотя бы один из её SQL-запросов выдал ошибку в процессе выполнения, поэтому он может совпадать с любым итоговым результатом.
Анализ неудач
Если оценивать исключительно на основе совокупного результата работы базовой модели, картинка выглядела бы слишком идеальной: смешанные учителя плюс мягкие оценки — и всё. Раздельные варианты анализа менее упорядочены. Удивительным является то, что более слабый учитель показал лучшие результаты, чем более сильный, поскольку его вероятности соответствовали его собственным данным. Мягкие оценки получили наибольший прирост на путях Qwen из одной же семьи, а также при совмещении источников данных. Они показали меньший прирост на данных GPT, по которым Qwen оценивался косвенно, и негативно повлияли на показатели GPT при начальном запуске.
Это вполне вероятно: 8-битные вероятности Qwen3.5-35B-A3B хорошо описывают действия этой модели, поэтому ученик с объемом 0.8B получает более четкий сигнал для имитации.
При реализации сохраняется последнее слово. Вопрос заключается в том, может ли ученик угадать следующее действие учителя, когда контекст похож на контекст учителя, при принудительном управлении со стороны учителя. Более сложная задача заключается в том, чтобы ученик мог восстановиться после собственных предыдущих действий, выбирать разумные запросы, избегать зацикливаний и завершить работу с правильным SQL-запросом. Эти задачи связаны, но совсем не идентичны.
Показатель потерь при валидации рассказывает ту же историю с другой стороны. При использовании комбинированного подхода с мягкими метками при коэффициенте 55/220 показатель потерь составил 0,5684, что выше, чем 0,3478 у комбинированного подхода с жесткими токенами, решившего 49 задач. Наименьший показатель потерь — 0,2544 — был у базового варианта Qwen с самооценкой жестких токенов, однако он решил лишь 40 из 220 задач. Низкий показатель потерь при использовании метода с принудительным руководством учителя не означает лучшей производительности агента.
Результаты, полученные с использованием комбинированного подхода с учителем, дают наибольший объем полезной информации. Методы GPT побуждали агента предлагать решения чаще. Методы Qwen были проще для оценки и принадлежали к той же группе, однако приводили к большему количеству циклических действий. Комбинированный подход с мягкими метками не просто сочетал лучшее из обоих подходов — проблемы с повторными попытками сохранялись. Тем не менее его показатель успешного решения задач был самым высоким, и по сравнению с комбинированным подходом с жесткими токенами он демонстрировал меньше ошибок при выполнении SQL-запросов и заканчивал меньше эпизодов при достижении лимита количества ходов.
Метод усиленного контроля имел свои уроки. Взвешивание строк в зависимости от уверенности оценщика дешевле, чем использование разреженных вероятностных распределений, и на данных с начальными оценками GPT он дал наилучшие результаты. Однако он не может сообщить учащемуся информацию о соседних вариантах на каждой позиции; он указывает лишь «скопируй этот токен более строго или менее строго». Методы с мягкими метками типа top-k подходят в тех случаях, когда оценщик соответствует исходному источнику, а набор данных достаточно разнообразен, чтобы учащийся не переобучался по стилю одного конкретного «учителя».
Уроки аппаратного обеспечения
Понадобились два вида машин. Для оценки необходимо было сохранять модель Qwen3.5-35B-A3B в 8-битном формате в памяти и запускать её на замороженных целях, поэтому имел смысл использовать Mac с большим объемом оперативной памяти — 128 ГБ объединенной памяти, способной хранить квантизированную версию модели. Он не был быстрым, но позволял выполнять всю подготовку локально перед использованием платных GPU.
В процессе обучения требовалось совсем другое. Тонкая настройка LoRA сопряжена с большим количеством матриц: необходимы операции вперед и назад, ядра внимания и шаги оптимизатора. NVIDIA GPU работала гораздо быстрее, несмотря на меньший общий объем памяти, поскольку эти тензоры хранились в VRAM и обрабатывались с помощью ядер CUDA. Основной урок заключается в том, что емкость памяти и скорость обработки — это разные аспекты. Большой объем оперативной памяти системы позволяет хранить и готовить данные, тогда как VRAM GPU в сочетании с CUDA обеспечивает быстрое обучение. Рабочий процесс стал таким: всё, что возможно, выполнялось на Mac, а удаленный GPU запускался только тогда, когда данные и скрипты были готовы.
Уроки
Метод дистилляции с мягкими метками заслуживает попытки применения для тонкой настройки агентов, при условии оценки его эффективности на практике. Неопределенность на уровне токенов содержит больше информации, чем у «твердых» токенов, однако это по-прежнему остается локальным руководством, и само по себе оно не научит модель восстанавливаться после неудачного вызова инструмента, избегать циклов или более эффективно анализировать новые данные.
Прокси-мягкие метки должны присваиваться честно. Значения, указанные здесь для GPT, — это не собственные вероятности модели GPT, а значения, оцененные с помощью Qwen. Это все равно полезный эксперимент, просто это не настоящая дистилляция логитов GPT.
Учитель из той же семейства моделей может превзойти более мощного учителя. Важнее, насколько хорошо оценочный инструмент соответствовал исходным данным, чем само значение его оценки.
Метод sparse top-k с хвостом представляет собой приемлемый компромисс. Сохранение логитов всего словаря позволило бы получить более полные данные, но это требует значительных ресурсов для хранения, передачи и обучения. Двадцать токенов плюс достаточно большой остаточный хвост обеспечивают видимость целевого токена практически везде.
Смешивание различных методов обучения эффективнее, чем выбор одного оптимального варианта. Лучший результат был достигнут путем объединения строк с оценками GPT 5.5 medium и строк с самооценками Qwen, а также обучения базовой модели с использованием мягких меток.
Результаты
Помогает ли это? Да, в определенных условиях. В оптимальной конфигурации метод дистилляции с мягкими метками top-k улучшил производительность агента для SQL объемом 0.8 млрд параметров: строки с оценками GPT в сочетании с строками с самооценками Qwen, поданные в базовую модель unsloth/Qwen3.5-0.8B, решили 55 из 220 задач, что значительно превосходит показатели модели, использующей жесткие токены без учета политики обучения (46 из 220), а также комбинированной версии с жесткими токенами (49 из 220).
Не стоит воспринимать это как «мягкие метки всегда побеждают». Важную роль играли исходные данные учителя, инициализация студента, согласованность вероятностей и поведение в процессе выполнения задач; победительом стал не тот учитель с самым высоким баллом оценки. Проблемы по-прежнему возникают из-за агентного подхода: неверные SQL-запросы, повторные действия и неполное восстановление состояния внутри цикла.
Именно поэтому этот эталонный тест стоит сохранять. Студент может казаться справляющимся под давлением учителя, но всё равно допускать ошибки, когда ему приходится действовать самостоятельно. Любые последующие исследования должны сохранять неизменными условия тестирования и проверять, улучшает ли новая идея обучения реальный ход выполнения задач, а не только показатели потерь в оффлайн-режиме.