Форматирование Gemma и системные инструкции

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

Модели, настроенные на инструкции (IT), обучаются с помощью специального средства форматирования , которое аннотирует все примеры настройки инструкций дополнительной информацией как во время обучения, так и во время вывода. Форматер имеет две цели:

  1. Указание ролей в разговоре, например роли системы , пользователя или помощника .
  2. Обозначение поворотов в разговоре, особенно в многооборотном разговоре.

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

  • Токен для обозначения очереди пользователя: user
  • Жетон для обозначения поворота модели: model
  • Токен, обозначающий начало хода диалога: <start_of_turn>
  • Токен, обозначающий окончание хода диалога: <end_of_turn>

Вот пример диалога:

<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
Gemma<end_of_turn>
<start_of_turn>model
Gemma who?<end_of_turn>

Токен "<end_of_turn>\n" является разделителем поворотов, а префикс приглашения — "<start_of_turn>model\n" . Это означает, что если вы хотите задать модели вопрос типа «Что такое правило Крамера?», вам следует вместо этого передать модели следующее:

"<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model"

Обратите внимание: если вы хотите точно настроить базовые предварительно обученные модели Gemma с использованием собственных данных, вы можете использовать любую такую ​​схему для управляющих токенов, если она согласуется между вашими вариантами использования обучения и вывода.

Системные инструкции

Как для контролируемой точной настройки (SFT), так и для обучения с подкреплением на основе обратной связи с человеком (RLHF) модели не обучались с помощью системных инструкций. В результате единственными соответствующими токенами форматирования для Gemma являются <start_of_turn> , <end_of_turn> , user и model . Например:

<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model
Cramer's Rule is ...<end_of_turn>

Форматирование задач FIM

Варианты CodeGemma 2B и 7B специально настроены для задач заполнения кода.

В частности, они обучены четырем токенам управления форматированием, которые можно использовать для создания подсказок модели для задач кодирования с заполнением посередине (FIM).

Контекст Токен
Префикс FIM <|fim_prefix|>
Суффикс FIM <|fim_suffix|>
ФИМ средний <|fim_middle|>
Разделитель файлов <|file_separator|>

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

Пример. Создание приглашения FIM

В этом разделе повторно используется пример из краткого руководства по Keras CodeGemma, чтобы показать, как создать приглашение для задач FIM.

Рассмотрим следующий код:

import |⏎ # Line 1
if __name__ == '__main__':⏎ # Line 2
   sys.exit(0) # Line 3

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

Префикс тогда,

import

с одним пробелом в конце.

Суффикс:

⏎
if __name__ == '__main__':⏎
   sys.exit(0)

с новой строкой в ​​начале.

Подсказка должна быть построена как:

<|fim_prefix|>import <|fim_suffix|>⏎
if __name == '__main__':⏎
   sys.exit(0)<|fim_middle|>

Обратите внимание, что:

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

Понимание выходных данных модели

Ответ модели для приведенного выше примера будет следующим:

<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n    sys.exit(0)<|fim_middle|>sys\n<|file_separator|>

Модель повторяет приглашение ввода и предоставляет sys в качестве завершения кода.

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