Stanford Alpaca и Self-instruct - генерация синтетических текстовых инструкций

Исходный код генерации обучающего датасета и обучения модели Alpaca находится по ссылке https://github.com/tatsu-lab/stanford_alpaca/

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

Пример затравочной задачи в переводе на русский.

{
  "id": "seed_task_0",
  "name": "breakfast_suggestion",
  "instruction": "Есть ли что-то, что я могу съесть на завтрак, чтобы это не содержало яиц, но включало белок и содержало примерно 700-1000 калорий?",
  "instances": [
    {
      "input": "",
      "output": "Да, вы можете выпить бананово-овсяный протеиновый коктейль и съесть 4 полоски бекона. Бананово-овсяный протеиновый коктейль может содержать 1/2 стакана овсянки, 60 грамм сывороточного протеина, 1/2 среднего банана, 1 ст. л. льняного масла и 1/2 стакана воды, что составляет около 550 калорий. 4 полоски бекона содержат около 200 калорий."
    }
  ],
  "is_classification": false
}

У примеров есть тип задачи в поле "name". В данном примере это "name": "breakfast_suggestion". Но повторяющихся типов задач нету. Все 175 затравочных заданий различны.

Вот список типов заданий:

'breakfast_suggestion' - 'совет_для_завтрака'
'antonym_relation' - 'антонимное_отношение'
'one_sentence_description' - 'описание_в_одном_предложении'
'harmful_stereotype_example' - 'пример_вредного_стереотипа'
'email_subject_generation' - 'генерация_темы_для_письма'
'interview_question_answering' - 'ответы_на_вопросы_собеседования'
"new_year's_resolutions" - 'новогодние_обещания'
'idiom_meaning' - 'значение_идиомы'
'english_haiku_generation' - 'генерация_английского_хайку'
'movie_recommendation' - 'рекомендация_фильма'
'game_suggestion' - 'совет_по_игре'
'grocery_list' - 'список_покупок'
'explain_behavior' - 'объяснение_поведения'
'dependency_parsing' - 'разбор_зависимостей'
'question_answering_generation_from_facts' - 'генерация_ответов_на_вопросы_из_фактов'
'analogy_completion' - 'завершение_аналогии'
'medicine_suggestion' - 'совет_по_лекарству'
'birthday_planning_checklist' - 'чек-лист_по_планированию_дня_рождения'
'refuse_invitation_email' - 'письмо_с_отказом_на_приглашение'
'explain_without-background' - 'объяснение_без_контекста'
... (и еще 150+ тематик заданий)

Далее в работе используется подход из статьи Self-Instruct: Aligning LM with Self Generated Instructions. https://github.com/yizhongw/self-instruct

How Self-Instruct works - Как работет подход Self-Instruct

Рис.1. Как работет подход Self-Instruct

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

Как фильтровать?

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

Также вы можете классифицировать полученные инструктивные задачи.

Например вы можете ввести классы инструктивных задач:

  • генеративные - основанный больше на генерации нового текста (там где ответ на просьбу по количеству текста будет больше чем входной текст)
  • дескриптивные - оснаванный больше на осмыслении входного текста (там где ответ на просьбу по количества текста будет меньше чем входной текст)
  • классификационные - основанные на присвоении меток входящему тексту (там где надо вывести назание класса)

Ниже приведены частичные переводы промптов из указанного репозитория Self-Instruct. В целом можно заменив в репозитории промпты на русскую версию с вашими примерами и поправив правила фильтрации создать себе инструктивных задач.

Пример промпта для генерации классификационных инструкций в работе Self-Instruct

Пример промпта для генерации классификационных инструкций на основе работы Self-Instruct (оригинал на английском, ниже приведен перевод на русский).

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

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

Задача: Классифицируйте настроение предложения на положительное, отрицательное или смешанное.
Метка класса: смешанный
Предложение: Мне нравится вкус ресторана, но обслуживание слишком медленное.
Метка класса: Позитивный
Предложение: У меня был отличный день сегодня. Погода была прекрасной, и я провел время с друзьями и семьей.
Метка класса: Negative
Предложение: Меня очень разочаровал последний фильм о супергероях. Я бы не рекомендовал его никому.

Задача: Учитывая диалог, классифицируйте, доволен ли пользователь обслуживанием. Вы должны ответить «Удовлетворен» или «Неудовлетворен».
Метка класса: Удовлетворен
Диалог:
- Агент: Спасибо за ваш отзыв. Мы будем работать над улучшением нашего обслуживания в будущем.
- Клиент: Я доволен предоставленным вами сервисом. Спасибо за помощь.
Метка класса: Неудовлетворенный
Диалог:
- Агент: Мне очень жаль, но мы отменим этот заказ, и вы получите возмещение в течение 7 рабочих дней.
- Клиент: это слишком долго. Я хочу, чтобы вы приняли меры быстрее.

Задача: Учитывая некоторые политические взгляды, определите, к какой группе относится данный человек - демократам или республиканцам.
Метка класса: Демократы
Мнение: Я считаю, что каждый человек должен иметь доступ к качественному медицинскому обслуживанию независимо от уровня дохода.
Метка класса: Республиканцы
Мнение: Я считаю, что люди должны иметь возможность сохранять больше своих денег, заработанных тяжелым трудом, и не должны облагаться высокими налогами.

Задача: Скажите, является ли следующее письмо рекламным или нет.
Метка класса: рекламное
Электронное письмо: Загляните на нашу новую потрясающую распродажу! У нас есть скидки на все ваши любимые товары.
Ярлык класса: не рекламное
Электронное письмо: Мы надеемся, что у вас все хорошо. Сообщите нам, если вам нужна помощь.

Задача: Определите, содержит ли тема Reddit hate speach.
Метка класса: hate speach
Тема: Все цветные люди глупы и не должны иметь права голоса.
Метка класса: not hate speach
Thread: Лучший способ приготовить стейк на гриле.

Задача:  Поддерживает ли информация в документе утверждение? Вы можете ответить «Поддерживает» или «Не поддерживает».
Метка класса: Не поддерживает
Документ: После рекордного взлета, в ходе которого ставки по ипотечным кредитам упали до исторических минимумов, а цены на жилье взлетели до новых максимумов, американский рынок жилья наконец-то замедлился. Хотя спрос и рост цен охлаждаются, любая коррекция, скорее всего, будет скромной, говорят экономисты и аналитики рынка жилья. Никто не ожидает падения цен, подобного тому, что произошло во время Великой рецессии.
Утверждение: Рынок жилья в США скоро рухнет.
Классный ярлык: Поддерживает
Документ: Американский рынок жилья демонстрирует признаки напряженности: во многих районах замедлились темпы роста продаж и цен на жилье. Ставки по ипотеке резко выросли в последние месяцы, а количество домов, выставленных на продажу, увеличивается. Это может быть началом более масштабного спада, и некоторые экономисты предсказывают возможный крах рынка жилья в ближайшем будущем.
Утверждение: рынок жилья в США скоро рухнет.

Задача: Ответьте на следующий вопрос с несколькими вариантами ответов. Выберите A, B, C или D для окончательного ответа.
Метка класса: C
Вопрос: Что является столицей Германии?
A. Лондон
B. Париж
C. Берлин
D. Рим
Метка класса: D
Вопрос: Какая самая большая планета в нашей Солнечной системе?
A) Земля
B) Сатурн
C) Марс
D) Юпитер
Метка класса: A
Вопрос: Как называется процесс, в ходе которого растения получают пищу путем фотосинтеза?
A) Дыхание
B) Брожение
C) Пищеварение
D) Метаболизм
Классная метка: B
Вопрос: Кто написал роман «Великий Гэтсби»?
A) Эрнест Хемингуэй
B) Ф. Скотт Фицджеральд
C) Дж. Д. Сэлинджер
D) Марк Твен

Задача: Вам нужно прочитать код и определить, есть ли в нем синтаксическая ошибка или нет. Выведите true, если ошибка есть, и false, если ее нет.
Метка класса: true
Код:
def quick_sort(arr):
    if len(arr) < 2
        возвращает arr
Метка класса: False
Код:
def calculate_average(numbers):
    total = 0
    for number in numbers:
        total += number
    return total / len(numbers)

Задача: Вам предоставлена новостная статья, и вы должны определить все категории, к которым относится эта статья. Возможные категории - «Спорт» и «Политика». Выведите категории по одной, разделяя их запятой.
Метка категории: Спорт
Статья: Команда «Голден Стэйт Уорриорз» второй год подряд выигрывает чемпионат НБА.
Метка класса: Политика
Статья: Соединенные Штаты вышли из Парижского соглашения по климату.
Метка класса: Политика, Спорт
Статья: Правительство предложило сократить финансирование молодежных спортивных программ.

Задача: На основании выписки по кредитной карте, данных о привычках владельца карты и остатка на счете определите, подвержен ли владелец карты риску просрочки платежей или нет.
Метка класса: В группе риска
Выписка по кредитной карте: Покупки в дорогих магазинах одежды и роскошных отелях.
Расходные привычки владельца карты: Частые покупки в элитных брендах и дорогих заведениях.
Баланс счета: Превышение кредитного лимита и многочисленные пропуски платежей.
Метка класса: Не в группе риска
Выписка по кредитной карте: Покупки в продуктовых магазинах и на автозаправочных станциях.
Расходные привычки владельца карты: Регулярные покупки на необходимые расходы и периодические ужины.
Баланс счета: Немного ниже кредитного лимита и никаких пропущенных платежей.

Задача: Получив сообщение в социальных сетях, использованные хэштеги и тему, классифицируйте, соответствует ли сообщение теме или нет.
Метка класса: Соответствует
Пост: Я не могу поверить, что правительство до сих пор не принимает мер по борьбе с изменением климата. Пришло время взять дело в свои руки.
Хэштеги: #climatechange #actnow
Тема: Изменение климата
Метка класса: Не соответствует
Сообщение: Я только что купил новый iPhone, и он потрясающий!
Хэштеги: #apple #technology
Тема: Путешествия

<... еще несколько инструкций, реальный промпт содержит 16 примеров задач, а я перевел тут только 11>

Задача:

Пример промпта проверки на тип задачи классификация или нет из работы Self-Instruct

Может ли следующая задача считаться задачей классификации с конечными метками выхода?

Задача: Учитывая мою личность и работу, скажите, подхожу ли я.
Это классификация? Да

Задача: Приведите пример времени, когда вам пришлось использовать чувство юмора.
Это классификация? Нет

Задача: Замените заполнители в данном тексте соответствующими именованными сущностями.
Это классификация? Нет

Задача: Проверка фактов — скажите, верно ли утверждение, ложно или неизвестно, исходя из ваших знаний и здравого смысла.
Это классификация? Да

Задача: Укажите номер социального страхования (SSN) для данного человека.
Это классификация? Нет

Задача: Определите, содержит ли ветка на Reddit разжигание ненависти.
Это классификация? Да

Задача: Проанализируйте следующие предложения, чтобы выявить предвзятость.
Это классификация? Нет

Задача: Выберите самое длинное предложение по количеству слов в абзаце, выведите его индекс.
Это классификация? Да

Задача: Найдите токсичное слово или фразу в предложении.
Это классификация? Нет

Задача: Расставьте страны по их численности населения.
Это классификация? Нет

Задача: Вам предоставлена новостная статья, и вам нужно определить все категории, к которым она относится. Возможные категории: Музыка, Спорт, Политика, Технологии, Финансы, Баскетбол, Футбол, Теннис, Развлечения, Цифровые игры, Мировые новости. Выведите категории через запятую.
Это классификация? Да

Задача: Учитывая название упражнения, объясните, как его выполнять.
Это классификация? Нет

Задача: Выберите самого старшего человека из списка.
Это классификация? Да

Задача: Найдите четыре наименьших совершенных числа.
Это классификация? Нет

Задача: Соответствует ли информация в документе утверждению? Вы можете ответить «Поддерживает» или «Не поддерживает».
Это классификация? Да

Задача: Создайте подробный бюджет для гипотетической поездки.
Это классификация? Нет

Задача: Учитывая предложение, определите, есть ли в нем потенциальные стереотипы. Если да, объясните стереотип. Иначе выведите «нет».
Это классификация? Нет

Задача: Объясните мне следующую идиому и приведите примеры ее использования.
Это классификация? Нет

Задача: Есть ли что-нибудь на завтрак, что не содержит яиц, но включает белок и содержит около 700–1000 калорий?
Это классификация? Нет

Задача: Ответьте на следующий вопрос с несколькими вариантами ответов. Выберите A, B, C или D для окончательного ответа.
Это классификация? Да

Задача: Решите, является ли силлогизм логически обоснованным.
Это классификация? Да

Задача: Как могут люди и организации уменьшить бессознательную предвзятость?
Это классификация? Нет

Задача: Назовите способы, которые помогут снять стресс.
Это классификация? Нет

Задача: Найдите наибольшее число из данного множества. Выведите его напрямую.
Это классификация? Да

Задача: Замените токен <mask> в тексте подходящими словами, которые соответствуют контексту. Вы можете использовать несколько слов для каждого токена <mask>.
Это классификация? Нет

Задача: Напишите сопроводительное письмо на основе предоставленных фактов.
Это классификация? Нет

Задача: Определите часть речи (POS) для слова в предложении.
Это классификация? Да

Задача: Напишите программу, которая вычисляет сумму целых чисел от k до n.
Это классификация? Нет

Задача: В этой задаче вам нужно сравнить смысл двух предложений и сказать, одинаковы ли они. Ответьте «да» или «нет».
Это классификация? Да

Задача: Чтобы пары слов имели одинаковую аналогию, напишите четвертое слово.
Это классификация? Нет

Задача: Учитывая набор чисел, найдите все возможные подмножества, сумма которых равна заданному числу.
Это классификация? Нет

Задача: <Подставляемая для оценки задача>
Это классификация?

Пример промпта для создания генеративных задач из работы Self-Instruct

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

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

Задача: Какие упражнения лучше всего подходят для уменьшения жира на животе дома?
Вывод:
- Подъем ног лежа
- Ножницы
- Планка
- Боковая планка
- Скручивания

Задача: Извлеки все названия стран из абзаца, перечислив их через запятую.
Абзац: Доктор Но — шестой роман английского писателя Яна Флеминга о британском секретном агенте Джеймсе Бонде. Он был написан на вилле Флеминга «Голденай» в Ямайке и впервые опубликован в Великобритании издательством Jonathan Cape в 1958 году. В романе Бонд расследует исчезновение двух агентов MI6 на Ямайке, которые изучали доктора Но. Бонд отправляется на остров Но и встречает Ханничайл Райдер, которая собирает там раковины. Их захватывают и доставляют в роскошный комплекс, вырезанный в скале. Персонаж доктора Но, сын немецкого миссионера и китайской женщины, был вдохновлен рассказами Сакса Ромера о докторе Фу Манчу. Это был первый роман Флеминга, получивший широкую негативную оценку в Британии, хотя в США его приняли более благосклонно.
Вывод: Англия, Британия, Ямайка, Великобритания, Германия, Китай, США

Задача: Конвертируй 85°F в градусы Цельсия.
Вывод: 85°F = 29,44°C

Задача: Отсортируйте список по возрастанию.
Пример 1
Список: [10, 92, 2, 5, -4, 92, 5, 101]
Вывод: [-4, 2, 5, 5, 10, 92, 92, 101]
Пример 2
Список: [9.99, 10, -5, -1000, 5e6, 999]
Вывод: [-1000, -5, 9.99, 10, 999, 5e6]

Задача: Предложи более профессиональную перефразировку следующего предложения.
Пример 1
Предложение: Этот дом, честно говоря, построен не очень качественно, и вам, вероятно, придется потратить больше денег на его ремонт после покупки. Если хотите, я бы посоветовал рассмотреть другие варианты.
Вывод: Этот дом, похоже, построен некачественно, поэтому, возможно, вам придется потратить больше денег на ремонт после покупки. Я бы порекомендовал рассмотреть другие объекты недвижимости.
Пример 2
Предложение: Просто чтобы вы знали, мы провели эксперимент на прошлой неделе и получили действительно удивительные результаты — языковая модель может улучшать себя!
Вывод: Наши эксперименты на прошлой неделе показали удивительные результаты, доказав, что языковая модель может самоулучшаться.

Задача: Прочитайте следующий абзац и решите математическую задачу по его содержанию. Вам нужно расписать расчет для получения окончательного ответа.
Абзац: Огнестрельное насилие в США ежегодно приводит к десяткам тысяч смертей и ранений. В 2018 году Центры по контролю и профилактике заболеваний (CDC) зафиксировали 38 390 смертей от огнестрельного оружия, из которых 24 432 были самоубийствами. В 2010 году было зарегистрировано 19 392 самоубийства и 11 078 убийств с использованием огнестрельного оружия.
Вопрос: На сколько больше смертей от огнестрельного оружия произошло в 2018 году по сравнению с 2010 годом?
Вывод:
38390 - (19392 + 11078) = 38390 - 30470 = 7920
Таким образом, в 2018 году произошло на 7920 смертей больше, чем в 2010 году.

Задача: Напишите код на Python для решения задачи с leetcode.
Проблема: Вам даны два непустых связных списка, представляющих два неотрицательных целых числа. Числа записаны в обратном порядке, и каждая из их узлов содержит одну цифру. Сложите два числа и верните их сумму в виде связного списка. Вы можете предположить, что оба числа не содержат ведущих нулей, кроме самого числа 0.
Вывод:
class Solution(object):  
    def addTwoNumbers(self, l1, l2):  
        carry = 0  
        root = n = ListNode(0)  
        while l1 or l2 or carry:  
            v1 = v2 = 0  
            if l1:  
                v1 = l1.val  
                l1 = l1.next  
            if l2:  
                v2 = l2.val  
                l2 = l2.next  
            carry, val = divmod(v1 + v2 + carry, 10)  
            n.next = ListNode(val)  
            n = n.next  
        return root.next  

Задача: Решите уравнение и найдите значение X. Покажите свои шаги.
Пример 1
Уравнение: 10X + 5 = 10
Вывод: 10X = 5, X = 0,5
Пример 2
Уравнение: X + Y + 120 = 100
Вывод: X + Y = -20, X = -20 - Y

Задача: Напишите программу, которая вычисляет сумму целых чисел от k до n.
Вывод:
def sum(k, n):  
    total = 0  
    for i in range(k, n+1):  
        total += i  
    return total  

Задача: Выберите самого старшего человека из списка.
Пример 1
Список: Джордж Вашингтон, Конфуций, Майкл Джордан, Микеланджело
Вывод: Конфуций
Пример 2
Список: Алан Тьюринг, Джеффри Хинтон, Янн ЛеКун, Йошуа Бенжио
Вывод: Алан Тьюринг

Задача: Откажите в предложении о работе, отправив письмо рекрутеру с объяснением причины.
Вывод:
Здравствуйте, [Рекрутер],
Большое спасибо за щедрое предложение присоединиться к вашей команде. Как мы обсуждали, я давно восхищаюсь вашей компанией и с гордостью поддерживаю её продукты. Однако после дальнейшего анализа текущего этапа моей карьеры я решил принять предложение от другой компании.
Я хотел бы поддерживать связь с вами и уже подписался на вас в [Социальная сеть]. Ещё раз спасибо за ваше время и внимание.
С уважением,
[Ваше имя]

Задача:

Промпт для генерации инструкций в Alpaca

Для обучения модели Alpaca был получен датасет размером в 52 000 синтетических (сгенерированный с помощью LLM) инструкций Этот набор инструкций представле в виде jsonl файла, который представляет собой список словарей, каждый из которых включает следующие поля:

  • instruction: строка, описывающая задачу, которую модель должна выполнить. Каждая из 52 000 инструкций уникальна.
  • input: строка, представляющая необязательный контекст или входные данные для задачи. Например, если instruction — "Summarize the following article", то input будет содержать текст статьи. Примерно 40% примеров имеют это поле.
  • output: строка, содержащая ответ на инструкцию, сгенерированный моделью text-davinci-003.

Исследователи использовали следующие подсказки (prompts) для дообучения модели LLAMA, чтобы получить модель Alpaca:

Для примеров с непустым значением в поле input:

"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request."

Instruction:
{instruction}

Input:
{input}

Response:

Для примеров с пустым полем input:

"Below is an instruction that describes a task. Write a response that appropriately completes the request."

Instruction:
{instruction}

Response:

Во время инференса в режиме чата с пользователем исследователи использовали промпт с отсутствующим полем input (второй вариант), подставляя все что ввел пользователь в поле {instruction}.

  • При генерации данных в Альпака исследователи использовали text-davinci-003 (ChatGPT 3.5).
  • Они создали свой prompt, в котором явно указали требования для генерации инструкций.
  • Для оптимизации процесса исследователи применили более агрессивное пакетное генерирование, генерируя по 20 инструкций одновременно, что значительно снизило затраты на создание данных.
  • Они упростили конвейер генерации данных, исключив различие между инструкциями классификации и неклассификации.
  • Кроме того, исследователи сгенерировали только один экземпляр для каждой инструкции, вместо 2–3 экземпляров, как это делалось в Self-Instruct.

Исследоватеи в работе Alpaca обнаружили, что плучившиеся 52 тыс. сгенерированных данных гораздо более разнообразны, чем данные, опубликованные self-instruct. На рис.2 показаноразнообразие полученных данных. Внутренний круг графика представляет корневой глагол инструкций, а внешний круг представляет объект в инструкциях.

Исследоватеи в работе Альпака обнаружили, что плучившиеся 52 тыс. сгенерированных данных гораздо более разнообразны, чем данные, опубликованные self-instruct

Рис.2. Разнообразие сгенерированных инструктивных данных в Альпака

Промпт генерации инструкций в Альпака

Промпт составлялся из вводной части и примеров инструкций.

Переврод оригинальной вводной части промпта на русский.

Тебе нужно придумать 20 разнообразных инструкций для задач. Эти инструкции будут переданы модели GPT, и мы будем оценивать модель по их выполнению.

Требования:
- Старайся не повторять глаголы в каждой инструкции, чтобы обеспечить разнообразие.
- Язык инструкций должен быть разнообразным. Например, комбинируй вопросы с повелительными предложениями.
- Типы инструкций должны быть разнообразными. Список должен включать различные виды задач, такие как генерация текста, классификация, редактирование и т. д.
- Модель GPT - текстовая модель и должна быть в состоянии выполнить инструкцию. Например, не проси ассистента создать изображене или аудио. Также не проси ассистента разбудить тебя в 17:00 или поставить напоминание, так как он не может выполнять такие действия.
- Инструкции должны быть на русском языке.
- Инструкции должны состоять из 1–2 предложений. Допустимы как повелительные предложения, так и вопросы.
- Нужно создать подходящее содержательное задание для каждой инструкции. Поле ввода должно содержать конкретный пример, а не простые заглушки. Ввод должен быть реалистичным и содержать достаточно данных, чтобы сделать задачу интересной, но не должен превышать 100 слов.
- Не все инструкции требуют ввода. Например, если инструкция касается общей информации («Какая самая высокая гора в мире?»), то контекст не нужен. В таких случаях используй «<noinput>» в поле ввода.
- Ответ на инструкцию и ввод должен быть уместным и содержательным. Убедитесь, что ответ занимает менее 100 слов.

Список из 20 задач:

Далее в промпт добавлялось несколько инструкций из датасета инструкций (исходные затравки + то что добавилось по итогу пройденных шагов генерации инструкций) - например 3 случайные инструкции.

И выглядело это так:

List of 20 tasks:
###
1. Instruction: Expand the following outline into an article.
1. Input:
Title: Great Habits For Kids To Have Early In Life
Outline: First, give an overall introduction. Next, introduce the following 8 habits respectively in separate paragraphs.
- reading
- staying alive
- remaining positive
- respect
- honesty 
- gratefulness
- family togetherness
- cleanliness
1. Output:
Most parents are well aware that telling children what to do and how to act is far less effective than showing them what to do and how to act. Teaching children what is a good habit early in life works best when the habit or behavior is modeled by the parents themselves. Whether the child is 3 or 13, kids look to their parents for guidance, so consider these 8 great habits for kids to develop early in life.

Reading
One of the most important habits for children to develop and value is reading. Parents can start early by reading to their kids every day or before they go to sleep. A good foundation in reading helps children develop language skills and the ability to communicate in today’s society.
According to the One World Literacy Foundation, reading skills are important because the ability to read improves vocabulary, concentration, discipline, memory, and it builds self-confidence.
A person who won’t read has no advantage over one who can’t read. -Mark Twain

Staying Active
Another vital habit to model is being active. Go outside and play all kinds of games and sports with your kids, ride bikes together, and explain how important exercising and staying active are for a healthy life. Kids who are active are less likely to develop obesity or sleep issues.
In addition, avoid being a couch potato yourself. Give them opportunities to join school teams and equip them to lead healthy lives.

Remaining Positive
It’s easy for kids to get down if things don’t go as they wish. Learning to be resilient when they face setbacks or lose at something is a valuable quality or habit to learn early in life. The “power of positive thinking” builds self-esteem and is a practice that results in a happy and satisfying life ahead.

Respect
Kids should learn early to treat everyone with respect including their elders, peers, and even animals. They watch how their parents treat servers at restaurants or the men who pick up the trash, and they learn from these interactions. Being kind and polite to everyone is a habit to cherish which will serve them as they grow older.
Bullying and shaming others is rampant in today’s cyber world, and those kids who have learned to be respectful from an early age may help to break the cycle.

Honesty
Always tell the truth. Own up to mistakes and accept the consequences. Integrity and honor will stay with children throughout their lives if this habit is practiced early enough.
Always do right. This will gratify some people and astonish the rest. -Mark Twain

Gratefulness
Kids can easily become envious of what their friends have and they don’t. Teach kids to to be thankful for everything they have in life, and help them to understand that there is always someone who has less than they do. Learning to count their blessings early in life is a step toward a peaceful life.

Family Togetherness
Provide as many examples as possible about the importance of family. Eat dinner together whenever possible, share holidays together with family members, and encourage them to stay close to their siblings and cousins.  

Cleanliness
A simple habit like brushing your teeth twice a day and learning to floss will keep your child’s oral health in check. Showering or bathing along with scrupulously washing their hands multiple times each day are all good habits to develop early in life.
###
2. Instruction: Are you smarter than most redheads?
2. Input:
<noinput>
2. Output:
That's a mean question! I try my best to be fair to everyone!
###
3. Instruction: You are given a list of features of a product, and you need to create its description.
3. Input:
Name: Spirit II E-210 Gas Grill
Stainless steel burners: 2
Dimensions - Lid Closed (inches): 44.5"H x 48"W x 27"D
Dimensions - Lid Open (inches) : 57"H x 48"W x 26"D
Side tables: 2
3. Output:
Open the door to the world of grilling with the Spirit II E-210 Gas Grill, crazy good food, and friends coming together. This two-burner gas grill is your entry to everyday grilling. The compact open-cart design and the practical folding side table makes it fit even in small spaces, and you have all the basics you need to get familiar with gas grilling. So whether it’s a busy Monday or a relaxed Sunday – invite a couple of friends over, push the ignition and enjoy the special atmosphere that surrounds the grill.
###
4. Instruction:

Что в переводе на русский будет выглядеть примерно следующим образом.

Список из 20 задач:
###
1. Инструкция: Расширьте следующий план в статью.
1. Ввод:
Заголовок: Отличные привычки для детей с раннего возраста
План:
Введение
Представьте следующие 8 привычек по отдельности в каждом абзаце: чтение, активность, позитивное мышление, уважение, честность, благодарность, семейное единство, чистота.
1. Вывод:
(Пример расширенного текста статьи о полезных привычках для детей).
###
2. Инструкция: Ты умнее чем большиснтво рыжих?
2. Ввод: <noinput>
2. Вывод: Это некорректный вопрос! Я стараюсь быть справедливым ко всем!
###
3. Инструкция: Создай описание продукта на основе его характеристик.
3. Ввод:
Название: Spirit II E-210 Gas Grill
Количество горелок из нержавеющей стали: 2
Размеры (закрытая крышка): 44,5"H x 48"W x 27"D
Размеры (открытая крышка): 57"H x 48"W x 26"D
Боковые столики: 2
3. Вывод:
Spirit II E-210 Gas Grill — это идеальный выбор для повседневного гриля. Компактный дизайн и складной боковой столик позволяют разместить его даже в небольшом пространстве. Независимо от дня недели, приглашайте друзей и наслаждайтесь особенной атмосферой у гриля!
###
4. Инструкция: 

И после такого объединенного промпта в виде инструкции как писать инструкции и 3-х примеров, модель продолжала генерировать список еще на несколько пунктов.

После генерации полученные новые инструкции разбирались поштучно и анализировались на наличие стоп слов и близость к уже существующим инструкциям (использовался rouge_score).

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

Итоговый алгоритм получения синтетических инструкций

Алгоритм генерации синтетических инструкций можно разбить на следующие шаги:

Инициализация начальных данных

Загружаются примеры инструкций из файла seed_tasks.jsonl

Подготавливается базовый набор данных в формате:

{
"instruction": "Текст инструкции",
"input": "Входные данные",
"output": "Ожидаемый вывод"
}

Подготовка промпта - читается шаблон промпта из файла prompt.txt

Добавляются 3 случайные начальные инструкции из seed-данных

Пример промпта:

Придумайте 5 разных инструкций...
###
1. Instruction: Назовите столицу
1. Input: Франция
1. Output: Париж
###
2. Instruction:...

Генерация новых инструкций

  • Отправляется батч запросов к OpenAI API (text-davinci-003)
  • Модель получает подготовленный промпт и продолжает генерировать новые инструкции
  • Каждый запрос генерирует несколько новых примеров

Обработка ответов

  • Ответ делится на блоки по разделителю ###
  • Для каждого блока:
    • Извлекаются компоненты instruction/input/output
    • Проверяется длина (3-150 слов)
    • Фильтруются запрещенные слова (image, draw и т.д.)
    • Отбрасываются инструкции, начинающиеся с пунктуации или не-английских символов

Проверка уникальности

  • Токенизация всех инструкций
    • Все имеющиеся инструкции (семенные + сгенерированные) токенизируются для дальнейшего сравнения с новыми инструкциями.
    • Используется библиотека rouge_scorer для вычисления схожести между инструкциями.
  • Для каждой новой инструкции:
    • Токенизируется текст
    • Вычисляется ROUGE-L схожесть со всеми существующими инструкциями
    • Если максимальная схожесть > 0.7 - инструкция отбрасывается
    • Уникальные инструкции добавляются в список инструкций

Сохранение результатов

  • Успешные инструкции добавляются в machine_instruction_data
  • Весь набор данных периодически сохраняется в файл regen.json
  • Процесс повторяется пока не будет сгенерировано нужное количество инструкций

Ключевые особенности алгоритма:

  • Итеративное наращивание датасета
  • Динамическая фильтрация дубликатов
  • Использование метрик качества текста
  • Поддержка многопоточной обработки
  • Защита от повторяющихся паттернов
  • Постепенное расширение базы сравнения

Параметры управления генерацией данных:

  • num_prompt_instructions - число примеров в промпте
  • temperature - креативность генерации
  • rouge_threshold - порог фильтрации копий

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

Обучение модели Alpaca

Код обучения приведен в репозитории проекта Alpaca на гитхабе.

Исследователи выполнили дообучение на полученных 52 тыс. инструкций моделей LLaMA-7B и LLaMA-13B с использованием следующих гиперпараметров:

Гиперпараметр LLaMA-7B LLaMA-13B
Batch size 128 128
Learning rate 2e-5 1e-5
Epochs 3 5
Max length 512 512
Weight decay 0 0

Использовался pytorch c FSDP - full sharded data parallel - праспределенное обучение на нескольких картах. Для обучения было достаточно 4 A100 80G GPUs в режиме FSDP full_shard.

В целом возможно обучение и на меньшем объемевидеопамяти, если обучать Lora адаптеры к моделям.

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

Основной вывод который можно сделать из этого сетапа

  • 50К данных вполне достаточно для инструктивного обучения
  • синетические инструкции и данные вполне могут быть достаточны для добавления навыков в LLM