Для чего нуж­ны боль­шие язы­ковые модели? Если судить по Reddit, то основных сце­нари­ев выходит два: кодинг (все, бук­валь­но все вне­зап­но начали что‑то кодиро­вать) и ролевые игры. О вайб‑кодин­ге луч­ше меня напишут дру­гие, я же хочу погово­рить о ролевых играх, где в качес­тве пер­сонажа выс­тупа­ет искусс­твен­ный интеллект.

Пи­сать оче­ред­ное руководс­тво в сти­ле «запус­ти прог­рамму, положи сюда десят­ку и нас­лаждай­ся бес­плат­ным дип­сиком» скуч­но и неин­терес­но; таких руководств в сети более чем хва­тает. Нам же инте­рес­но заб­рать­ся под капот игро­вого механиз­ма, пос­мотреть, как фор­миру­ются зап­росы и как получа­ются отве­ты от 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 тысяч токенов), и, ког­да исто­рия перепис­ки перева­лива­ет за раз­решен­ный, фрон­тенд (не сама модель!) «под­реза­ет» ее, что­бы умес­тить в ука­зан­ные рам­ки.

Что имен­но «под­реза­ется», а что — оста­ется? Это кон­тро­лиру­ется нас­трой­ками фрон­тенда.

Настройки окна контекста в LM Studio
Нас­трой­ки окна кон­тек­ста в LM Studio

То есть стра­тегия по умол­чанию — оста­вить сис­темное сооб­щение (воз­можно — и начало чата, зависит исклю­читель­но от нас­тро­ек фрон­тенда) и вырезать кусок из середи­ны, не тро­гая пос­ледние сооб­щения.

|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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии