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

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-безопасные разделённые значения;
  • пресеты несут версию, поэтому старые экспорты можно мигрировать при импорте.

См. также​