Всем привет, меня зовут Алан, я разработчик-исследователь в MTS AI, мы сейчас активно изучаем LLM, тестируя их возможности. В настоящее время в России вышло несколько коммерческих языковых моделей, в том числе GigaChat и YandexGPT, которые хорошо выполняют текстовые задачи. В этой статье показывается, что языковая модель меньшего размера, обученная на открытых данных за несколько часов, показывает сравнительно неплохую, а в некоторых случаях и лучшую производительность относительно больших коммерческих решений. На небольшом количестве примеров мы проверим способность моделей решать простые математические задачи, отвечать на вопрос по заданному контексту, в котором содержатся числа и выполнять простые текстовые инструкции. Затем кратко рассмотрим, как и на чем обучалась наша модель.

Ответ на вопрос по контексту

В качестве открытой модели выступает первая версия LLaMa-7B, тонко настроенная на наборе данных IlyaGusev/ru_turbo_saiga

Приведем два примера:

  1. Prompt: "В магазине приложений есть следующие приложения: app1 стоит 1500 рублей, приложение app2 стоит 2000 рублей, оно самое популярное, приложение app3 стоит 3000 рублей. Сколько стоит app3?"

    Довольно простой промт, с которым управится ruT5-base, зафайнтюненная на squad. У GigaChat возникают проблемы с ответом:

Интерфейс GigaChat

У YandexGPT тоже проблемы с этим вопросом:

YandexGpt

Как отвечает LLaMa (после "bot"):

Предложение обрывается из- за ограничения в количестве генерируемых токенов
  1. Prompt: "У нас есть много курсов. 11 курсов по программирование, 10 курсов по русскому языку. Сколько курсов в сумме?"

    С этим вопросом ruT5 уже не справиться, так как она не умеет складывать, но GigaChat это должно быть по силам (или нет):

LLaMa ответила правильно:

При изменении чисел в промте LLaMa все равно отвечает правильно.

Если говорить про контекст, то коммерческие модели справляются хорошо, но они спотыкаются на подобных вопросах

GigaChat:

YandexGPT:

LLaMa:

Небольшая оценка производительности моделей с помощью ChatGPT

Важно: Для более объективной оценки нам понадобятся больше задач по математике. При этом HumanEval, на котором OpenAI валидирует свои модели, содержит всего 135 задач, а MMLU 113

Сначала мы протестировали возможности LLM на 25 простых математических задачах, сгенерированных с помощью ChatGPT. Здесь LLaMa выигрывает у GigaChat, и при этом всего на две единицы отстает от большой YandexGPT, что довольно неплохо.

Вопросы
  1. В ресторане есть меню, где стейк стоит 500 рублей, салат - 150 рублей, и напиток - 75 рублей. Сколько будет стоить обед для двух человек?

  2. В магазине одежды платье стоит 1200 рублей, а сумка - 800 рублей. Сколько всего денег потратит покупатель, если он купит оба товара?

  3. В библиотеке есть 5 книг по 250 страниц в каждой. Сколько всего страниц в этих книгах?

  4. Если автомобиль движется со скоростью 60 км/час в течение 3 часов, какое расстояние он преодолеет?

  5. У ресторана есть 8 столов, каждый вмещает 4 человека. Сколько всего посетителей может обслужить ресторан?

  6. В магазине продается 5 видов фруктов: яблоки по 50 рублей за килограмм, бананы по 60 рублей за килограмм, апельсины по 70 рублей за килограмм, груши по 80 рублей за килограмм и мандарины по 90 рублей за килограмм. Сколько будет стоить 2 килограмма яблок и 1 килограмм бананов?

  7. Если у вас есть 12 яблок, и вы съедаете 3 яблока, сколько останется яблок?

  8. В аптеке есть 4 разных лекарства: анальгетик за 100 рублей, антибиотик за 150 рублей, жаропонижающее за 75 рублей и витамины за 50 рублей. Сколько всего денег нужно, чтобы купить все эти лекарства?

  9. Если у вас есть 20 долларов, а вы купили книгу за 12 долларов, сколько долларов у вас останется?

  10. Ваша зарплата составляет 2000 долларов в месяц. Сколько вы заработаете за 6 месяцев?

  11. Если автобус двигается со скоростью 40 км/час и проезжает 160 км, сколько времени займет ему доехать до пункта назначения?

  12. В спортивном магазине мяч для футбола стоит 25 долларов, а баскетбольный мяч - 30 долларов. Сколько долларов нужно заплатить за оба мяча?

  13. В саду растут 3 яблони, на каждой из них 5 яблок. Сколько яблок всего вы сможете собрать?

  14. В аэропорту есть 5 вылетающих рейсов каждый день. Сколько рейсов вылетит за неделю?

  15. Вам нужно купить билеты в кино для 4 человек. Билеты стоят 10 долларов каждый. Сколько вы заплатите за все билеты?

  16. Если у вас есть 3 красных маркера, 4 синих маркера и 2 зеленых маркера, сколько всего маркеров у вас есть?

  17. В сумке лежат 8 карандашей и 5 ручек. Сколько предметов для письма у вас в сумке?

  18. В магазине продается 6 видов соков: апельсиновый, яблочный, грушевой, вишневый, ананасовый и мультифруктовый. Если каждый сок стоит по 2 доллара, сколько будет стоить покупка всех шести видов соков?

  19. Если у вас есть 10 монет по 5 центов и 5 монет по 10 центов, сколько всего центов у вас есть?

  20. В книжном магазине 15 романов, 10 детских книг и 5 учебников. Сколько всего книг в магазине?

  21. Вам нужно заправить бак автомобиля. Если бензин стоит 2,50 доллара за галлон, и ваш бак вмещает 15 галлонов, сколько вы заплатите за заправку?

  22. В зоопарке живут 7 слонов, 12 тигров и 5 жирафов. Сколько всего животных в зоопарке?

  23. Если у вас есть 3 брата и 2 сестры, сколько всего детей в вашей семье?

  24. В магазине продается 4 видов молока: обычное молоко, обезжиренное молоко, соевое молоко и миндальное молоко. Если каждое молоко стоит по 3 доллара за пакет, сколько долларов нужно заплатить за все четыре вида молока?

  25. Если у вас есть 60 минут на выполнение задания, и вы уже потратили 15 минут, сколько времени у вас осталось?

model

rights answers

LLaMa

17/25

GigaChat

9/25

YandexGPT

19/25

25 задач на "больше- меньше". Здесь GigaChat показал себя лучше чем LLaMa

Вопросы
  1. В ресторане есть следующие блюда: блюдо1 стоит 250 рублей, блюдо2 стоит 300 рублей, а блюдо3 стоит 450 рублей. Какое из блюд самое дорогое?

  2. В магазине автомобилей есть следующие модели: модель1 стоит 25,000 долларов, модель2 стоит 30,000 долларов, а модель3 стоит 35,000 долларов. Какая модель самая дорогая?

  3. У студентов есть следующие предметы: предмет1 оценивается в 90 баллов, предмет2 - в 85 баллов, а предмет3 - в 92 балла. В каком предмете оценка выше всего?

  4. В магазине одежды есть следующие товары: товар1 стоит 40 долларов, товар2 стоит 55 долларов, а товар3 стоит 30 долларов. Какой товар самый дешевый?

  5. В кино есть следующие фильмы: фильм1 длится 120 минут, фильм2 - 105 минут, а фильм3 - 140 минут. Какой фильм самый длинный?

  6. В компьютерной игре есть следующие персонажи: персонаж1 имеет 100 здоровья, персонаж2 - 80 здоровья, а персонаж3 - 120 здоровья. Какой персонаж имеет наибольшее здоровье?

  7. У группы друзей есть следующие возрасты: друг1 - 25 лет, друг2 - 28 лет, а друг3 - 22 года. Какому другу самому молодому?

  8. В спортивном состязании есть следующие команды: команда1 набрала 300 очков, команда2 - 280 очков, а команда3 - 350 очков. Какая команда выиграла?

  9. У растений есть следующие высоты: растение1 - 60 см, растение2 - 45 см, а растение3 - 70 см. Какое растение самое высокое?

  10. В библиотеке есть следующие книги: книга1 имеет 200 страниц, книга2 - 180 страниц, а книга3 - 250 страниц. Какая книга самая объемная?

  11. В магазине фруктов есть следующие виды фруктов: фрукт1 стоит 2 доллара за килограмм, фрукт2 стоит 3 доллара за килограмм, а фрукт3 стоит 2,5 доллара за килограмм. Какой фрукт самый дорогой?

  12. В магазине есть следующие соки: сок1 стоит 4 доллара за литр, сок2 стоит 3,5 доллара за литр, а сок3 стоит 5 долларов за литр. Какой сок самый дешевый?

  13. У трех учеников есть следующие оценки по математике: ученик1 получил 85 баллов, ученик2 - 90 баллов, а ученик3 - 88 баллов. Какой ученик имеет наивысший балл?

  14. В кафе есть следующие десерты: десерт1 стоит 6 долларов, десерт2 стоит 7 долларов, а десерт3 стоит 5 долларов. Какой десерт самый дорогой?

  15. У трех компаний есть следующие годовые доходы: компания1 заработала 2 миллиона долларов, компания2 - 2,5 миллиона долларов, а компания3 - 1,8 миллиона долларов. Какая компания заработала больше всего?

  16. В магазине есть следующие виды молока: молоко1 стоит 1,5 доллара за литр, молоко2 стоит 2 доллара за литр, а молоко3 стоит 1,8 доллара за литр. Какое молоко самое дешевое?

  17. У трех спортсменов есть следующие рекорды: спортсмен1 пробежал 100 метров за 10 секунд, спортсмен2 - за 9,5 секунд, а спортсмен3 - за 11 секунд. Какой спортсмен самый быстрый?

  18. В магазине есть следующие виды кофе: кофе1 стоит 8 долларов за фунт, кофе2 стоит 10 долларов за фунт, а кофе3 стоит 7,5 долларов за фунт. Какой кофе самый дорогой?

  19. У трех городов есть следующие населения: город1 имеет 500,000 жителей, город2 - 600,000 жителей, а город3 - 450,000 жителей. В каком городе больше всего жителей?

  20. В магазине есть следующие виды часов: часы1 стоят 200 долларов, часы2 стоят 250 долларов, а часы3 стоят 180 долларов. Какие часы самые дорогие?

  21. В магазине есть следующие виды мебели: мебель1 стоит 600 долларов, мебель2 стоит 700 долларов, а мебель3 стоит 550 долларов. Какая мебель самая дешевая?

  22. У трех ресторанов есть следующие рейтинги: ресторан1 имеет рейтинг 4.5 звезды, ресторан2 - 4.8 звезды, а ресторан3 - 4.2 звезды. Какой ресторан имеет наивысший рейтинг?

  23. В магазине есть следующие виды обуви: обувь1 стоит 80 долларов, обувь2 стоит 100 долларов, а обувь3 стоит 70 долларов. Какая обувь самая дорогая?

  24. У трех фильмов есть следующие продолжительности: фильм1 длится 120 минут, фильм2 - 135 минут, а фильм3 - 110 минут. Какой фильм самый короткий?

  25. В магазине есть следующие виды мороженого: мороженое1 стоит 3 доллара за порцию, мороженое2 стоит 4 доллара за порцию, а мороженое3 стоит 2,5 доллара за порцию. Какое мороженое самое дешевое?

Для чистоты этого небольшого эксперимента под каждый вопрос контекст очищался, так как математические способности моделей проседали при большом контексте (кроме YandexGPT).

Далее мы попросили ChatGPT оценить несколько ответов моделей. При генерации больших текстов gigachat выигрывает, LLaMa может повторяться и не умеет вовремя останавливаться, на некоторых коротких текстах модели показывают примерно одинаковую производительность. Примеры можно посмотреть ниже.

Примеры

Промт: "напиши рассказ от имени утки"

Llama
gigachat

Промт: "Опиши свой любимый фильм без раскрытия сюжета". Здесь обе модели не справились (llama еще и выдумала фильм)

llama

gigachat

Промт: "Расскажи историю о приключениях героя, который оказался в магическом лесу". Gigachat справился лучше, как и во многих подобных задачах

лламе нравятся эмодзи

Gigachat

Промт: "Расскажи о своей мечте, будь то путешествие или достижение цели"

llama
gigachat

Промт: "Напиши короткое описание летнего заката на озере". Видно как LlaMa повторяется

llama

gigachat

Finetuning LlaMa- 7B

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

Набор данных

Как ранее уже упоминалось, LLaMa- 7B обучена на наборе IlyaGusev/ru_turbo_saiga.

Набор данных представляет собой 37 тысяч сгенерированных с помощью СhatGPT небольших диалогов между пользователем и виртуальным ассистентом. Изначально планировалось обучить FRED- T5, поэтому набор данных был подготовлен для обучения text2text модели. В начало каждого сообщения добавлена роль user/bot. На вход T5 подается список сообщений, таргетом является последнее предложение в диалоге- ответ бота. FRED- T5 не подходит для подобной задачи, так как при инференсе на вход модель будет ожидать сразу список сообщений.

Датасет с ролями user/bot в начале сообщений доступен на Hugging Face

Более подходящей для данной задачи архитектурой является decoder- only transformer. Для файнтюнинга была выбрана модель LLaMa-7B, после чего датасет был подготовлен для обучения языковой модели:

raw_dataset = load_dataset('AlanRobotics/saiga')

def tokenized_function(example):
    outputs = tokenizer(example['instructions'],
                        example['outputs'], 
                        truncation=True, 
                        max_length=context_length,
                        return_overflowing_tokens=True,
                        return_length=True,)
    
    input_batch = []
    for length, input_ids in zip(outputs["length"], outputs["input_ids"]):
        if length == context_length:
            input_batch.append(input_ids)
    return {"input_ids": input_batch}


tokenized_datasets = raw_dataset.map(
    tokenized_function, batched=True, remove_columns=raw_dataset["train"].column_names
)

tokenized_datasets = tokenized_datasets['train'].train_test_split(0.1, 0.9)

Здесь мы отфильтровываем фрагменты размером меньше чем context_length

Тонкая настройка

При обучении использовались метод LoRA и библиотека PEFT (Parameter-Efficient Fine-Tuning). Для этого мы заморозили слои языковой модели и "прикрепили" адаптеры меньшей размерности. Это позволяет обучать меньшее количество параметров, что актуально для LMM. В нашем случае модель вместо 7 миллиардов обучалась примерно на 300 миллионах параметров.

Код с LoRA выглядит следующим образом:

model = AutoModelForCausalLM.from_pretrained('huggyllama/llama-7b')
tokenizer = AutoTokenizer.from_pretrained('huggyllama/llama-7b')

peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)

model = get_peft_model(model, peft_config)
model.print_trainable_parameters()

r- это ранг матриц адаптеров;

lora_alpha- это коэффициент масштабирования

Код обучения:

args = TrainingArguments(
    output_dir="llama",
    per_device_train_batch_size=4,
    per_device_eval_batch_size=4,
    evaluation_strategy="epoch",
    num_train_epochs=3,
    weight_decay=0.1,
    learning_rate=3e-4
)

trainer = Trainer(
    model=model,
    tokenizer=tokenizer,
    args=args,
    data_collator=data_collator,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
)

trainer.train()

model.save_pretrained('llama_peft')

Инференс:

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

model = AutoModelForCausalLM.from_pretrained('huggyllama/llama-7b', device_map='auto')
tokenizer = AutoTokenizer.from_pretrained('huggyllama/llama-7b')
model = PeftModel.from_pretrained(model, 'llama_peft')

tokenized_sentence = tokenizer(prompt, return_tensors='pt')
res = model.generate(**tokenized_sentence, max_length=256, num_beams=1)
tokenizer.decode(res[0], skip_special_tokens=True)

Модель обучалась на 2xA100 с использованием data parallelism и accelerate в течение нескольких часов

Пример работы с контекстом
Элон Маска

Выводы

В целом LLaMa показывает сравнительно неплохие результаты, учитывая следующее:

  1. LLaMa меньше, чем языковая модель GigaChat: 7 миллиардов параметров против 13.

  2. LLaMa обучалась на открытом датасете с Hugging Face в течении нескольких часов.

При этом LLaMa показывает себя лучше, чем GigaChat в задачах, где нужно что- то посчитать или извлечь число из контекста (речь идет о конкретном домене задач). Также LlaMa сравнительно неплохо генерирует текст и поддерживает диалог с пользователем.