Skip to content

Personas

shaerware edited this page Aug 9, 2026 · 2 revisions

Personas (Персоны ассистента)

Персона — это LLM-пресет: системный промпт плюс параметры генерации. Персону можно привязать к чату, виджету, мобильному ассистенту или Telegram-боту, и она будет определять, как ассистент отвечает.

Главное про модель работы

Привязка хранит только id пресета. Промпт и параметры перечитываются из базы на каждом сообщении — копий-снимков нет. Поэтому правка персоны в разделе LLM сразу применяется во всех привязанных чатах и каналах, без пересоздания сессий и перезапуска ботов.

Где хранится привязка Поле «Нет персоны»
Чат-сессия chat_sessions.llm_persona NULL
Виджет / мобильный инстанс / Telegram-бот llm_persona пустая строка

Сами пресеты живут в таблице llm_presets, резолвер — modules/llm/persona.py.

Приоритет системного промпта

modules/chat/facade.py:_build_prompt:

  1. Явный оверрайд из запроса (llm_override.system_prompt)
  2. Собственный промпт чата или инстанса
  3. Промпт персоны
  4. prompts/platform-agent.md (путь через PLATFORM_AGENT_PROMPT_FILE)
  5. Промпт LLM-сервиса

Персона стоит ниже собственного промпта — локальная настройка всегда побеждает; и выше platform-agent — поэтому привязка персоны реально меняет ответы.

Параметры генерации

Если персона привязана, из неё берутся temperature, max_tokens, top_p, repetition_penalty. Явные llm_params инстанса перекрывают значения персоны.

Параметры передаются на каждый вызов (generate_response_from_messages(..., params=...)), а не пишутся в сервис: LLM-сервис — синглтон, общий для всех параллельных чатов, и запись в него параметров одного чата испортила бы остальные. Поддержано в VLLMLLMService, CloudLLMService, OpenAICompatibleProvider и GeminiProvider (у Gemini параметры уезжают в generation_config; repetition_penalty отбрасывается — эквивалента в API нет).

Где настраивается

Раздел LLM — редактирование самих персон

Admin Panel → LLM → Персоны секретарей. Полный CRUD: id, имя, описание, системный промпт и все четыре параметра генерации. Здесь же создаются новые персоны — править код не нужно (старый хардкод SECRETARY_PERSONAS в vllm_llm_service.py остался только как источник дефолтов для первичного заполнения таблицы).

Кнопка «Сбросить» возвращает промпт пресета к значению из DEFAULT_LLM_PRESETS.

Чат — привязка и правка на месте

Настройки чата (шестерёнка) → вкладка «Промпт сессии» → блок «Персона»:

  • выпадающий список персон или «— без персоны —»;
  • строка-подсказка, откуда сейчас берётся промпт;
  • редактор промпта персоны и её параметры;
  • «Сохранить в персону» — правка уезжает в пресет и применяется ко всем, кто на него подписан (нужны права llm:edit);
  • «Только для этого чата» — текст копируется в промпт сессии, персона не меняется;
  • «Вернуть промпт персоны» — снять локальное переопределение.

Каналы

Admin Panel → Виджеты / Мобильное приложение / Telegram → вкладка AI. Выпадающий список персон (реальный список из базы, а не два зашитых имени). В карточке инстанса промпт показывается всегда, с пометкой источника: собственный промпт инстанса, промпт персоны или промпт платформы.

Встроенные персоны

Таблица заполняется из DEFAULT_LLM_PRESETS при первом обращении:

id Имя Стиль
anna Анна Дружелюбный, краткий
marina Марина Формальный, профессиональный

Обе рассчитаны на телефонный сценарий: короткие ответы без Markdown, числа прописью, «ё». Для чата и виджетов чаще подходят Prompts или собственная персона.

API

Метод Эндпоинт Права
GET /admin/chat/personas chat:view — список для пикера в чате
GET /admin/llm/presets llm:view — полный список пресетов
POST / PUT / DELETE /admin/llm/presets[/{id}] llm:edit — CRUD
GET / POST /admin/llm/prompt/{persona} llm:view / llm:edit — промпт персоны
POST /admin/llm/prompt/{persona}/reset llm:edit — сброс к дефолту
PUT /admin/chat/sessions/{id} chat:edit — поле llm_persona

Отдельный /admin/chat/personas нужен, чтобы пикер работал у пользователей без доступа к разделу LLM. Правка самой персоны при этом остаётся привилегированной операцией.

Миграция

scripts/migrate_persona_binding.py добавляет chat_sessions.llm_persona и обнуляет llm_persona у существующих виджетов, мобильных инстансов и ботов.

Обнуление намеренное: поле много релизов дефолтилось в anna, но не читалось никем. Начни система уважать его задним числом — все живые виджеты без своего промпта внезапно заговорили бы телефонным промптом секретаря. После миграции персона включается явно. Поддерживает --dry-run.

Ограничения

  • У WhatsApp-инстансов колонки llm_persona пока нет.
  • ENV-переменная SECRETARY_PERSONA влияет только на глобальную персону LLM-сервиса (legacy-пути /chat, телефония), но не на чат-сессии.

← Wiki-RAG | Prompts | API-Reference →

Clone this wiki locally