- BrainTools - https://www.braintools.ru -
Ранее я написал обширную статью [1] про попытки сделать разговоры с NPC SkyrimNet [2] более живыми, но упустил главное… Не рассказал, как вообще устроен NPC изнутри. Что происходит, когда вы дописываете реплику от лица своего персонажа и нажимаете Enter?
А происходит вот что: в диалоговую нейронку отправляется километровый запрос. Для каждой новой реплики он формируется заново целиком. Но, всем продвинутым пользователям LLM-ок это и так очевидно.
Самая важная часть пакета – память [3] NPC. У неё 3 слоя:
1. Краткосрочная. Нейронке отправляется последние N событий из лога, по умолчанию N = 50.
17:10 – Снорри съел батон
17:11 – Стражник сцепился с волком
17:12 – Снорри кричит: “Бей по глазам!”
17:15 – Стражник убил волка, с волка можно взять шкуру и рубин
2. Долгосрочная – воспоминания. Это может быть и 1 абзац с фактами, и 15 абзацев с рефлексией (дневник). Что-то ненужное может вообще сюда не записаться.
Снорри: “Стражник сегодня дрался с волком у ворот. Сделал за меня всю работу, а я потом собрал с волка шкуру и рубин”.
В input улетают только M самых релевантных воспоминаний. По умолчанию M = 5.
Для нас интересно, что воспоминание маркируется эмоцией [4] (нейтральный, радость, триумф, печаль, гнев…) и важностью от 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 – психология: характер, реакции [6], отношение к миру и людям и т.д..
Appearance – внешность.
Aspirations – жизненные цели. По опыту [7], крайне влияет на суть реплик NPC.
Relationships – кому ты друг, враг, родственник, союзник, возлюбленный.
Occupation – социальная роль.
Skills – очевидно, навыки. Не связано с реально прокачиваемыми навыками в игре.
Speech_style – влияет скорее на форму реплики, чем смысл: длина фраз, формальность.
Биография может быть обычная или динамическая – постепенно изменяемая по ходу событий.
***
В этот же блок, “мозги NPC”, запишем статусы, висящие на самом NPC (не хватает маны, ранен и др) и сухие параметры (раса, пол, фракция…).
Но это не всё!
В пакете на input есть ещё несколько компонентов:
Окружение
Это сухие данные из самой игры: погода, время суток, имя локации, кто ещё из NPC присутствует, какие статусы висят на них.
Также каждые X секунд снимается скриншот, описывается отдельной нейронкой и сохраняется. Так NPC может узнать, что мы не просто возле башни Олафа Всратого, а то, что вокруг лежит снег, на небе северное сияние, а сама башня полуразвалившаяся.

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

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

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

***
Нельзя сказать, что любой NPC в ИИ-ролеплее – это как человек с амнезией, который знает о себе 2-3 факта. Он имеет кучу фактов о себе и окружении, может обратиться к базе знаний всея интернетов, чтобы получить факты о мире, в котором живёт. Кто сейчас король? Какие боги есть в этом мире? Что за животные бывают в том лесу? Какие национальные блюда есть у нордов?
Проблема только в том, что пока вы ёжика не пнёте, он к этим фактам не полетит. И никогда не выдаст иммерсивное: “А вот при короле Торуге жилось лучше”, если в его био прямо не сказано: “интересуется политикой” И “одобряет короля Торуга”.
Пищей для развития нейро-персонажа может стать реплика игрока, жёсткое событие в логе (как чья-то смерть), хардкод (например, когда NPC-друг узнаёт слух [13] об игроке и отправляется его искать), но не какой-то внутренний инсайт, импульс. Как если бы вы были окружены людьми с нулевой агентностью.
PS. Пока что я продолжаю развлекаться с параметрами модели, набирая материал для новой статьи. Хочется, чтоб выводы были не поверхностные, поэтому занимает время.
PPS. У меня есть роман аж 2018 года на тему ИИ в РПГ-играх. Забавный факт: в 2019-м рецензент написал, что таким мощностям для ИИ взяться некуда, а потому “не верю, отторжение, и КПД текста резко падает”. Ну что, кто смеётся последним в 2026-м? :D
Аудиоверсия на Литрес [14] | Аудиоверсия на АТ [15] | Текстовая версия на АТ [16]
Автор: VMarkell
Источник [17]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/36654
URLs in this post:
[1] обширную статью: https://habr.com/ru/articles/1084384/
[2] SkyrimNet: https://fateless.ai/
[3] память: http://www.braintools.ru/article/4140
[4] эмоцией: http://www.braintools.ru/article/9387
[5] Эмоции: http://www.braintools.ru/article/9540
[6] реакции: http://www.braintools.ru/article/1549
[7] опыту: http://www.braintools.ru/article/6952
[8] боли: http://www.braintools.ru/article/9901
[9] MountainGoat: https://habr.com/ru/articles/1084384/#comment_30445670
[10] обучении: http://www.braintools.ru/article/5125
[11] дыхание: http://www.braintools.ru/article/4500
[12] наркоману: http://www.braintools.ru/article/3452
[13] слух: http://www.braintools.ru/article/6251
[14] Аудиоверсия на Литрес: https://www.litres.ru/audiobook/merlin-markell/vendetta-73189663/
[15] Аудиоверсия на АТ: https://author.today/audiobook/562639
[16] Текстовая версия на АТ: https://author.today/work/16849
[17] Источник: https://habr.com/ru/articles/1091714/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1091714
Нажмите здесь для печати.