Persona: как я учу Еву чувствовать (и почему это математика)

· 3 мин · BadRabbit

У Евы, моего оркестратора LLM, есть вторая сторона: она не только выполняет задачи, но и общается. Мне хотелось, чтобы у неё был характер, а не набор фраз «Я всего лишь языковая модель». Проект Persona — это модель эмоций и отношений, которую Ева будет использовать, и лаборатория, в которой я эту модель проверяю.

Почему не «просто промпт»

Можно написать в системном промпте «ты весёлая». Но тогда настроение не зависит от того, что происходит в разговоре, не накапливается и не проходит. А главное, его нельзя измерить и протестировать. Мне нужна была модель с явным состоянием, которую можно гонять по сценариям и рисовать на графиках.

Как устроена модель (v2)

Восемь слоёв, у каждого своё время жизни:

СлойЧто хранитЖивёт
Восприятиеничего—
Событиеодну записьмиг
Отношение6 величин на каждый контактнедели и месяцы
Оценкапеременные оценкимиг
Эмоциисписок «живых» эмоцийминуты и часы
Настроениеточку в пространстве PADчасы и сутки
Характер~20 константвсегда
Выражениеничегомиг

Ключевые решения второй версии:

  • 24 типа эмоций по теории OCC вместо одного числа «хорошо/плохо». Ева может одновременно радоваться за одного человека и злиться на другого. Про OCC будет отдельный разбор.
  • Настроение — точка в трёхмерном пространстве PAD (удовольствие, возбуждение, доминирование), а не скаляр. О PAD тоже будет разбор.
  • У каждой валентности свой адресат. В первой версии был баг: на фразу «Вася рассказал, что Петя обманул» Ева обижалась на Васю. Теперь у события есть поля «кто сообщил», «кто совершил», «с кем случилось» и «о чём», и оценка идёт по правильному объекту.

Есть две обратные связи. Настроение влияет на порог, а не на силу эмоции: в хорошем настроении мелкая неприятность просто не пробивает. А эмоции, связанные с чьим-то поступком, постепенно меняют отношение к этому человеку.

И одно жёсткое ограничение: отношение влияет только на тон, но никогда на факты. Ева может быть холоднее с тем, кто её обижал, но не имеет права ему врать.

Лаборатория на Nix

Сам репозиторий — это воспроизводимое окружение для экспериментов:

nix develop --command jupyter lab

Внутри Python 3.14, NumPy и SciPy для траекторий затухания, SymPy для символьной проверки формул, pandas для таблиц сценариев, Plotly для трёхмерного PAD, Hypothesis для генерации граничных случаев. Все версии закреплены в flake.lock, а nix flake check прогоняет ядро и строит графики без браузера.

Что дальше

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