Содержание статьи
- LLM: что на входе?
- Софт: бэкенд и фронтенд
- Бэкенд: KoboldCpp
- KoboldCpp: загрузка модели и настройки
- Выбор модели
- Что с русским?
- Фронтенд: SillyTavern
- Установка
- Подключаемся к бэкенду: LM Studio
- Подключаемся к бэкенду: KoboldCpp
- Шаблоны Instruct и Context
- Prompt Inspector
- Начинаем игру: карточка персонажа
- Как работают константы и периодические напоминания
- Заключение
Писать очередное руководство в стиле «запусти программу, положи сюда десятку и наслаждайся бесплатным дипсиком» скучно и неинтересно; таких руководств в сети более чем хватает. Нам же интересно забраться под капот игрового механизма, посмотреть, как формируются запросы и как получаются ответы от LLM, как можно повлиять на то, какие именно токены будет генерировать модель, и как отучить ее от клише.
Но чтобы залезть под капот, софт нужно сначала найти, потом — установить, запустить и настроить. И уже на этом этапе возникают некоторые сложности.
Начнем по порядку — с того, что поступает на вход LLM, и с объяснения, почему, собственно, для ролевых игр нужен специализированный софт и первый попавшийся чат‑бот не подойдет.
LLM: что на входе?
С момента появления первых локальных LLM прошло уже больше двух лет, за которые сменилось несколько поколений моделей, но архитектура в целом осталась прежней. Несмотря на это, у многих пользователей до сих пор нет четкого понимания, как это работает и, в частности, что и в каком виде подается на вход языковой модели. На самом же деле по крайней мере с локальными моделями все просто.
Что на входе: «простыня текста», wall of text. Каждый раз, когда ты отправляешь модели новое сообщение, фронтенд формирует особым образом оформленный текст, в который входят как системные сообщения, так и все предыдущие запросы пользователя и ответы модели. Выглядеть это может примерно так:
|system|You are a helpful assistant
|user|Hello!
|assistant|Hello. May I help you?
|user|sends a message
|assistant|replies
Длина «простыни» ограничена окном контекста (обычно в пределах от 8 до 32 тысяч токенов), и, когда история переписки переваливает за разрешенный, фронтенд (не сама модель!) «подрезает» ее, чтобы уместить в указанные рамки.
Что именно «подрезается», а что — остается? Это контролируется настройками фронтенда.

То есть стратегия по умолчанию — оставить системное сообщение (возможно — и начало чата, зависит исключительно от настроек фронтенда) и вырезать кусок из середины, не трогая последние сообщения.
|system|You are a helpful assistant
|user|Hello!
|assistant|Hello. May I help you?
…
>> truncated <<
…
|user|sends a message
|assistant|replies
|user|sends a message
|assistant|replies
Такой способ работы с контекстом учитывает, что внимание модели распределяется в рамках контекста неравномерно. Наивысший приоритет модель отдает самым свежим сообщениям, затем — системному сообщению и лишь в последнюю очередь — сообщениям из середины чата. То есть модель не то чтобы «забывает» — скорее «игнорирует» сообщения из середины чата; как правило, она «вспомнит» эту информацию, если пользователь явно упомянет ее в своем запросе, но проигнорирует, если не запрашивать.
Отмечу, что это — эмпирические наблюдения; такое распределение внимания не «зашито» в архитектуру моделей, просто... просто так получилось. И у современных моделей по сравнению с моделями годичной давности внимание может распределяться более равномерно просто потому, что они формально поддерживают всё более широкие окна контекстов — часто сотни тысяч токенов. Это приводит к тому, что модели всё лучше и лучше работают в реалистичных сценариях с чатами, не превышающими 32 тысячи токенов.
Тем не менее в сценарии ролевых игр с локальными (читай — небольшими) моделями такой подход к работе с контекстом неудачен. Допустим, ты добавил описание персонажа (особенности поведения и речи) в первом сообщении. Спустя какое‑то количество реплик (в зависимости от доступной длины контекста и объема текста в карточке персонажа) модель постепенно обращает все меньше внимания на описание персонажа и все больше — на последние сообщения.
В результате довольно быстро персонаж, даже если был необычным, усредняется и подгоняется под один из архетипов, известных модели. Скоро общение будет продолжаться с усредненным аватаром модели, а не с тем персонажем, с которого все начиналось. И это при условии, что описание персонажа вообще не улетит за пределы контекста и не будет обрезано фронтендом.
Разумеется, ты можешь поместить описание в системное сообщение. Это придаст некоторый вес описанию и не позволит модели легко забыть его основные черты — но на практике этого оказывается недостаточно; модели нужно время от времени напоминать, с чем она имеет дело. А напомнить проще всего вставкой системного сообщения в конец чата — туда, где сконцентрировано внимание модели. Такой возможности нет в LM Studio, но она встречается в других продуктах — например, в веб‑интерфейсе KoboldAI Lite или в специализированном фронтенде SillyTavern. О нем сегодня и пойдет речь.
Софт: бэкенд и фронтенд
В прошлой моей статье на эту тему («Локальные языковые модели. Генерируем текст на своем компьютере») я рассказал, какие бывают программы для запуска LLM, и подробно описал одну из самых простых в использовании — LM Studio. Однако для ролевых игр LM Studio недостаточно; ее все еще можно использовать в качестве бэкенда (хотя и не стоит, но об этом чуть ниже), однако фронтенд тебе точно нужен другой. Почему так?
Дело в том, что у ролевых игр есть несколько специфических требований. Здесь и «карточки» персонажей, и описание мира (World Info), которое можно «прицепить» к чату, и триггеры сюжетных событий по ключевым словам, и примеры того, как разговаривает персонаж, и такая важная вещь, как сжатое описание ключевых характеристик персонажа, которая будет регулярно использоваться в качестве своеобразного якоря, постоянно напоминающего модели, как именно она должна отвечать (в противном случае с ростом контекста чат неизбежно «уплывет» в дальние веси). Ничего из этого в LM Studio нет.
К бэкенду тоже есть пожелания — а именно поддержка современных семплеров и возможность банить определенные слова и фразы, по мере возможности «очищая» вывод модели от навязчивых клише и словесных кружев. И этого в LM Studio тоже нет.
В результате применение LM Studio сводится к скачиванию модели (их можно использовать с любым бэкендом) и получению опыта, который поможет разобраться с более сложными продуктами.
Бэкенд: KoboldCpp
Если у тебя на компьютере уже установлена и настроена LM Studio, ты можешь пока пропустить этот раздел. LM Studio вполне способна работать в качестве бэкенда; для этого нужно зайти в настройки и активировать сервер.

Можно дополнительно настроить порт; все нужные ссылки для настройки фронтенда перечислены в окне терминала в нижней части экрана.
Кроме того, в App Settings — Developer включи опцию Enable model load configuration support in presets.

Для ролевых игр нет какого‑то единого приложения; приходится использовать отдельно движок — бэкенд — и веб‑интерфейс к нему, тоже отдельно.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
