Перейти к основному содержимому

Instruct-форматы

Instruct-форматы определяют, как чистый массив сообщений рендерится в строку промпта, с помощью песочных шаблонов Handlebars, у которых нет доступа к файловой системе или выполнению кода.

Менеджер форматов

Встроенный менеджер форматов владеет instruct-форматами. Форматы — это шаблоны Handlebars, рендерящиеся в изолированном окружении: шаблоны получают только content, role и name, и доступны только документированные хелперы. Шаблоны не получают доступа к Node.js, к файловой системе и не могут выполнять произвольный код.

Формат описывает:

  • шаблоны system, user, assistant и tool;
  • токены BOS и EOS;
  • разделители сообщений;
  • специальные токены.

Встроенные форматы

NeoTavern поставляется с такими форматами:

  • ChatML — блоки ролей <|im_start|> / <|im_end|>.
  • Llama 3<|begin_of_text|> с тегами ролей.
  • Alpaca — блоки инструкции и ответа.
  • Mistral — блоки [INST] / [/INST].
  • Command-R — блоки <|START_OF_TURN_TOKEN|>.
  • Пользовательские форматы — шаблоны, определённые пользователем, выбираемые как активный формат.

Чистый массив сообщений до рендера

До этапа рендера конвейер работает исключительно со структурированным массивом сообщений с ролями (system, user, assistant, tool). Макросы разрешаются, лорбук и память вставляются, контекст-шифтинг убирает лишнее, а перехватчики плагинов изменяют этот массив. Рендер происходит ровно один раз, на этапе рендера, поэтому ни один адаптер не форматирует промпт второй раз.

Итоговый вывод

Этап рендера создаёт одну из двух форм:

  • Строку — отрендеренный промпт, отправляемый текстовым провайдерам и используемый для диагностики.
  • Структурированный JSON — массив GenerationMessage[], отправляемый чат-провайдерам, которые принимают сообщения с тегами ролей.

Режим выбирается через serializeAsText: текстовые адаптеры (text-completion, novelai, ai-horde, koboldai) всегда получают отрендеренный instruct-промпт как одно сообщение user; чат-адаптеры (openai-compatible, anthropic) получают структурированный массив.

Макросы

{{user}}, {{char}} и пользовательские переменные разрешаются до финального рендера. Макросы никогда не раскрываются внутри самого шаблонного движка, поэтому файлы шаблонов остаются чистым markup.

Пользовательские форматы и пресеты

Активный пользовательский формат хранится в AppSettings.instructFormat. Когда он задан, чистый массив сообщений рендерится в одну строку, а строки остановки формата становятся стоп-последовательностями запроса. Когда он равен null, используется нативная структурированная сериализация.

Форматы импортируются и экспортируются как версионируемые JSON-пресеты:

  • importInstructFormat() проверяет пресет до того, как он станет активным;
  • exportInstructFormat() создаёт JSON-безопасные разделённые значения;
  • пресеты несут версию, поэтому старые экспорты можно мигрировать при импорте.

См. также