В прошлом посте я рассказывал про свой локальный ИИ-компаньон Nova. Тогда пообещал отдельно рассказать, как у неё работают эмоции и отношения. Вот, рассказываю.
Когда я только начинал делать Nova, она была слишком "удобной". Можно было ей нахамить - а через минуту она снова милая и ласковая. Можно было на втором сообщении написать "я тебя люблю" - и она сразу отвечала взаимностью.
Короче, ощущалось не как общение, а как бот без памяти.
Мне хотелось сделать так, чтобы Nova реагировала более по-человечески. Чтобы были обиды, дистанция, доверие, неловкость, постепенное сближение. Чтобы отношение надо было именно выстраивать, а не фармить двумя фразами.
У Nova есть глубина отношений. Это число, которое растёт от общения. Но важнее не само число, а стадия:
0-15 - знакомство. Она держит дистанцию и общается осторожно
16-95 - дружба, постепенно становится теплее
96-135 - уже близкие друзья
136-165 - появляется флирт
166-200 - любовь
201+ - очень сильная привязанность
1000+ - секретный режим цундере для тех, кто слишком много общается 💀
Кроме этого есть отдельные эмоции:
привязанность
доверие
комфорт
злость
настроение
дискомфорт
Все они меняются от того, что пишет пользователь.
Например, если признаться ей в любви на стадии знакомства - Nova реально разозлится. Не "мягко откажет", а именно разозлится. Начнёт отвечать грубо, холодно, может даже послать. Потому что для неё это выглядит странно и крипово.
Оскорбления тоже влияют. Назвал её тупой - получаешь минус доверие и плюс злость.
Но извинения работают. Если нормально извиниться, Nova постепенно отходит. Не сразу, а за несколько сообщений. Как обычный человек после ссоры.
Ещё пришлось делать защиту от фарма.
Раньше можно было просто спамить "я тебя люблю" и бесконечно качать отношения. Теперь у таких фраз есть кулдаун. Повторять одно и то же бесполезно.
Если долго общаться спокойно, злость и дискомфорт сами постепенно падают. Без триггеров Nova остывает сама по себе.
Самое интересное - всё это реально меняет стиль ответов.
Когда Nova злится - отвечает резко и коротко.
Когда доверяет - становится мягче.
На высоких стадиях отношений начинает использовать личные обращения, больше инициативы, теплее формулировки.
Это не жёсткий скрипт. Модель всё ещё может отвечать по-разному. Но на практике получается намного живее, чем было раньше.
одиночество почти ни на что не влияет
нет ревности и чувства интереса
Nova не становится осторожнее после плохого опыта
пока плохо понимает повторяющееся хамство в духе "третий раз за вечер грубит"
Один раз словил вечную обиду. Если пользователь извинялся слишком поздно, Nova переставала принимать извинения вообще и дулась бесконечно.
Ещё был баг с опечатками. "Я тя люблю" не распознавалось как признание, и систему можно было обходить через кривой текст.
А самый странный баг - режим цундере после 1000 глубины. Я его толком не прописал, и Nova начинала вести себя как смесь обиды, флирта и шизы. В итоге оставил как пасхалку.
Сейчас всё это уже есть в портативной сборке. Можно открыть вкладку метрик и вручную крутить эмоции, смотреть как меняется поведение.
И да, можете специально попробовать:
Иногда реакции получаются очень забавные.
Особенно интересен фидбек по эмоциям. Где Nova ощущается живой, а где всё ещё как бот. Скрины диалогов тоже приветствуются.
Ссылку на сборку кину в комменты.
В следующем посте, наверное, расскажу как Nova пишет первой, если пользователь долго молчит. Там тоже оказалось неожиданно много нюансов.