SIlly Tavern Chat Completion Preset [Очередной лонг]
Или попытка совладать с безумием LLM.
Text completion vs Chat completion
Наглядную разницу я уже показывал и пытался объяснить, но, думаю, стоит повторить:
- Chat completion "ест" больше токенов
- Может не поддердживаться малыми LLM
- Меньше настроек связанных с температурой.
- Работает не просто "выплевывая" текст в модель, а добавляет инструкции, тем самым указывая модели, что это пропустить нельзя(но LLM иногда плевать на это)
- Современные модели "затачиваются" под работу с Chat Completion
Основы
Все, что мы настраивали в Text Completion - теперь находится только в preset-меню Silly Tavern. Для упрощения, я буду называть его "левым" меню, а меню "AI response format" - "верхним" меню.
Итак, если мы выбираем Chat Completion - "верхнее" меню выходит из чата. Абсолютно не важно, что будет выбрано в нем, вся наша настройка происходит через собственную систему форматирования, которую вы настраиваете сами, по определенному шаблону.
Важно! Если вы используете модель с обоснованием(Reasoning), не забывайте поставить галочку Request model reasoning!
Разбор на примере
Изначально, чтобы разобраться во всем этом, я брал пресет CherryBox'a для R1 и докручивал его до того, что хочу сам. Сейчас пользуюсь R1T2(Химера), и в целом, мой пресет работает.
Порядок следующий
- Role - определяет роль модели. Как правило, сюда вписывается что-то вроде: "You are a Roleplay Master...". Без этого блока ИИ (если он не обучен специально на RP) будет «теряться», пробовать разные варианты поведения и постоянно сбиваться с нужной задачи
- Story Context - включает всё, что определяется «внешними» модулями: персона ({{user}}), карта персонажа ({{char}}), история мира и т. д. Учтите, LLM не понимает, кто такой {{user}}, а кто такой {{char}}. На их место Таверна подставляет соответствующие имена.
- Guidlines - мои предпочтения: как я хочу, чтобы развивалась история, каким образом LLM должна форматировать ответ, его длину и прочие нюансы.
- Start - команда к началу RP
- Reminder - указания для модели о том, как формировать ответы
Accent handler и оставшиеся блоки «вводятся» в модель в определённые места промпта, вне зависимости от их расположения в «левом» меню.
- Accent Handler - я не самый большой знаток английского, поэтому часто пишу модели на русском (возможно, зря). Нередко модель воспринимает это как фразу вроде «он сказал на непонятном языке». Чтобы это исправить, я придумал блок, который объясняет модели, что я говорю по-английски, но с акцентом. Кроме того, Deepseek любит отвечать на русском, если с ним заговорить на русском. Поэтому внутри этой инструкции я добавил пункт, что модель не должна переходить на русский. Это не всегда помогает, но в целом работает. (в последнее время заставляет модель говорить за {{user}}. Либо до этого мне очень везло. Выключаем, крч)
- Reasoning - этот блок отвечает за форматирование рассуждений. Мы же используем R-модель, верно? Пусть её «размышления» работают на нас максимально эффективно.
- Timeblock - это красивое отображение времени в ответе, которое помогает модели ориентироваться в контексте. Оно реально спасает от абсурдных конструкций вроде: «Вы только проснулись. На часах шесть утра. За окном красный закат»
- Infoblock - это конструкция, добавляемая в конец сообщения, которая должна помогать LLM лучше «понимать» окружающий контекст. Но честно говоря, блок получился громоздким, поэтому я им редко пользуюсь.
Что важно знать?
Все инструкции разделены XML-тегами (<tag>...</tag>), чтобы их логически структурировать. Эти блоки также делятся на более мелкие элементы, которые LLM воспринимает по отдельности. Я видел разные подходы к форматированию, но во многих источниках именно XML-теги считаются наиболее эффективными.
Как видите, в нашем пресете мы выстраиваем структуру обращения к модели самостоятельно. Но порядок этих блоков не случаен — он должен придерживаться золотого правила:
- Роль ИИ
- Информация о мире (Story context)
- История чата
- Информация о том, как LLM должна ответить
Особенности моделей
Каждая модель имеет свои «привычки». Например, Deepseek часто перегружает ответы лишними токенами::
"Ее телефон зазвонил, она не обратила на него внимание"
"Ее телефон зазвонил снова. На экране было 19732864 пропущенных"
Наша задача — убирать такие моменты с помощью правильно настроенных пресетов. Подобных нюансов у каждой модели хватает, и они становятся очевидны только после длительных RP-сессий с одной LLM.
Кому-то нравится «кровь и содомия», кто-то хочет, чтобы персонаж буквально «вел за руку» через каждое сообщение, а кто-то предпочитает, чтобы модель предлагала варианты ответа. Все эти вещи настраиваются индивидуально.
Один пресет на все модели?
Если вы делаете пресет, например, для Deepseek R1, он может подойти и для производных (V3, R1T2). Но важно помнить, что он может работать некорректно. В случае с моим пресетом, если вы захотите протестировать его на V3, удалите всё, что связано с Reasoning.
Итог
Chat Completion — это более тонкая настройка всех аспектов модели. Я не буду кричать, что за ним «будущее», но стоит учитывать, что это более серьёзный и правильный подход.
P.s. мой пресет будет лежать тут. Если что-то будет работать не правильно, я мог скинуть не тот, потому что я в них запутался.
P.S.S. Хочу передать привет Kimi K2 и Openrouter, которые не могут в стабильность.