Ранее я написал обширную статью про попытки сделать разговоры с NPC SkyrimNet более живыми, но упустил главное… Не рассказал, как вообще устроен NPC изнутри. Что происходит, когда вы дописываете реплику от лица своего персонажа и нажимаете Enter?
А происходит вот что: в диалоговую нейронку отправляется километровый запрос. Для каждой новой реплики он формируется заново целиком. Но, всем продвинутым пользователям LLM-ок это и так очевидно.
Память
Самая важная часть пакета – память NPC. У неё 3 слоя:
1. Краткосрочная. Нейронке отправляется последние N событий из лога, по умолчанию N = 50.
17:10 – Снорри съел батон
17:11 – Стражник сцепился с волком
17:12 – Снорри кричит: “Бей по глазам!”
17:15 – Стражник убил волка, с волка можно взять шкуру и рубин
2. Долгосрочная – воспоминания. Это может быть и 1 абзац с фактами, и 15 абзацев с рефлексией (дневник). Что-то ненужное может вообще сюда не записаться.
Снорри: “Стражник сегодня дрался с волком у ворот. Сделал за меня всю работу, а я потом собрал с волка шкуру и рубин”.
В input улетают только M самых релевантных воспоминаний. По умолчанию M = 5.
Для нас интересно, что воспоминание маркируется эмоцией (нейтральный, радость, триумф, печаль, гнев…) и важностью от 0.00 до 1.00.
Ровно из-за этого слоя я страдал в предыдущей статье. Высшую важность 0.90-0.95 всегда получала TRAUMA, из-за этого в любом обращении к LLM поднималось вопоминание о травме, и через 100+ часов игры я оказался в толпе ПТСР-нутых.
Техническая инфо Для решения этой проблемы в SkyrimNet добавили Decay. Насколько я понимаю, он снижает вероятность того, что давнее воспоминание упакуется в input, в то время как я бы сделал постепенную деградацию самой переменной importance_score (importance_score(t) = importance_score(0) *f(Δt))
3. Вечная – биография. Всегда отправляется в input целиком и содержит:
-
Summary – сжатое описание NPC.
-
Interject_summary – любимые темы для беседы. Именно сюда я пытался добавлять списки, чтобы сделать болтовню NPC живее и разнообразнее. Проблема в том, что эти темы больше влияют на то, вступит ли NPC в уже идущий разговор.
-
Background – история жизни.
-
Personality – психология: характер, реакции, отношение к миру и людям и т.д..
-
Appearance – внешность.
-
Aspirations – жизненные цели. По опыту, крайне влияет на суть реплик NPC.
-
Relationships – кому ты друг, враг, родственник, союзник, возлюбленный.
-
Occupation – социальная роль.
-
Skills – очевидно, навыки. Не связано с реально прокачиваемыми навыками в игре.
-
Speech_style – влияет скорее на форму реплики, чем смысл: длина фраз, формальность.
Биография может быть обычная или динамическая – постепенно изменяемая по ходу событий.
***
В этот же блок, “мозги NPC”, запишем статусы, висящие на самом NPC (не хватает маны, ранен и др) и сухие параметры (раса, пол, фракция…).
Но это не всё!
В пакете на input есть ещё несколько компонентов:
Окружение
Это сухие данные из самой игры: погода, время суток, имя локации, кто ещё из NPC присутствует, какие статусы висят на них.
Также каждые X секунд снимается скриншот, описывается отдельной нейронкой и сохраняется. Так NPC может узнать, что мы не просто возле башни Олафа Всратого, а то, что вокруг лежит снег, на небе северное сияние, а сама башня полуразвалившаяся.

World Knowledge
Факты о мире, которые должны знать NPC. Игрок может сам писать канон:
“Империя победила в гражданской войне, это знают все”
“Персонаж игрока – легат, солдаты и стражники знают его в лицо”
Метаинструкции и гайдлайны

Благодаря десяткам промптов, нейронка знает, как обрабатывать всю ту бадягу выше. Ещё есть промпты для сабмодулей: обработка сплетен, инвентаря, торговли…
Поэтому, В ТЕОРИИ, нейро-NPC знает, что у неё в инвентаре. НА ПРАКТИКЕ, как мы знаем, спутница однажды решила, что голодна и записала это в динамическую био; из-за этого начала постоянно ущемляться и в итоге уволилась – хотя её рюкзак был полным еды. Теперь я всем спутникам пишу в био, что они не чувствуют голод и холод :D
А в roleplay_guidelines.prompt скопились нынче все мои боли (“не морализаторствуй”, “не философствуй пустыми абстракциями” и др). Прислушавшись к MountainGoat, я написал сюда, что нейронка теперь Квентин Тарантино, режиссирующий сцену в мире TES. Но, это мало что изменило. Возможно, строки гайдлайна просто теряются как незначимый факт в том массивном инпуте, что обрабатывает LLM. Мб поможет дописать в этом файле: “EXTREMAL PRIORITY!!!”.
Особенности самой LLM
Ещё один неочевидный слой – это то, что система не запаковала в input, но в нейромозгах это всё равно всплывёт, к лучшему или к худшему.
4.1. Инфо из поисковика
Спросите любого NPC об условном Совнгарде – местной Вальгалле. В базе знаний (World Knowledge) информации о Совнгарде нет, но ИИ-батрак сам сходит в поисковик, найдёт инфо и зафиналит реплику.
Здесь бывают моменты лажи. Нейронка может неверно истолковать какой-то узкий лорный момент. Так, я сказал “Мазкен” (имя редкой расы), а NPC-собеседник решил, что это чьё-то личное имя.
С другой стороны, спросите любого NPC, что он думает о патче KDE2 под FreeBSD – и хотя нейронка тоже может это нагуглить, она останется в роли средневекового персонажа.

4.2. Инфо, зашитая в веса
Нейронки обучались на массивах информации из этих ваших интернетов. Поэтому, если там главенствует какой-то стереотип, то LLM впитала его при обучении. Пример такого семантического стереотипа:
дети = говорят мудрые вещи + всегда невинные + уязвимая группа + о них следует заботиться
Два NPC с диаметрально разными характерами сказали, что 9-летний ребёнок не может манипулировать :) При этом вам любой родитель скажет, что дети манипулируют с 3-4 лет. Даже если у вас в отыгрыше дьявольское дитя а-ля Omen, NPC-взрослые будут стремиться выгораживать его и защищать. Забавно наблюдать, как одна и та же нейронка издевается над окружающими от лица NPC-ребёнка и одновременно отрицает эти издевательства от лица NPC-взрослых.
А персонаж с замашками психопата, услышав банальную фразу от ребёнка, умилительно запишет в дневник: “Мой ребёнок мудрее меня! Вспоминаю, как он сегодня сказал мне Х, и слушаю его дыхание за стеной…”
“Слушать дыхание” – это какое-то неизлечимое клише и у дипсика, и у минимакса. Ещё больше они обожают только “мои пальцы дрожали” и “правду”.
Ещё забавное следствие семантических стереотипов: одна NPC больше ужаснулась персонажу – завязавшему (!) наркоману, чем персонажу-каннибалу. Самостоятельно попробуйте объяснить, почему.

***
Нельзя сказать, что любой NPC в ИИ-ролеплее – это как человек с амнезией, который знает о себе 2-3 факта. Он имеет кучу фактов о себе и окружении, может обратиться к базе знаний всея интернетов, чтобы получить факты о мире, в котором живёт. Кто сейчас король? Какие боги есть в этом мире? Что за животные бывают в том лесу? Какие национальные блюда есть у нордов?
Проблема только в том, что пока вы ёжика не пнёте, он к этим фактам не полетит. И никогда не выдаст иммерсивное: “А вот при короле Торуге жилось лучше”, если в его био прямо не сказано: “интересуется политикой” И “одобряет короля Торуга”.
Пищей для развития нейро-персонажа может стать реплика игрока, жёсткое событие в логе (как чья-то смерть), хардкод (например, когда NPC-друг узнаёт слух об игроке и отправляется его искать), но не какой-то внутренний инсайт, импульс. Как если бы вы были окружены людьми с нулевой агентностью.
PS. Пока что я продолжаю развлекаться с параметрами модели, набирая материал для новой статьи. Хочется, чтоб выводы были не поверхностные, поэтому занимает время.
PPS. У меня есть роман аж 2018 года на тему ИИ в РПГ-играх. Забавный факт: в 2019-м рецензент написал, что таким мощностям для ИИ взяться некуда, а потому “не верю, отторжение, и КПД текста резко падает”. Ну что, кто смеётся последним в 2026-м? :D
Аудиоверсия на Литрес | Аудиоверсия на АТ | Текстовая версия на АТ
Автор: VMarkell


