Если ты задаёшься вопросом куда ливнули большинство протыков оранжевого аицг, сюда

Памятка для маленьких платнопоросяток

Если ты пейпиг и платишь потокенно, то знай что существует способ ебашить слоубёрны хоть по миллиону сообщений, при этом не вылезая за 20-40к контекста, и сетка всё будет помнить и не тупеть от твоих 700к контекста. При этом за счёт того что ты будешь кэшировать запросы, при грамотном раскладе можно сэкономить ещё минимум в пару раз от стоимости этих 20-40к.

Кэширование

Каждый свайп или сообщение ты заново шлёшь свой промпт в API целиком, с картой, историей, промптом, и прочей мурой что у тебя там есть. По мере удлинения истории это всё может влететь в копеечку. Но есть вариант сэкономить, применив кэширование. Токены которые не изменились в твоём промпте между запросами, стоят намного дешевле, обычно раз в 10. Все что изменились стоят чуть дороже (обычно 20-50%). В API запросах типичного ролеплея обычно больше всего расходов идёт на инпут, а он легко подвергается кэшированию.

Казалось бы, чего стоит закэшировать десятки тысяч токенов? Это же небольшой текстовик. Но на практике KV кэш в памяти машины это гигантский вектор состояния контекста, и хранится он специально для тебя, занимая драгоценные гигабайты в VRAM на нодах стоимостью в элитный особняк. Да ещё одновременно могут кэшироваться сразу несколько запросов, т.к. агенты могут плодить их. Поэтому никто не хранит кэш бесконечно, у него есть таймаут после которого он выбрасывается, и новый запрос заполнит его по-новой. Таймаут зависит от провайдера, например у клода это может быть час, у дипсика ненормировано вплоть до суток (у них есть особая магия сжатия контекста, за счёт этого они успевают его быстро-быстро дёргать на SSD и обратно в VRAM).

Кэш на большинстве провайдеров полностью автоматический - API сам детектит что именно осталось неизменным и не сбрасывает это в памяти машины. Нужно лишь одно правило: вся неизменная часть твоего контекста должна быть вверху, вся изменяемая - внизу, её лучше всего переместить вниз, например под историю чата:

  • любой вид рандома, например {{random}} или {{roll}} (но не {{pick}}, т.к. он рандомится один раз за весь чат и дальше остаётся неизменным, если ты не делаешь /reroll-pick)
  • {{getvar}}
  • точки инжекта записей лорбука (World Info)
  • суммарайз
  • инфоблок (хотя его можно и оставить как обычно в прошлом сообщении, потеря невелика)

и т.д.

Прежде чем глубоко РПшить, убедись что кэш на твоём провайдере вообще работает (например у OpenRouter можно посмотреть в профиле сколько токенов было закэшировано в каждом запросе). Некоторые провайдеры глючные, некоторые имеют какие-то неочевидные нюансы взаимодействия с таверной или свои собственные, и т.п. Например клод способен кэшировать лишь блоками по 1к токенов, а автоматическое кэширование у него было добавлено лишь недавно, обновись на staging ветку таверны, если там это вообще есть.

Границы сброса кэша

Учти что большинство провайдеров детектят изменения кэша в сообщениях целиком. Т.е. если у тебя в таверне в настройках подключения включено Merge всех последовательных промптов, и все промпты твоего пресета шлются от юзер роли, то всё это грохнется единым куском от юзера сетке в контекст. Даже если ты изменяемую часть кинешь вниз, изменится ВСЁ это сообщение от юзера целиком, и кэш похудеет на эту часть, а в ней ведь отсылается практически весь твой пресет. Поэтому если юзаешь мёрж, есть смысл отделить неизменяемую часть контекста от изменяемой, например всунув промеж ними сообщение ассистента.

Кэш зачастую определяется по чанкам, т.е. минимальный блок который можно закэшировать это очень часто (но не обязательно) 1к токенов, "хвост" который меньше этой цифры не кэшируется.

У Клода есть нюанс, можно задать четыре независимые точки детекта сброса кэша, но это не сильно актуально на таверне.

Известно например что DeepSeek на официальном API работает только по чанкам, ему без разницы сообщения целиком. А клод на Anthropic API работает и по чанкам и по сообщениям. Чтобы узнать как именно делает твой провайдер, тебе придётся тестить это самостоятельно. Смотри что отправляется в консоли и сколько именно было закэшировано.

Суммарайз

Поскольку историю ты будешь сильно ограничивать, ключевые события можно запоминать при помощи суммаризации, чтобы ничего не забывалось. Как сделать адекватный суммарайз можешь почитать например здесь, а потом взять пресет-генератор саммари отсюда. Либо можешь придумать свою охуительную схему, главное запостить не забудь чтобы и другие аноны пользовались.

Учти что саммари это изменяемая часть (время от времени), поэтому либо суй его вниз, либо мирись с тем что кэш сгорает каждый раз когда ты его обновляешь.

Лорбук

Некоторые вещи в саммари писать слишком накладно по токенам и сложности. Например у тебя ебовая адвенчура, в которой ты бродишь по миру и открываешь новых НПС и новые локации. Если ты уверен что когда-нибудь ещё повстречаешь их, то надо где-то запомнить их описания, раскладку, и т.п., потому что лишнюю историю ты отбрасываешь. Нет никакого смысла держать их в контексте целиком все одновременно, ведь ты не будешь во всех локах сразу. Для этого в таверне есть лорбуки, и можно привязывать их к конкретному чату. Создай новый лорбук через World Info -> New. Открой карточку (иконка книжки с глобусом, Chat Lore), выбери свой лорбук чтобы его привязать.

Допустим ты пришёл в новую локу Конезалупово. Пишешь или генерируешь ей описание, можно в XML но не обязательно, как хочешь:

⎗
✓
1
2
3
<location name="Конезалупово">
Конезалупово это деревня к северу от Ебенёво, там живут алкаши и бомжи. (ещё 400 токенов говна)
<location>

Создаёшь в лорбуке запись с кейвордом Конезалупово, если на русике то /[Кк]онезалупово/ чтобы оно учитывало регистр. Теперь как только лока будет упомянута в истории, в контекст подсосётся её описание. Чтобы кэш не сгорел при этом, убедись что в твоём пресете точки обе точки инжекта лорбука находятся под историей.

Откуда сетка будет вообще знать что такая лока существует и её можно упомянуть, если её в контексте давно нет? Для этого в суммарайзе по ссылке выше есть модуль Visited Locations, в котором хранятся краткие однострочные описания доступных локаций которые ты намерен повторно посетить. Кроме того, существует механика инфоблока, в нём ты можешь написать "Location: такой-то" и пока ты находишься в этой локе, у тебя её имя, а с ним и описание из лорбука, будут болтаться в контексте.

То же самое можно сделать с НПС, например в инфоблоке можно трекать состав текущей пати. Да и вообще с любым куском лора, который ты выявил в процессе РП.

Как избежать сгорания кэша на длинной истории

Поскольку ты вроде как сэкономить пытаешься, на длинных чатах возникает нюанс. Допустим ты ставишь лимит контекста 32к токенов и лимит ответа 8к токенов, т.е. таверна сможет отослать сетке не более 24к. Как только твоя карта+промпт+история набирают 24к в сумме, хвост истории начинает отрезаться (таверна чертит пунктирную линию в этом месте), и вся история сдвигается на 2 сообщения. Поскольку история теперь не совпадает с прошлым запросом один в один, то сгорает весь кэш на ней и ниже, оставляя лишь промпт и карту. Т.е. бОльшая часть кэша начинает тупо сливаться в унитаз каждое сообщение.

Поэтому РПшить длинные чаты с кэшем надо немного иначе.

  1. Включи отображение номеров сообщений в таверне (User Settings -> Message IDs).
  2. РПшь пока не забьётся лимит. Вот для примера у тебя сообщение #40 подошло к твоему лимиту контекста, дальше уже начнёт отрезаться.
  3. Спрячь от сетки все сообщения кроме последней пары ответов командой /hide (набирай прямо в ответе). 2 ответа это 4 сообщения, т.е. в данном случае делаешь /hide 0-36. Сообщения с этими номерами останутся в таверне, но сетке слаться не будут.

Теперь кэш на истории сгорит, и она начнёт заполняться заново. Так и повторяешь по кругу - РПшишь до забивания лимита, делаешь /hide, оно сгорает и заполняется по новой. Если хочешь, можно сделать обратно /unhide 0-40.

Безжоп

На безжопе возникает проблема, т.к. у него вся хистори хранится в одном постоянно удлиняющемся сообщении, а большинство провайдеров детектит сброс кэша по границе сообщений. В этом случае можно включить в расширении разделитель сообщений или сцен, привязав их к транзишенам или ещё каким-нибудь триггерам, чтобы изменяемым был только последний небольшой кусок истории.

Сгорает ли кэш на разных сообщениях?

Иногда приходится слать нейронке разные контексты. Например если ты используешь внешние блоки чтобы разделять промпт на разные вызовы ЛЛМ, или переключаешься на отдельный суммарайз-промпт раз в сцену. Сгорает ли кэш при этом? Можешь не париться, это предусмотрено, потому что агенты только так и работают. Отдельные вызовы дедуплицируются на стороне API и подтягивается та неизменяемая часть кэша которая нужна, если она конечно сохранена и ещё не сгорела. Эта схема не резиновая, какой-то лимит существует, да и конкретный провайдер может вносить специфику, так что проверяй на практике.

Edit

Pub: 23 Mar 2026 19:11 UTC

Edit: 22 Sep 2026 06:24 UTC

Views: 913