Persona: как я учу Еву чувствовать (и почему это математика)
У Евы, моего оркестратора 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 прогоняет ядро и строит графики без браузера.
Что дальше
Подключить модель к Еве как отдельный слой между «пониманием» сообщения и «говорилкой». Языковая модель будет получать не «будь весёлой», а текущий вектор эмоций и отношение к собеседнику, и уже из них выбирать тон.