Всем привет! Меня зовут Анастасия Рысьмятова, я руковожу юнитом LLM в Авито.
В этой статье я расскажу, как мы с командой создали и адаптировали нашу большую языковую модель A-vibe: зачем решили развивать собственную LLM, как построили токенизатор, собрали датасеты, провели SFT и RL и что получили в итоге. Поделюсь основными экспериментами и покажу наши результаты.

Сегодня мы выпустили в опенсорс свое семейство генеративных моделей – A-Vibe и A-Vision, статья приурочена к этому событию.

Оглавление

  1. Кто мы и чем занимаемся

  2. Как мы обучали модель

  3. Метрики качества Avibe

  4. Бенчмарки скорости Avibe

Кто мы и чем занимаемся

Сейчас юнит LLM — команда из 25 человек. Мы в юните занимаемся тем, что делаем core-модель для авито, а потом адаптируем ее под разные бизнес-кейсы.

 За 2 года мы:

  • написали более 60 продуктовых сервисов;

  • запустили более 50 АБ-тестов;

  • внедрили и масштабировали свыше 12 продуктов в разных категориях.

Мы создаём решения, которые помогают 72+ млн уникальных пользователей Авито: упрощают работу и автоматизируют рутинные действия по размещению контента, коммуникации, поиску нужного на платформе, где размещается более 220 млн активных объявлений. А также помогают 12 тысячам сотрудникам компании: снижают нагрузку и ускоряют внутренние процессы.

Как мы обучали модель Avibe

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

  1. Проприетарные модели по API — отказались из-за вопросов безопасности, ограниченной гибкости, а ещё мы хотели развивать экспертизу внутри компании.

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

  3. Обучение своего LLM-претрейна — это дорого и долго, поэтому хотелось начать с чего-то более простого и менее рискованного.

Мы хотели развивать собственную инфраструктуру и компетенции внутри компании, поэтому выбрали четвертый вариант, который позволил нам получить модель с лучшими метриками по качестве и скорости на задачах Авито: 

Адаптация опенсорс моделей – взять лучшую по нашим бенчмаркам опенсорсную модель, сделать для неё собственный токенизатор, подменить токенизатор у опенсорсной модели, а дальше провести SFT и сделать RL.

Адаптация токенизатора

Токенизаторы открытых моделей (далее – OS-модели) не очень хорошо адаптированы под русский язык. В этом можно убедиться, если взять большой корпус на русском языке, протокенизировать его с помощью токенизатора OS-модели и посчитать среднюю длину токенов в символах. Затем обучить собственный токенизатор преимущественно на русском языке – и проделать тоже самое. Ниже приведена таблица, в которой мы сравниваем плотность токенизации для токенизатора Qwen-2.5 и токенизаторов, которые обучили сами: 

Токенизатор

Токенов с кириллицей

Токенов с латиницей

Других токенов

chars/tokens

qwen 2.5

3 996

187 769

111 566

3.24

tokenizer_ver5_32k

18 515

12 207

1 278

3.65

tokenizer_ver6_60k

36 493

21 940

1 567

3.95

ver5, ver6 – версии датасетов, на которых был обучен токенизатор;

32k, 60k – размер словаря токенизатора.

Видно, что обучая модель с собственным токенизатором, мы можем сократить число параметров модели. Это достигается за счёт уменьшения размера словаря токенизатора. Кроме того, повышается плотность токенизации: один и тот же текст будет занимать меньшее число токенов как во входном контексте, так и при генерации.

Существует два основных подхода к обучению модели с собственным токенизатором:

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

  2. Адаптация токенизатора у предобученной модели. Как это, например, предлагается сделать в статье.

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

В области адаптации у нас уже был отлаженный пайплайн, про результаты которого я уже рассказывала:

Пайплайн состоит из 4 основных шагов:

  1. Обучаем свой токенизатор с требуемыми характеристиками по размеру словаря и плотности токенизации на разных доменах.

  2. Подменяем токенизатор у лучших OS-моделей, используя двухэтапный алгоритм: сначала замораживаем все слои сети, кроме слоя эмбеддингов (такой этап мы называем freeze), а затем размораживаем все параметры сети и учим на тех же данных (этап unfreeze).

  3. Делаем этап инструктивного обучения SFT.

  4. Делаем DPO.

Но у данного способа подмены был недостаток. Пересечение токенов в токенизаторах OS  моделей и наших моделей небольшое (обычно около 2 тыс. токенов), а это значит, что инициализированные эмбединги токенов плохо подходили к модели. Возникла идея: а что если попробовать объединить два токенизатора – OS модели и наш – таким образом, чтобы в новом токенизаторе остались англоязычные токены от токенизатора открытой модели, а кириллические токены от нашего токенизатора. В момент когда решили провести такой эксперимент мы работали с моделью Qwen3-8B-Base.

Поэтому в дальнейших экспериментах участвовала эта модель и её токенизатор.

Тут еще больше контента

Как мы объединили два токенизатора

Первым этапом адаптации необходимо было отфильтровать английские токены из токенизатора qwen3. Делается это в 2 этапа – наивно оставляем кандидатов, состоящих из латинских символов (этого недостаточно, так как многие алфавиты используют латиницу в качестве системы знаков). После чего выделяем токены, специфичные только для английского языка через подсчет частотности на чистом английском корпусе данных, в качестве которого был выбран dclm. После прогона токенизатора на них частотные английские токены «всплывут» наверх и останется лишь взять 99 перцентиль. Нам также  важна высокая эффективность токенизатора на кодовых задачах – дополнительно мы оставили кодовые токены, обсчет которых был проведен на внутренней кодовой базе Авито. По итогу 80к токенов были классифицированы как английские и кодовые. 

Аналогичный подход был применен к нашему ver6_60k токенизатору, однако в качестве корпуса для подсчета статистик был использован fineweb_ru. Используя их и покрытие 99 перцентилем мы получили токенизатор с размером словаря 36к, показывающий высокую плотность на русском языке.

Наконец, необходимо взять лучшее из двух миров и объединить эти токенизаторы: поскольку ver6 был специально обучен в qwen-совместимом сетапе (такой же pre-tokenizer и normalizer) и описанный выше подход обеспечивает непересекающиеся словари у токенизаторов, мердж тривиален. Просто подкладываем новые токены в vocab и добавляем merges в результирующий токенизатор. 

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

Ниже на графиках приведено сравнение токенизаторов:

  • qwen3_original – оригинальный токенизатор модели;

  • Ruadapt – токенизатор модели ruadapt;

  • ver6_original – наш обученный токенизатор ver6_60k;

  • qwen3_tokenizer_en_pruned – обрезанный qwen3 с размером словаря 80k;

  • ver6_tokenizer_ru_pruned – обрезанный ver6_60k с размером словаря 36k.

При адаптации объединенного токенизатора инициализировать эмбеддинги для токенов из оригинального токенизатора qwen3 мы можем эмбеддингами из qwen3. На freeze этапе обучения мы замораживаем эти эмбеддинги, так как считаем, что они уже адаптированы под веса модели, и учим только оставшиеся кириллические эмбеддинги из токенизатора ver6.

В итоге чтобы сделать адаптацию токенизатора нужно выполнить три шага:

  1. Объединить два токенизатора (добавить в токенизатор OS модели новые русские токены).

  2. Инициализировать эмбеддинги для новых токенов (добавить новые векторы в эмбеддинговый слой модели).

  3. Запустить обучение на большом корпусе текста, и новые эмбеддинги проучить.

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

Оказалось, что сделать частичную заморозку слоя эмбеддингов не так тривиально, поэтому оставлю здесь наш способ.

Скрытый текст

Почему requires_grad=False не решает проблему?

requires_grad включается/выключается на весь параметр. У эмбеддингов это одна большая матрица, и torch не позволяет заморозить веса эмбеддингов лишь частично. А нам нужно «заморозить» несколько строк, а не весь эмбеддинговый слой.  Значит, ищем другой способ.

hook на градиент

В pytorch есть такая штука как hook — это коллбэк, который PyTorch автоматически вызывает в определённый момент вычислений (обычно при backward или forward). С его помощью можно перехватить и изменить данные (например, градиент) прямо «на лету».

Мы решили не менять сам параметр, а обнулять градиент у нужных строк эмбеддинга на каждом backward(). Для этого мы написали функцию, которая перехватывает градиент и может его занулить, прежде чем оптимизатор сделает шаг.

# Псевдо-код: делаем hook, который зануляет строки градиента у заданных token_ids
def make_row_zero_hook(token_ids):
    def hook(grad):
        idx = to_device(token_ids, grad.device)
        return zero_rows(grad, idx)  # зануляем строки по индексам
    return hook

  # Теперь чтобы он вызывался при backward-е на весах эмбеддингов, вызываем register_hook
def install_freeze_hooks(model, token_ids, include_lm_head=True):
    hook = make_row_zero_hook(unique_sorted(token_ids))
    get_input_embeddings(model).weight.register_hook(hook)

Это решает нашу задачу, но есть нюанс

AdamW делает «усадку» веса отдельно от градиента:

w ← w − lr * step − lr * weight_decay * w .

Даже если градиент ноль, член − lr * weight_decay * w всё равно двигает веса. Значит, для наших зафиксированных строк нужно отключить weight decay на соответствующих параметрах.

# Псевдо-код: говорим Trainer’у не применять decay к эмбеддингу
class NoDecayEmbeddingsTrainer(Trainer):
    def get_decay_parameter_names(self, model):
        decay = base_decay_list(model)
        decay -= all_embedding_weight_names(model)
        return sorted(decay)

Как мы это используем на практике

  1. Собираем список «старых» токенов (их id — те строки, которые хотим не трогать).

  2. Ставим hook на входные эмбеддинги и на lm_head.

  3. Обучаем как обычно, но в Trainer выключаем weight_decay для эмбеддингов.

# Псевдо-код
old_token_ids = collect_old_token_ids(tokenizer, old_tokenizer)
install_freeze_hooks(model, old_token_ids, include_lm_head=True)
trainer = NoDecayEmbeddingsTrainer(model=model, args=training_args, ...)
trainer.train()

Итого:

  • «старые» токены не размываются, качество адаптации растёт;

  • обучение сосредоточено на новых токенах;

  • никаких форков оптимизатора: только hook для градиента и отключение weight decay на нужных параметрах. Простое решение, которое стабильно работает.

Данные для адаптации токенизатора

Для адаптации токенизатора мы собрали около 700 млрд токенов, но в итоговом запуске и экспериментах использовали семпл из 150 млрд. токенов. Это сильно сокращало время адаптации, при этом значимо не просаживало метрики. 

Распределение данных по языкам: 

  • 31% — русский язык;

  • 31% — английский язык;

  • код на разных языках программирования;

  • тексты на других языках для сохранения многоязычности.

Мы следили за балансом доменов (код, гуманитарные, естественные и точные науки) и подмешивали SFT-датасет прямо в обучение токенизатора.

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

Жми сюда!

SFT этап

На этом этапе мы учили модель отвечать на вопросы, вести диалог и понимать system prompt. Датасет (>800 тыс. примеров) включал:

  • открытые наборы данных;

  • синтетические примеры;

  • логи общения сотрудников Авито с LLM;

  • школьные и олимпиадные задачи;

  • данные из реальных бизнес-кейсов.

Качество контролировалось через LLM as a judge.

В SFT датасете использовалось много данных c FC. Хочется отдельно рассказать про интересный подход генерации синтетических данных. Данный подход был предложен в статье APIGen-MT: Agentic Pipeline for Multi-Turn Data Generation via Simulated Agent-Human Interplay. Вот что сделали мы:

  1. Спарсили описания ручек сервисов Авито.

  2. При помощи LLM перевели описания ручек в openai формат описания тулов.

  3. Чтобы провалидировать выход прошлого шага на соответствие openai формату, для каждого описания тула делаем запрос в openai api с описанием тула. Если запрос не вернулся с ошибкой – описание валидное.

    Дальше хотим на основе описания тулов генерировать синтетические диалоги. Чтобы разнообразить и улучшить качество данных, мы используем подход из статьи Scaling Synthetic Data Creation with 1,000,000,000 Personas. Использовали их датасет с описаниями персон. На этом этапе наши вводные: датасет с персонами и датасет с описания тулов.

  4. Семплируем несколько тулов и персону. LLM создает описание среды и политики агента действующего в этой среде:

    • домен – краткое описание среды;

    • роли – какие роли участвуют в диалоге;

    • описания возможностей тулов;

    • ограничения использования тулов;

    • описание данных;

    • правила поведения агента с ноткой персонализации (тут как раз и нужна засемпленая персона).

  5. По выходу предыдущего шага + полного описания тулов + персоны LLM создает конфигурация будущего диалога:

    a) системный промпт для агента который будет использовать тулы (опять же с персонализацией);

    b) цель юзера, который будет общаться с агентом;

    c) план того, как должен идти диалог.

  6. LLM судья оценивает получившиеся конфигурации и дает фидбек по улучшению. Шаг 5 принимает фидбек и улучшает конфигурацию диалога. Судья принимает уже новую конфигурацию и опять ее оценивает. Такой цикл обратной связи и итеративного улучшения конфигурации диалога повторяется до 5 раз. Если после 5 раз LLM судья все еще оценивает конфигурацию как некачественную, она выбрасывается.

    Наконец, можно перейти к самой генерации диалогов. Чтобы данные были более качественные, модель не галлюцинировала, а полнота и сложность диалогов были максимально приближены к реальным, каждая реплика будет генерироваться отдельным запросом к LLM (вместо подхода, когда одним разом модель бы сгенерировала весь диалог). 

  7. В генерации диалога у нас будут участвовать:

    • модель, которая генерирует реплики юзера, ей мы в промт подаем персону юзера и цель юзера (шаг 5b);

    • модель, которая генерирует реплики ассистента;

    • модель, которая эмулирует вызовы API. Она принимает описание тула, запрос и возвращает результат запроса;

    • модель, которая решает, когда завершить генерацию диалога.

  8. В конце уже сгенерированные диалоги оцениваются LLM судьей. Он оценивает корректность использования тулов, а так же смотрит, соответствует ли диалог плану из пункта 5с.

GRPO этап

На GRPO этапе мы хотели сделать модель умнее. Мы сконцентрировались на улучшении результатов модели в function calling, математических и кодовых задачах.

Было выявлено, что обучение GRPO на одном из доменов не роняет значимо метрики в других доменах, поэтому запуски GRPO на задачах из разного домена проводили последовательно. Далее приведено краткое описание экспериментов, которые мы провели.

Function Calling

На данном этапе использовали собственный синтетический датасет для FC, который был описан выше. Далее делали подготовку этих данных к GRPO: 

  1. Из multi-turn диалоги получали пары prefix -> ответ ассистента

  2. Также добавляли irrelevant примеры для того, чтобы модель лучше понимала, когда использовать вызов функции, а когда – нет.

В качестве reward использовали rule-based, который давал строго 1, если вызов функций полностью совпадал с golden, 0 при наличии любых несоответствий. В таком виде модель не переобучается на отдельные компоненты (по типу формата, выбор отдельных функций), а обучается полностью корректно выполнять задачу. 

Запускалось на 4x8xh100 GPU, 2.5к примеров, 1.6к итераций, gradient accumulation – 8, n rollouts – 32, temperature=0.7, lr=1e-6.

Главный бенчмарк, которым мы пользовались это BFCL, по итогам обучения получилось ощутимо увеличить скорость BFCL V3 увеличили с 49,68% до 59,55% BFCL V3 переведенный на русский увеличили с 40.22% до 49.25%, подробные результаты приведены в разделе Метрики качества.

Код

Мы собрали датасет из 120k алгоритмических задач на Python, каждая из которых содержит от 3 до 450 тестов. Для расчёта реворда мы прогоняли решения, сгенерированные моделью, через тесты: за каждый успешно пройденный тест модель получала положительную награду, а за проваленные тесты, таймауты и прочие ошибки назначался штраф.

Обучение проводилось с использованием GRPO: 5k итераций,  gradient accumulation – 8, распределённый запуск на 4x8xh100 GPU.

По итогам эксперимента значимого улучшения на бенчмарках зафиксировано не было (смотрели humaneval, mbpp, mera_code_ruhumaneval, mera_code_codecorrectness, mera_code_strucom).

Математика

Для обучения использовали данные математических задач 10k примеров  на английском и 10k переведенных на русский язык. В качестве reward взяли rool-based ревард который возвращает 1, если финальный ответ совпадал с golden answer и 0 иначе.

Генерацию кандидатов совершали через vllm в colocated режиме – это ускорило процесс обучения в несколько раз.

Запускалось на 8xh100 GPU, 4k итераций, gradient accumulation – 8, lr=5e-7, beta=1e-3, temperature=0.7 (при больших значениях обучение сильно нестабильно, при меньших значениях 0.3-0.7  особо нет разницы).

num_generations=64 (увеличение num_generations заметно улучшило качество)

Кроме подбора гиперпараметров на качество удалось повлиять с помощью балансировки сложности задач. GRPO обучение может поломаться, если в обучении будет много простых задач, которые LLM успешно решает, ведь иначе на таких семплах получается около нулевой advantage, а значит нечем будет обновлять политику. Чтобы исключить из обучения простые примеры, для каждой задачи задачи из обучающей выборки вычисляли pass rate из 8 генераций ответов. Далее исключили задачи с pass rate 8/8. 

В итоге получилось добиться буста с 0,6  до 0.69 на math500_ru.

DPO этап

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

Данные

Данные для обучения мы использовали двух типов

  1. SAFE DATA – общие вопросы.

  2. UNSAFE DATA – небезопасные вопросы.

SAFE DATA

Собрали датасет из 120k примеров общих вопросов для повышения диалоговых способностей модели. Датасет представляет из себя набор простых задач, касающихся различных областей науки и вопросов, содержащих в себе несложные задания, например, «Что ты посоветуешь мне взять в поездку в Норвегию?».

UNSAFE DATA

Взяли открытый датасет с вопросам разного уровня опасности (minor, major, critical). Датасет был англоязычным, поэтому перевели его с помощью большой открытой модели. В итоге получилось около 40k небезопасных вопросов на русском языке. 

ПОДГОТОВКА ДАННЫХ

Для DPO-этапа требуется preference dataset, что значит, что необходимо для каждого вопроса разметить chosen и rejected ответы.

Подход к сбору датасета состоял из следующих шагов:

  • для каждого вопроса из датасета с помощью целевой модели (модели, которую планируем обучать с помощью DPO) собираем 8 генерацией с подобранным генерационным конфигом. Конфиг подбирался так, чтобы ответ модели были полными, разнообразными, но еще не выглядел, как галлюцинация;

  • затем с помощью большой открытой модели и подобранного промпта размечались из 8-ми генераций лучшая и худшая. Для каждого датасета промпт и критерии оценки были свои;

  • уравновешивали число данных с длинными и короткими ответами. Уравновешивание происходило по коэффициенту разницы длин между ответами.

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

ОЦЕНКА МОДЕЛИ

Помимо оценки качества обучаемых моделей с помощью классических бенчмарков, мы завели специфичные доменные бенчмарки: safe и unsafe бенчмарк, работающий на подходе LLM as a judge.

Для каждого домена – диалогового и небезопасного – были заданы промпты с подробным описанием критериев оценки качества ответов моделей на выделенных тестовых вопросах. 

Бенчмарк хорошо отражал изменения в качестве ответов моделей и позволял отслеживать состояние их обучения, подбирая наилучший конфиг обучения. 

В результате DPO этапа нам удалось вырастить наши внутренние бенчмарки по безопасности и увеличить скор RU_ARENA с  77,7  до 79,2 (arena-hard-v0.1 с судьей gpt-4-1106-preview).

Метрики качества Avibe

Замеры метрик проводились с помощью библиотеки с жадными параметрами генерации. Модели Qwen3-8B и RuadaptQwen3-8B-Hybrid замерялись в режиме no_think. Методология расчетов конкретного бенчмарка может отличаться от замеров других разработчиков из-за особенностей данных и различных формулировок системного промпта/ количества few shot. Для наибольшей воспроизводимости вместе с моделью прикладываем часть данных для бенчмарков (gpqa diamond_ru, math500_ru, rudrop, ru_bfcl), а также PullRequest-ы в lm-evaluation-harness.

Общие знания о мире

Model

mmlu_ru

mmlu_en

gpqa

diamond_ru

gpqa

diamond_en

shlepa

baby mmlu

avibe_sft

0,721

0,751

0,364

0,374

0,484

0,766

avibe_grpo

0,718

0,750

0,343

0,354

0,489

0,765

avibe_dpo_final

0,718

0,752

0,343

0,318

0,486

0,766

Qwen3-8B

0,701

0,730

0,318

0,369

0,454

0,682

RuadaptQwen3-8B-Hybrid

0,698

0,729

0,399

0,268

0,444

0,456

baby mmlu объединяем question и choices и выбираем ответ с минимальной перплексией, используем вот такие данные

Внутренние бенчмарки по задачам Авито

Model

okk

relevance

i2p

avibe_sft

0,724

0,962

0,720

avibe_grpo

0,712

0,962

0,763

avibe_dpo_final

0,719

0,959

0,766

Qwen3-8B

0,717

0,908

0,668

RuadaptQwen3-8B-Hybrid

0,672

0,575

0,677

okk нужно ответить цифрой от 0 до 6 которая соответствует ответу на вопрос: Есть ли нарушения из перечисленных в тексте? Данные описания объявлений

relevance определить релевантны ли между парой запрос - выдача поиска

i2p передается текст описания item-a (товара) и нужно выбрать нужный параметр, релевантный к товару  

Математические и кодовые способности моделей (STEM)

Model

gsm8k_en

math_500

ru

math_500 en

ruhumaneval (pass@10)

avito_stash* (ppl)

avibe_sft

0,901

0,602

0,72

0,445

2,211

avibe_grpo

0,920

0,692

0,714

0,390

2,335

avibe_dpo_final

0,910

0,686

0,714

0,378

2,385

Qwen3-8B

0,927

0,546

0,736

0,420

3,811

RuadaptQwen3-8B-Hybrid

0,902

0,690

0,744

0,418

2,879

*avito_stash - бенчмарк по внутреннему stash, маскировали часть кода и замеряли ppl

DOoM

Бенчмарк, оценивающий способности моделей в математике и физике

Оценка проведена без ризонинга 

Model

total

russian math

russian physics

avibe_dpo_final

0,280

0,367

0,194

RuadaptQwen3-8B-Hybrid

0,253

0,322

0,184

Qwen3-8B

0,240

0,286

0,194

Работа с языком

 

Model

ru 

facts

rublimp

ru

drop 

avibe_sft

0,727

0,932

0,407

avibe_grpo

0,709

0,930

0,426

avibe_dpo_final

0,718

0,930

0,394

Qwen3-8B

0,724

0,916

0,318

RuadaptQwen3-8B-Hybrid

0,737

0,853

0,232

Работа с функциями

BFCL V3 

 

Model

BFCL V3

en

avibe_sft

49,68%

avibe_grpo

59,55%

avibe_dpo_final

58,63%

Qwen3-8B

60,2%

RuadaptQwen3-8B-Hybrid (reasoning)

54,91%

BFCL V3, переведенный на русский

group

Qwen_Qwen3-8B

ruadapt

reasoning

avibe

sft

avibe

grpo

avibe

dpo

Overall Acc

50.72%

46.35%

40.22%

49.25%

49.00%

Non-Live AST Acc

74.58%

74.04%

67.62%

73.17%

73.19%

Non-Live Simple AST

69.83%

70.17%

70.50%

72.67%

73.75%

Non-Live Multiple AST

81.00%

81.50%

74.00%

82.50%

82.00%

Non-Live Parallel AST

79.50%

81.00%

68.50%

75.00%

75.00%

Non-Live Parallel Multiple AST

68.00%

63.50%

57.50%

62.50%

62.00%

Live Acc

65.62%

62.99%

53.84%

68.46%

68.15%

Live Simple AST

76.36%

73.26%

64.73%

68.22%

67.83%

Live Multiple AST

61.16%

58.40%

60.97%

60.68%

58.78%

Live Parallel AST

75.00%

56.25%

87.50%

87.50%

87.50%

Live Parallel Multiple AST

70.83%

54.17%

66.67%

66.67%

66.67%

Multi Turn Acc

10.62%

1.50%

4.88%

3.50%

3.12%

Multi Turn Base

14.00%

1.50%

5.50%

4.50%

4.00%

Multi Turn Miss Func

10.50%

2.00%

8.00%

2.50%

2.50%

Multi Turn Miss Param

7.50%

1.50%

2.50%

5.00%

3.50%

Multi Turn Long Context

10.50%

1.00%

3.50%

2.00%

2.50%

Relevance Detection

94.44%

94.44%

94.44%

94.44%

88.89%

Irrelevance Detection

74.07%

70.93%

39.76%

81.62%

82.26%

MERA

Модель

MERA 

text

МЕRА CODE

общий тотал

MERA CODE приватный тотал

MERA Industrial

медицина

MERA Industrial

с/х

avibe_sft

0,616

0,304

0,367

0,609

0,513

avibe_grpo

0,624

0,314

0,351

0,612

0,521

avibe_dpo_final

0,618

0,312

0,367

0,565

0,483

Qwen3-8B

0,510

0,280

0,336

0,517

0,3

RuadaptQwen3-8B-Hybrid

0,498

0,322

0,380

0,26

0,437

RU_ARENA

arena-hard-v0.1 с судьей gpt-4-1106-preview (консистентно с результатами на гитхабе )

model

score

score with length control

avg #Tokens

gpt-4-1106-preview

90,9

81,4

541

gpt-4o-mini

83,9

75,4

448

T-Tech-T-pro-it-1.0

83,8

73,8

502

gigachat_max_26.20_uncen

82,7

72,5

514

gigachat_max_with_censor

80

68,9

515

avibe_dpo_final

79,9

65,5

831

vikhr-nemo-12b-instruct-r-21-09-24

79,8

65,5

627

avibe_sft

77,7

63,0

755

avibe_grpo

77,6

63,5

792

Qwen/Qwen3-8B

76,7

63,0

894

gemma-2-9b-it-sppo-iter3

73,6

59,0

509

RefalMachine/RuadaptQwen3-8B-Hybrid 

72,0

56,2

821

T-Tech-T-lite-it-1.0

71

59,3

544

RU_ARENA

arena-hard-v0.1 с судьей gpt-4o-mini (консистентно с результатами на hf)

model

score

score with length control

avg #Tokens

avibe_grpo

93,3

86,5

792

avibe_dpo_final

89,7

81,5

831

Qwen/Qwen3-8B

89,2

81,7

894

RefalMachine/RuadaptQwen3-8B-Hybrid 

88,8

80,8

821

Бенчмарки скорости Avibe

Замеры по скорости проводились на примерах из нашего SFT датасета, который состоит преимущественно из русскоязычных текстов. В новом токенизаторе плотность токенизации выше, поэтому число токенов в контексте и при генерации стало меньше для одинаковых примеров. Кроме того, размер самой модели сократился до 7.9B при 8.2B у Qwen3-8B. За счет этого одинаковые русскоязычные примеры адаптированной моделью обрабатываются быстрее в среднем на 15-25% в сравнении с исходной Qwen3-8B (результат зависит от задачи и данных, на некоторых задачах мы видим ускорение до двух раз).

Для ускорения генерации можно использовать спекулятивный декодинг. Спекулятивный декодинг наиболее эффективен на небольших батчах – на единичных запросах ускорение достигает 2.7x. В реальности модель обрабатывает множество запросов параллельно. Для оценки прироста по скорости в условиях, приближенных к реальным, провели бенчмарк с нагрузкой 12 rps (максимальная нагрузка, которую держит Qwen3-8B без накопления очереди на данных SFT). В таких условиях спекулятивный декодинг снижает время ответа до 1.9x. 

Спекулятивный декодинг

В качестве алгоритма спекулятивного декодинга мы использовали недавно вышедший EAGLE-3. Основными отличиями EAGLE-3 от EAGLE-2 являются:

  •  Отказ от предсказания признаков — прямая генерация токенов

Вместо того чтобы draft-модель предсказывала будущие hidden states (которые используется в последнем слое таргет-модели для генерации токенов), она прямо генерирует токены. Это упрощает задачу и устраняет лишние предсказания  признаков.

  • Использование признаков с разных слоев

Вместо использования только признаков из одного (предпоследнего) слоя, EAGLE-3 объединяет признаки из разных слоёв (начальных, средних, последних), чтобы дать более богатую информацию draft-модели. 

  • Ещё большая оптимизация инференса в Vllm и Sglang

В экспериментах, описанных в оригинальной статье, EAGLE-3 достигал ускорения до ~6.5х, при этом показывая прирост ~1.4х по сравнению с EAGLE-2

Для обучения драфт-модели мы использовали подмножество наших SFT-данных — около 100 млн токенов, преимущественно на русском языке, с сохранением доменной и стилевой близости к основной модели.

В итоге мы смогли получить драфт-модель, у которой acceptance length (среднее количество верно сгенерированных токенов драфт-моделью) составляло 2.4 токена, в то время, как Eagle-2 давал в среднем 2.1 токена. 

Для инференса спекулятивного декодинга мы использовали имплементации, реализованные в популярных движках vllm и sglang. Оба фреймворка активно внедряют поддержку новых инструментов, в том числе eagle. На момент написания этой статьи, eagle-3 быстрее работал на sglang. 

Результаты наших внутренних замеров показали, что использование eagle-3 через sglang в различных сетапах (разное количество предсказываемых токенов, разные top-k и т.д) на разовых запросах дают ускорение до 2.7х, которое постепенно снижается и становится нулевым при batch_size = 64). Это расходится с оригинальной статьей, заявляющей ускорение до 6.5х раз. Скорее всего такие ускорения достигаются на очень узких доменах с сильно переобученными драфт-моделями, у которых очень высокие acceptance length.

Кликни здесь и узнаешь

Эта масштабная работа была сделана благодаря команде, поэтому хочется упомянуть и поблагодарить каждого:

  • спасибо Айдару Хусаинову и Серёже Кляхандлеру за помощь в организации работы над проектами;

  • Коле Хохлову за оптимизацию нашего обучения на кластере;

  • Олесе Моисеенко, Альберту Акопяну, Даниилу Карпову и Артему Городецкому за проведение экспериментов на RL этапе;

  • Косте Веснину, Роме Прилепскому, Тимофею Мазуренко и Диме Сиракову за проведение экспериментов на  SFT этапе;

  • Марку Каширскому за эксперименты с токенизатором;

  • Ярославу Хрипкову за организацию пайплайна сбора данных для подмены токенизатора;

  • Вике Берестовой за подсчет всех метрик и валидацию наших чекпоинтов;

  • Андрею Токареву за оценку скорости наших моделей;

  • Юлии Мазепе за эксперименты с подменой токенизатора;

  • Камилю Измайлову и Никите Ятченко за эксперименты по ускорению нашего инференса.

А если хотите вместе с нами помогать людям и бизнесу через технологии — присоединяйтесь к командам. Свежие вакансии есть на нашем карьерном сайте.

Комментарии (35)


  1. Keeper22
    27.10.2025 14:31

    Микросервисы вам эта же модель и пишет?


  1. Spaceoddity
    27.10.2025 14:31

    А зачем вам всё это? Вы бы лучше интерфейсы свои допилили, а не карго-культ под OpenAi устраивали...


    1. fids
      27.10.2025 14:31

      согласен, ерундой занимаются когда страдает основной бизнес. Продаешь на 1 руб. отдай 10руб, еще и должен останешься-так всех клиентов распугают, сбегут на "Юлу". Или доставка Почтой РФ возросла на столько, что уже и не выгодно то заказывать-проще новое на Озоне, дешевле выходит. Тот же феломент искал для принтера, цена такая же-только вот доставка в два раза дороже. Им в направлении логистики что то нужно делать, с тем же Озоном договариваться, трулевать товары через них. В тех поддержу авито не написать, кругом боты, живых людей нет, по ошибке тогда товар ушел в другой город за 300 верст, но переправить нельзя было в нужную точку. В результате гоняли посылку с одного конца страны в другой несколько раз. Предложений по улучшению сервисов не сделать, у них простонет функционала на сайте такого, а если делается то только то что спрашивают они. Бредовая система, когда ты не слышишь своих клиентов и спрашиваешь то что нужно тебе, а не твоему потребителю. По мне так двигаются в пропасть, просто аналогов нет из за того что юристы аналогичных конкурентов засуживают. Они сложатся, как только появится улучшенная технология доставки, логистики и связи- типа досок через телегу. Слышал уже в глуши активно развивается доставка дронами, люди и продукты заказывают и доставляют и все через телегу заказывают. Так и мелкие вещи смогут, а потом и крупные.


      1. eresik
        27.10.2025 14:31

        Конечно, ваш комментарий не по теме статьи, но очень согласен со всем сказанным. Кроме того что все сбегут на юлу. Та еще фигня, или еще менее удобная.

        Такое ощущение что те кто ими занимаются ориентируются только на какие-то KPI, а сами своими продуктами не пользуются.

        Местные объявления - засраны фактически спамом из других регионов. Ненужные "оптимизации" за которые кто-то даже премии получал наверное. Для примера, буквально вчера хотел купить саженец или плоды калины, если в поиск ввести одно слово "калина" - сразу перекинет на раздел с автомобилями, без вариантов. И постоянно с подобным сталкиваешься/спотыкаешься.


        1. BlakeStone
          27.10.2025 14:31

          Ну так, может быть, это и есть результат работы новых внедрённых на портале технологий?


      1. rail-ka
        27.10.2025 14:31

        А можно подробнее про

        аналогов нет из за того что юристы аналогичных конкурентов засуживают

        Если например я сделаю доску объявлений, они могут подать на меня в суд? У них патенты на доски объявлений в интернете?


  1. PaveLuchkov
    27.10.2025 14:31

    Собственно за всем текстом так и не понятно где модель используется? В какие бизнес процессы ее адаптируют? Или продукт ради продукта?


    1. lampa
      27.10.2025 14:31

      Я так понимаю модерирует отзывы и сразу их отправляет в бан =) А чтобы восстановить отзыв, например "Всё отлично", нужно написать полотно текста в поддержку (читай в пустоту) и скинуть скрины


    1. exTvr
      27.10.2025 14:31

      Собственно за всем текстом так и не понятно где модель используется?


    1. Anastasiya_Rysmyatova Автор
      27.10.2025 14:31

      Здравствуйте! Спасибо за комментарий!
      В данной статье описаны технические подробности обучения A-vibe и метрики модели.

      Основные применения в авито сейчас в задачах:

      • Генерация описания

      • Генерация резюме

      • Бьютификация описаний

      • Суммаризация чатов поддержки

      • Модификация сообщений агентов поддержки

      • Валидация звонков менеджеров Авито

      • Суммаризация отзывов

      • Группировка товаров одной модели в мультиобъявление

      • Редактирование отчетов автотеки 

      • Автоответы в мессенджере за продавца

      • Ассистент для покупателей

      • Генерация подсказок ответов 

        в мессенджере продавцам и покупателям

      • Codegen copilot

      • Code complition

      Про бизнес применения много рассказывали в других докладах и статьях. Вот несколько последних докладов

      Как LLM автоматизирует работу в Авито

      Стажировки в команде LLM

      Генерация описания год спустя


      1. SerJ_82
        27.10.2025 14:31

        Добрый день. Когда я вижу статью от Авито, то повторяю уже не первый год один и где вопрос: неужели так сложно сделать поиск по фотографиям? Пусть даже за дополнительную плату.

        Есть огромное количество тем, где ручной поиск отнимает невероятно много времени. Многие объявления не меняют фотографии годами в попытках продать. И возможность поиска по референсу сильно бы помогла.


      1. EniLight
        27.10.2025 14:31

        ойййй бедааа


    1. HighByte
      27.10.2025 14:31

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


      1. avitocare
        27.10.2025 14:31

        Здравствуйте. Если у вашей знакомой есть вопрос по блокировке аккаунта на Авито, то, пожалуйста, попросите ее написать нам в лс. Дополнительно все проверим и поможем разобраться в ситуации.


  1. JediPhilosopher
    27.10.2025 14:31

    Для меня все статьи от Авито на Хабре выглядят как-то очень странно. С одной стороны тут полно интересных технических деталей, люди с горящими глазами рассказывают как делают крутые проекты и продукты.

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

    Ну то есть ваш основной core функционал глючное тормозное говно, которое живо только потому, что монополист де-факто, и уйти от него некуда.

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

    Не могу поэтому всерьез воспринимать ваши статьи. И судя по комментариям я такой не один.


    1. Ioshi-ta
      27.10.2025 14:31

      Сотка, даже две ) о чем они всегда поют я не понимаю


    1. vlaubenshtein
      27.10.2025 14:31

      А зачем им что-то исправлять, будучи монополистами ?


    1. avitocare
      27.10.2025 14:31

      Здравствуйте. Напишите, пожалуйста, почту или телефон от вашего аккаунта на Авито нам в лс. Все проверим и поможем разобраться в ситуации.


  1. 15432
    27.10.2025 14:31

    Читаю статью и задумываюсь, может, в Авито есть какой-то скрытый тариф, где ты выкладываешь объявление, а дальше эта умная нейросетки за тебя отвечает и товар расхваливает? Вроде нет такого. А иначе зачем всё это? Маты в переписке блокировать? Пока видел только нейроподсказки в диалоге, но это больше смущает, чем помогает вести беседу


  1. Akr0n
    27.10.2025 14:31

    Интересно было бы сравнить A-vision с qwen3-VL.


  1. tairsu
    27.10.2025 14:31

    https://huggingface.co/NightForger/avibe-GGUF

    Ждём поддержки в llama.cpp


  1. Badsanta83
    27.10.2025 14:31

    Когда читаешь такие посты вспоминаешь планета Кин дза дза.

    "Правительство на другой планете живёт, родной"

    Миллион раз кликал пожаловаться на всякие объявления откровенно скотского содержания - они не то что не блокируются, они даже из моей ленты не исчезают и даже чаще появляются. Зато своя ЛЛМ. Был даже случай когда на Авито в мошеннический колл центр набирали и было в объявление требование - необходимость обманывать людей. Я написал в техподдержку и мне ответили что объявление соответствует правилам Авито.


    1. avitocare
      27.10.2025 14:31

      Здравствуйте. Пожалуйста, напишите нам в лс, а также приложите ссылки на подозрительные объявления. Дополнительно все проверим и примем меры, если найдем нарушения.


  1. Mike-M
    27.10.2025 14:31

    Мы создаём решения, которые помогают 72+ млн уникальных пользователей Авито

    Помогают? Вы себе льстите. Почитайте отзывы об Авито, хотя бы на Яндекс Картах.

    Так что LLM вам нужен лишь для того, чтобы еще потуже набить свой карман, включая карман владельцев и акционеров Авито.


  1. Neuralinfo
    27.10.2025 14:31

    Статья интересная, но не в разрезе бизнеса АВИТО, а как отчет СНО (студенческого научного общества) о проделанной работе. Не описана конкретная привязка к вашему бизнесу. каково практическое применение вашей LLM? Улучшит коммуникацию продавца с покупателем? Или наоборот осложнит? Хотя вроде уже дальше и некуда. А про ваше АВИТО, здесь уже только ленивый не высказался. И они правы. Ваше АВИТО, как Газпром, пока монополист, существует, когда появится сильный конкурент, с действительно продвинутыми алгоритмами работы, АВИТО постигнет участь тех двух компании, которые АВИТО поглотила на заре своего развития. У вас много нареканий и недоделок, этим надо заниматься, а не в обучение LLM играться. И очень плохо, что у АВИТО большие проблемы с обратной связью.


  1. nuacho
    27.10.2025 14:31

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


  1. lemix85
    27.10.2025 14:31

    Вы, Авито, лучше бы базовую функциональность сделали по человечески рабочей, а не вот это вот всё.

    Моему профилю на Авито 13 лет, честный продавец с сотней «5» и сотнями продаж с авито-доставкой. Вчера я получил блокировку потому что ваш сервис запросил повторную идентификацию по T-ID и она, б***ь, на ваш взгляд не соответствует той, что я проходил раньше. Поддержка предлагает зарегистрировать новый акк. Сказочные идиоты.

    Поэтому не понятно, что вы там для людей и для бизнеса делаете.


    1. nuacho
      27.10.2025 14:31

      Самое интересное, что новый акк зарегить можно, а вот подтвердить через те же банки не получится. Потому что, сюрприз, вы уже ее или прошли, но с другим номером, или как у вас написано - не соответствует той, что раньше с вашим номером уже проходили. Не поможет даже другой номер телефона. И в итоге ваш новый акк сверхразум Авито тоже заблокирует за подозрительную активность. Феерический сервис, конечно. В поддержку обращаться бесполезно. Отвечает тот же сверхразум шаблонными фразами. Типа, это мы так заботимся о вас.


    1. avitocare
      27.10.2025 14:31

      Здравствуйте. Напишите, пожалуйста, почту или телефон от вашего аккаунта на Авито нам в лс. Все проверим.


  1. KengHO
    27.10.2025 14:31

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


    1. avitocare
      27.10.2025 14:31

      Здравствуйте. Если у вас есть сложности с получением уведомлений, то, пожалуйста, напишите нам в лс. А также укажите, на какой платформе происходит такая ситуация. Все проверим.


  1. barker
    27.10.2025 14:31

    Присоединюсь к иронии над этой конторой ппплохих людей. Потерял аккаунт с почти 15-летней историей и рейтингом в 5.0, какие-то подозрительности, какие не скажут. Совершенно точно не нарушал, чисто бытовой акк купи/продай изредка. Совершенно точно не взлом, доступ ко всем факторам авторизации имеется, мыло/тел не менялся никогда. Новый акк так же не подтвердить, со старым не связать, он подозреваемый. На всё отвечают отписками (видимо, искусственным интеллектом).


    1. avitocare
      27.10.2025 14:31

      Здравствуйте. Напишите, пожалуйста, почту или телефон от вашего аккаунта на Авито нам в лс. Все проверим.


  1. linakun
    27.10.2025 14:31

    Раз уж начали жаловаться на авито, то и я вброшу свои 5 копеек.

    В некоторых объявлениях есть возможность заказывать несколько штук данного товара. В целом идея крутая, но реализация и того "круче". Хотел я заказать 10 плашек оперативки по такому объявлению, добавил их в корзину и немного так офигел. Авито предлагал оплатить доставку каждой единицы товара отдельно, так и отправить их тоже по отдельности. Итого, доставка вышла 2 тысячи рублей за 10 маленьких планочек. И только спустя год они поправили этот "баг", хотя он порой да всплывает еще.


    1. avitocare
      27.10.2025 14:31

      Здравствуйте. Если у вас есть сложности или вопросы по оплате доставки, напишите, пожалуйста, почту или телефон от вашего аккаунта на Авито нам в лс. Все проверим.