Пердолинг рандома для твоих РП
Если ты играешь лютый-бешеный кумслоп или быстрые кино ролеплеи, можешь дальше не читать. В первом случае тебя волнует только дрочка и похуй что она однообразна. Нет, измы не фиксятся рандомизацией. Во втором у тебя достаточно фантазии и идей чтобы развлекать самого себя, молодец, круто же! Всё что ниже работает в основном для адвенчур и симуляторов, чтобы разнообразить ход РП. Не жди чудес.
Щегол, не копируй бездумно промпты!
Это лишь примеры, думай своей головой. Рандомизация обычно требует подгонки под логику происходящего в твоём РП и твой личный вкус.
Нейронки не умеют в рандом
Скажи сетке назвать рандомное имя и свайпни ответ сотню раз. В теории на температуре 0 она будет выдавать одно и то же, а на темпе 1 будет разнообразить, верно? Но на практике ты увидишь что она называет одни и те же два-три, ну скажем пять имен, а другие почти никогда, вне зависимости от темпы. Хотя имён она знает тысячи, даже несуществующих может придумать сколько угодно, но выводит всё равно почти только эти. Ясен пень что какие-то имена в датасете более популярны, но даже близко не настолько чтобы повторять всего пару из них.
Это следствие проёба под названием модальный коллапс, не путать с коллапсом модели (mode vs model collapse). Кроме простейшего примера выше, он в целом снижает разнообразие того что пишет модель. Приличная доля всех хуёвых вещей в РП это его заслуга. Похожие свайпы, предсказуемые роуты, типажи и имена, одни и те же грамматические конструкции, назойливые выражения и стереотипы.
Кстати тру-базовые модели вполне себе умеют в рандом, только прошедшие через некоторые виды RL, SFT и т.п. не умеют. Короче это не фундаментальное ограничение, и авторы могут его починить, хоть это и сложно. Но это слишком долгий разговор, достаточно знать что все готовые модели начиная с GPT-3 в какой-то мере этим страдают.
Не буду вдаваться в глубокий машобуч, лучше усвой несколько вещей.
- Если контекст остаётся неизменным, свайпы будут примерно одинаковые. Может немного другими словами, может чуть разниться, но не сильно. Один и тот же контекст на входе = плюс-минус один и тот же ответ на выходе.
- Сетка работает на уровне идей, а не токенов. Попытки пропердолить это сэмплерами (температура, топ-п, н-сигма, антислоп и прочие неведомые ёбаные хуйни) всегда будут однобокими. Также поэтому хоть и логически кажется что в более длинных ответах будет потихоньку накапливаться больше рандома чем в коротких, на практике эффект от этого минимален, если есть вообще. Сетка может думать 5000 токенов, предложить в думалке миллион вариантов, но снова сгенерить всё ту же Элару или Велору. Всё потому что у неё заранее есть общий концепт ответа, хоть и смутный.
- Чем меньше свежих идей ты даёшь сетке, тем более стереотипные получаются аутпуты. Это не обязательно плохо кстати, но ты уже выучил все стереотипы сетки на своих однаковых РП, иначе бы ты это не читал. Единственный источник оригинальности у сетки - это ты сам.
- Модальный коллапс не лечится промптингом. Забудь про это. Любые попытки сочинить волшебный промпт (не повторяйся! сгенерируй рандомное число!) или длинную цепочку тхинкинга которая будет разнообразить ответы, заведомо обречена на провал. Это всё равно что изобретать вечный двигатель, не зная закона сохранения энергии. Можно заставить сетку писать иначе, но это "иначе" снова будет плюс-минус одинаковым на каждый свайп на том же контексте. Коллапс любого типа (а их много) могут предотвратить только сами авторы моделей, но это не тривиальная задача, да и в случае с разнообразием они не сильно-то чешутся. Можешь быть уверенным что в ближайшее время его не починят ни в одной модели.
От этого например страдают карточки-симуляторы и адвенчуры, генерирующие НПС на лету: оригинальных вводных очень мало, поэтому НПС и локации которые тебе встречаются будут максимально шаблонными, если ты не будешь накидывать дополнительных вводных каким-то образом.
Также страдает CYOA, где сетка генерит фиксированные варианты, которые ты выбираешь. Количество оригинальной информации которую ты ей сообщаешь при этом, минимально. Страдает директор РП, где сетка пишет рассказ про персонажей, а ты вместо того чтобы играть роль лишь раздаёшь указания, потому что значимого инпута при этом обычно меньше.
По этой же причине создавать карточки генерацией из коротких промптов (да и вообще генерацией) - довольно тупая затея, оригинальности ты не получишь.
Что из этого вообще реально побороть костылями?
У тебя ровно две возможности заставить нейронку писать иначе: либо изменять входной промпт каким-то образом, либо дёргать сэмплеры. Отсюда следует всё остальное.
Одинаковые свайпы фиксятся сравнительно просто. Используй внешний рандом, например засунув команды на варианты ответа в таверновский макрос {{random::пиши так::пиши сяк}}. Каждый раз когда ты делаешь свайп или запрашиваешь новый ответ, таверна будет выбирать новый вариант, либо так либо сяк. Типичные способы это делать расписаны ниже.
Устойчивые слова (-измы) нихуя не фиксятся нормально. Ты можешь их переписать, ты можешь их видоизменить, но в результате получишь тоже измы, просто другие. Что уже само по себе неплохо, но рано или поздно они тебя заебут тоже.
Их можно немного побороть сэмплерами. Но нормальные сэмплеры доступны только если запускать модель локально, и ты неизбежно заплатишь за них отуплением и без того уже туповатой квантованной локалки, в силу самого принципа (ты изменяешь наиболее вероятные кандидаты). Модель выучила соответствие одних идей другим, а сэмплеры работают с токенами а не идеями, поэтому против стереотипов сетки это всё малополезно. Модель просто будет писать синонимами примерно то же самое, и будет у тебя не воздух зависший в воздухе, а атмосфера тилибонькающаяся в атмосфере.
Устойчивые стереотипы и грамматические конструкции МОЖНО скорректировать обычным промптингом без рандома, хотя сложно и нужно пердолиться. Модальный коллапс для этого фиксить не надо (а ты и не сможешь). Как и в случае с измами, ты просто получаешь другие устойчивые стереотипы, но они хотя бы тебе будут нравиться.
Генерацию не прописанных персонажей разнообразить в теории можно, на практике это ебейший гемор. Потому что персы и локации требуют большого количества оригинальных вводных, чтобы не получился шаблонный типаж, и эти вводные контекстно-зависимы. Если не нравится стереотипность сгенеренных сеткой чаров, дописывай их ручками. Конечно это относится только к тех кого ты хочешь превратить в постоянные.
Неплохо помогает вести суммарайз и трекать разные факты про РП в нём. Это добавляет вводных в сжатом виде.
Способы рандомизации
Рандомизация промпта работает в основном для разнообразия курса РП. Она НЕ изменит измы и стереотипы сетки. Чтобы рандомить промпт, есть несколько приёмов, которые можно комбинировать друг с другом в одном промпте по вкусу и получить что-то путное.
- Ручной рандом
- Балансировка вариантов
- Рандомные слова
- Селекция и упорядочивание
- Генерация вариантов сеткой
- Лорбук-рандомизатор
- Классификация
Ручной рандом
Самый простейший тип внешнего рандома, в котором ты пишешь варианты вручную под свои конкретные задачи. Например некоторые делают вот так в конце юзер инпута:
Подобная схема популярна для борьбы с форматлупами, и работает СУПЕР ХУЁВО, потому что если прокнет 150 слов, сетка напишет 150 слов даже если в данной ситуации много писать не нужно, лишь бы забить запрошенную длину. Если прокнет 50, она запихнёт в 50, даже если ситуация требует 150. Сетку лучше промптить содержимым ответа (про что именно писать), чем конкретной длиной.
Подобный промпт можно использовать для рандомизации курса событий, например.
Сетка обычно интерпретирует такой бросок кубика как команду подстроиться под него, и в ответе будет либо вин, либо фейл твоих действий в соответствии с броском.
Всё это можно автоматизировать, создав в промпт-менеджере новый промпт от роли юзера, который будет инжектиться на глубину 0:

Получится как будто бы ты отдаёшь каждый раз случайную команду. Не обязательно инжектить это на глубину 0 или использовать, можешь куда угодно поместить команду, в зависимости от логики работы твоего пресета. Думай сам.
Таких креативных промптов можно придумать кучу, их и была придумана куча. Например вот этот безумный MLPшный рандом на 1200 (!) и 2500 (!!) вариантов, учитесь щеглы.
Подводные такого способа очевидны: промпт либо слишком дженерик, либо слишком ситуативен, варианты нужно крафтить вручную и он никак не учитывает контекста ролеплея, он всегда один и тот же. Допустим у тебя идёт сцена ебли, а он тебе указывает заспавнить НПС.
Балансировка вариантов
Что если ты хочешь сделать какой-то вариант более вероятным? У таверновского {{random}} нет балансировки по процентам вероятностей. В этом случае можно применить костыль:
Сейчас {{random:ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ничего не произойдёт,ты споткнёшься и сдохнешь}}.
В 90% случаев "ничего не произойдёт", в 10% случаев ты "споткнёшься и сдохнешь".
Рандомные слова
Чтобы не генерить варианты самому, можно тупо взять рандомные английские или русские слова. Для русских слов я когда-то составлял длинные списки, продублирую здесь.
5000 глаголов и 5000 существительных русского языка, самые популярные и общеупотребительные по версии НКРЯ.
В {{random}} они уже обёрнуты, можешь вставлять хоть по 20 раз. Тормозить будет лишь при редактировании строчки с этим полотном, при юзании или редактировании других строчек тормозить не должно.
Существительные:
Глаголы:
Как использовать эту херабору? Простейший пример:
Вот тебе случайное слово: {{random::...5000 вариантов...}}. Используй его для вдохновения при выборе продолжения РП, но не повторяй его.
Подобный список можно составить и для английского, но на удивление все вордлисты либо не очень качественные (нужны частоты + части речи), либо платные, либо я дебил и смотрел не там. Если сделаешь такой, запости.
К таверне было написано сразу несколько расширений, которые используют внешние API из интернета для вывода случайных английских слов. Вот два из них:
- https://gitgud.io/Monblant/randomwords - от скриптовичка. Дефолтный API там дохлый, можешь вписать туда например это: https://random-word-api.herokuapp.com/word . Использует свой собственный макрос
{{RandomWords}}, который по умолчанию выдаёт 20 рандомных слов. - https://github.com/Coneja-Chibi/Rabbit-Response-Team - альтернатива от чувака среддита.
Подводные у рандомных слов точно такие же: они слишком контекстно-независимы. Ты ебёшь чара, у тебя наролливается "собака", и вот у тебя за окном залаяла собака. Это кстати частично и от твоих навыков промптинга зависит - насколько ты сможешь остановить нейронку от прямого упоминания этих слов и заставить органично вписать их в ролеплей. Но как ни пердолься, всё равно получается слишком хаотично.
Вторая проблема в том что сетка склонна слишком буквально приплетать это слово в ответе. Это уже лечится промптингом.
Селекция и упорядочивание
Главная проблема схем выше в том что рандом слишком ТУПОЙ. Он не знает что у тебя за сцена сейчас идёт. Он будет честно генерить рандомные варианты независимо ни от чего, даже пусть и невпопад. В РП это неудобно и слишком хаотично. Зато сетка ВУМНАЯ как вутка, она понимает смысл написанного.
Поэтому была придумана селекция вариантов самой сеткой: вместо одного варианта генеришь сразу кучу, и заставляешь сетку выбрать один или пару наиболее подходящих к текущей ситуации.
То есть из кучи вариантов сетка фильтрует только те что имеют наибольший смысл. Это самый простейший способ использовать рандомные слова для рандомизации курса РП.
Лучше всего это работает если у тебя есть кастомный план для тхинкинга, прописанный шаблоном. Например суёшь где-нибудь в контексте список рандомных слов внутрь XML тега <random>, а потом в шаблоне своей думалки делаешь что-нибудь типа:
Точно так же можно это реализовать на внешних блоках, заставив допсетку выбирать слова и конструировать идею ответа.
Главная проблема селекции - сетка ограничена в разнообразии и будет предлагать наиболее унылые и предсказуемые варианты. Поэтому тебе придётся самому нащупать баланс между хаотичностью и предсказуемостью, который нравится тебе.
Хочешь больше рандома? Либо уменьши количество вариантов в списке, либо сделай варианты менее дженерик и более специфичными. Тогда вероятность что сетка найдёт в них унылые, уменьшится, но шанс того что они не будут попадать в такт ролеплея, будет больше.
У тебя больше одного рандома? Увеличивай количество вариантов, чтобы вероятней попался тот, комбинация в котором имеет смысл.
Выбирать можно не только из рандомвордсов, и не только этим методом! Креативных способов комбинировать тупой рандом и умную сетку овердохуя, экспериментируй с промптами, пробуй что подходит лично тебе.
Генерация вариантов сеткой
Можно заставить сетку самостоятельно генерить себе варианты рандома, но правильно сделать это можно только за два вызова нейронки.
Вот простейший пример автоматической рандомизации курса РП. Для него тебе понадобится последняя staging ветка таверны, потому что вложенные макросы там ввели лишь недавно.
Сетке сунь куда-нибудь команду: В конце ответа напиши 5 убедительных вариантов продолжения РП, непохожих один на другой, вот в таком формате: {вариант1,вариант2, ...}
Затем добавь регэкс который будет подменять эту строку на {{setvar::continuation::{{random::вариант1::вариант2::...}}}}:
- Найти
/(?<!\{)\{([^{}]+)\}(?!\})/g - Заменить на
{{setvar::continuation::{{random::$1}}}} - Проставить галочки как на скрине ниже.

Что получится в результате? Модель напишет ответ и список вариантов продолжения:
Регэкс поймает эти скобочки и подменит это на макрос таверны: {{setvar::continuation::{{random::чар разденется:: чар навесит клетку на писю юзеру:: из шкафа донесётся "хух... хух..."}}}}
Макрос сразу же выполнится таверной (Run On Edit), ты не успеешь это увидеть (если у тебя есть стриминг то придётся усложнить регэкс), оно сразу же пропадёт из сообщения и ты получишь себе переменную continuation, содержащую случайно выбранный вариант из тех что предложила сетка. Эту переменную можно использовать как хочешь через макрос getvar, например в шаблоне думалки можно написать что-нибудь типа
Теперь главный нюанс: схема выше работает ХУЁВО. Потому что генерация происходит в конце предыдущего сообщения, когда ты ещё не написал свой инпут! Что если ты пустишь РП по какому-то другому пути? Скорее всего так и будет.
Поэтому генерацию и случайный выбор надо делать после инпута юзера. Сделать это в одном вызове нейронки физически невозможно, если у тебя не локалка с движком, позволяющим паузить генерацию пока таверна рандомит вариант. Два единственных варианта сделать это по-человечески:
- тул юз перед ответом (вызывается бросок рандома с написанными вариантами)
- внешние блоки (перед ответом вызывается допсетка, которая генерит варианты и таверна роллит один из них честным рандомом)
И в том и в другом случае потребуется два вызова нейронки, это главное ограничение данного метода.
Но есть ещё и подводный камень. Сетка-то будет генерить максимально скучные и предсказуемые роуты. Рандом может и честный, но выбирать он будет из того что предложит сетка. Поэтому данный способ можно и нужно комбинировать с остальными.
Лорбук-рандомизатор
Лорбук в таверне очень универсальный инструмент, и в том числе может быть использован как продвинутая замена {{random}} или в комбинации с ним.
Например вот как сделать механизм рандомных событий а-ля фоллаут. Создаёшь пустой лорбук и привязываешь его к карточке. В лорбуке делаешь запись с таким содержимым:
Ставишь ей настройки:
- Primary Keywords = регэкс
/.*/(т.е. всегда находится в контексте) - Strategy = at Depth (User)
- Depth = 0
- Trigger % = 15%
Остальные менять не обязательно.

Теперь с вероятностью 15%, а это в среднем каждый 6-7 ход, у тебя будет инжектиться на глубину 0 (после твоего инпута) OOC-команда, создающая рандомное событие разного характера - встречу, находку, локацию и т.п.
Если ты почитаешь как в таверновском лорбуке работают инклужен группы, ты также поймёшь что можно делать например случайный выбор из взаимоисключающих записей в лорбуке.
Естественно ты можешь комбинировать это всё с механиками выше, и какими-то своими более интересными промптами. Тот что я привёл довольно-таки дженерик, и только для событий и годится.
У данной механики есть тот же самый нюанс как и у простого рандома - рандом слишком ТУПОЙ и будет рандомить в любой ситуации, даже неподходящей. Чтобы такого не было, на помощь придёт...
Классификация
Допустим у тебя идёт какой-нибудь адвенчер ролеплей. Делаешь в лорбуке приблизительно вот такую запись:
Настройки те же что и выше, кроме вероятности:
- триггер на регэкс
/.*/(т.е. всегда находится в контексте) - Strategy = at Depth (User), т.е. инжект за юзера на глубину 0
- Depth = 0

Теперь у тебя в конце каждого ответа сетка будет определять тип сцены в невидимом (hidden) теге div, например:
Scene type: FightScene type: Exploration
Теперь на эту строчку ты можешь навесить любой инжект, который будет работать ТОЛЬКО в определённой ситуации. Например:
- Путешествуешь? Добавить рандомную встречу с вероятностью такой-то.
- Ебёшь гоблиншу-оруженосца? Тип сцены "ебля", нихуя не делать, пусть не мешает.
- Дерёшься с бандитами? Добавить автогенерацию продолжения и рандомно выбрать вариант.
И т.д. Так образом можно точно настраивать интенсивность рандома по вкусу, и в каких ситуациях он будет что именно делать.
Попробуй например комбинировать классификатор с промптом на рандомные события. Всё что нужно сделать в примере с рандомными событиями - заменить триггер /.*/ на /Scene type: [Tt]raveling/g, и ограничить глубину сканирования до 2, чтобы он захватывал только последнее сообщение. Теперь рандомная всячина будет происходить только когда ты путешествуешь.
Если у тебя есть инфоблок, ты можешь сделать классификатор сцены буквально дополнительной строчкой в нём, потому что инфоблок это очень похожая, но более универсальная механика.
Классифицировать можно не только тип сцены, а всё что угодно, проверять любое условие и дёргать соответствующие записи лорбука. Текущая локация? Такая-то. Время суток? День/ночь, в зависимости от этого тени выходят на охоту. Достаточно бабла? Да/нет. Статус персонажа? Здоров/ранен/убит/оборотень/зомбирован/похищен. Количество спермы в желудке? Столько-то. И т.д. и т.п. Классификатор, как и инфоблок, можно переложить на допсетку через внешние блоки.
Один важный нюанс: поскольку трекер/инфоблок остаются в прошлом сообщении, у тебя всегда будет задержка в 1 ход. Т.е. ты начал путешествовать, сцена классифицировалась как Traveling, и событие сможет добавиться только в следующем сообщении. Это ограничение никак не обойти в одном вызове нейронки, нужно делать два. Конкретно для рандомных событий это обычно не проблема, сюжет адвенчер-ролеплея как правило вполне к этому терпим.
Если задержка тебя абсолютно не устраивает, можешь либо юзать два вызова (опять же внешними блоками), либо комбинировать это всё с селекцией рандома как показано выше (пусть селекция определяет, уместно ли сейчас это событие или будет мешать ходу РП).
Кэширование и пейпиггинг
Если ты платишь за токены, ты наверняка используешь кэширование. В большинстве сеток кроме клода оно автоматическое, если провайдер его поддерживает. Кэшируется верхняя неизменная часть промпта, а любой {{random}} или {{getvar}} будет меняться от вызова к вызову, поэтому всё что ниже будет сгорать и заполняться заново.
Поэтому с кэшированием тебе придётся все изменяющие контекст макросы, тот же {{random}}, перенести куда-нибудь в самый низ промпта, возможно под хистори.
Вопросы, поправки можешь писать на cosmographist@proton.me