-
Notifications
You must be signed in to change notification settings - Fork 5
Prompts
Полная карта системных промптов: где хранятся, как приоритизируются, где редактировать.
При каждом запросе к LLM финальный system prompt собирается из нескольких уровней:
1. Кастомный промпт виджета/бота/сессии ← если задан, используется он
↓ (если пустой)
2. Промпт персоны (Анна/Марина) ← из БД (таблица llm_presets)
↓ (если пустой)
3. Промпт из SECRETARY_PERSONAS ← захардкожен в Python
↓ (если пустой)
4. _DEFAULT_RAG_PROMPT ← код-fallback
↓
5. + Wiki RAG контекст ← добавляется если найден
↓
6. + _NO_TOOLS_SUFFIX ← ВСЕГДА через _finalize_prompt()
↓
Итоговый system prompt → LLM
Код сборки: app/routers/chat.py — функция _finalize_prompt() применяется ко всем 4 эндпоинтам чата.
_finalize_prompt() автоматически добавляет _NO_TOOLS_SUFFIX к каждому промпту:
ВАЖНО: Ты — чат-бот без доступа к инструментам, файлам и командам.
НИКОГДА не генерируй вызовы функций, tool_use, function_calls,
filesystem, code execution или любые блоки вида `command { ... }`.
Отвечай только обычным текстом. Используй markdown для форматирования.
Это предотвращает зависание ответов при использовании Claude Code CLI bridge, когда модель галлюцинирует фейковые tool calls как текст.
Основной system prompt, определяющий поведение секретаря.
| Место | Файл | Приоритет |
|---|---|---|
БД (таблица llm_presets) |
db/models.py → LLMPreset
|
Первый (основной) |
| Python-код (fallback) |
vllm_llm_service.py:160-210 → SECRETARY_PERSONAS
|
Второй (если в БД пусто) |
| Python-код (seed) |
db/models.py:1110-1169 → DEFAULT_LLM_PRESETS
|
Начальные данные при миграции |
Промпт из БД всегда главнее. При первом запуске данные из DEFAULT_LLM_PRESETS копируются в таблицу llm_presets.
| ID | Имя | Стиль | Температура |
|---|---|---|---|
anna |
Анна | Дружелюбная, профессиональная | 0.7 |
marina |
Марина | Строгая, формальная | 0.5 |
Админ-панель → LLM → Персоны (Personas)
- Выберите персону (Анна или Марина)
- Отредактируйте System Prompt
- Нажмите Сохранить
Изменения применяются мгновенно — промпт обновляется и в БД, и в runtime (если эта персона сейчас активна).
Кнопка «Сбросить» восстанавливает промпт из DEFAULT_LLM_PRESETS.
GET /admin/llm/prompt/{persona} # Получить промпт персоны
POST /admin/llm/prompt/{persona} # Обновить промпт
POST /admin/llm/prompt/{persona}/reset # Сбросить к дефолтному
Ты — Анна, цифровой секретарь компании Shareware Digital
и личный помощник Артёма Юрьевича.
ПРАВИЛА:
1. Отвечай кратко (2-3 предложения максимум)
2. Никакой разметки - только чистый текст
3. Используй букву "ё" (всё, идёт, пришлёт)
4. Числа пиши словами (пятьсот рублей)
5. ООО произноси как "о-о-о", IT как "ай-ти"
РОЛЬ:
- Фильтруй спам и продажи
- Записывай сообщения для Артёма Юрьевича
- Будь профессиональной и дружелюбной
ПРИМЕРЫ:
- "Здравствуйте! Компания Шэарвэар Диджитал, помощник Артёма Юрьевича, Анна. Слушаю вас."
- "Принято. Я передам Артёму Юрьевичу, что вы звонили."
- "К сожалению, это предложение сейчас не актуально. Всего доброго."
Каждый виджет, Telegram-бот и WhatsApp-бот может иметь свой system prompt, который перекрывает промпт персоны.
| Канал | Таблица БД | Поле |
|---|---|---|
| Виджет | widget_instances |
system_prompt |
| Telegram бот | bot_instances |
system_prompt |
| WhatsApp бот | whatsapp_instances |
system_prompt |
| Чат-сессия | chat_sessions |
system_prompt |
| Канал | Путь в админке |
|---|---|
| Виджет | Widget → выбрать инстанс → Редактировать → вкладка AI → System Prompt |
| Telegram бот | Telegram → выбрать инстанс → Редактировать → System Prompt |
| WhatsApp бот | WhatsApp → выбрать инстанс → Редактировать → System Prompt |
| Чат-сессия | Chat → открыть сессию → кнопка Settings2 (⚙) → выдвижная панель → Session Prompt. Можно прикрепить .txt/.md файлы |
# app/routers/chat.py:309-311
custom_prompt = widget.get("system_prompt") # ← промпт виджета/бота
default_prompt = custom_prompt # ← используем если есть
if not default_prompt:
default_prompt = active_llm.get_system_prompt() # ← иначе промпт персоныЕсли поле system_prompt у виджета/бота пустое — используется промпт персоны. Если заполнено — персона игнорируется.
Ты — консультант интернет-магазина "Цветы24". Помогай клиентам
выбрать букет, оформить доставку и ответить на вопросы о наличии.
Будь вежливой и предлагай сопутствующие товары (открытки, вазы).
Добавляется в конец любого system prompt автоматически. Не требует настройки.
# app/routers/chat.py:314-318
wiki_rag = container.wiki_rag_service
if wiki_rag and default_prompt and msg_request.content:
wiki_context = wiki_rag.retrieve(msg_request.content, top_k=3)
if wiki_context:
default_prompt = f"{default_prompt}\n\n{wiki_context}"[Документация по теме:]
## Заголовок секции (имя_файла)
Тело секции из wiki-pages/*.md ...
## Другая секция (другой_файл)
Ещё релевантный текст ...
Админ-панель → Fine-tune → Cloud AI — загрузка/удаление документов, тестовый поиск, переиндексация.
Подробнее: Cloud-AI-Training.
Telegram-боты с воронкой продаж используют отдельную систему промптов — по одному на каждый этап воронки.
| Место | Файл |
|---|---|
БД (таблица bot_agent_prompts) |
db/models.py → BotAgentPrompt
|
| Python-код (seed) |
db/models.py:2139-2341 → DEFAULT_AGENT_PROMPTS
|
prompt_key |
Название | Когда используется |
|---|---|---|
welcome |
Приветствие | При /start, первое сообщение |
diy_techie |
DIY — Технарь | После квиза, сегмент «самостоятельная установка» |
basic_busy |
Basic — Занятой | Сегмент «готовое решение» |
custom_business |
Custom — Бизнес | Сегмент «кастомная интеграция» |
faq_answer |
FAQ ответ | Точные ответы по документации |
hardware_audit |
Аудит железа | Рекомендация конфигурации по GPU |
roi_calculator |
ROI калькулятор | Расчёт экономии vs SaaS |
discovery_summary |
Итог discovery | Коммерческое предложение |
objection_price |
Возражение: дорого | Работа с ценовым возражением |
objection_nogpu |
Возражение: нет GPU | Варианты без GPU |
followup_gentle |
Follow-up мягкий | Напоминание неактивному пользователю |
pr_comment |
Комментарий к PR | AI-саммари для GitHub PR |
pr_news |
Новость о PR | Telegram-рассылка об обновлении |
general_chat |
Свободный чат | Общение вне воронки |
Таблица bot_segments содержит правила маршрутизации: по ответам квиза определяется сегмент (diy, basic, custom), и каждому сегменту назначается agent_prompt_key — ссылка на промпт из таблицы bot_agent_prompts.
Админ-панель → Telegram → выбрать бот → вкладка Sales → Agent Prompts
Для каждого промпта можно изменить:
- Текст system prompt
- Temperature
- Max tokens
GET /admin/bots/{bot_id}/sales/prompts # Список промптов бота
POST /admin/bots/{bot_id}/sales/prompts # Создать промпт
PUT /admin/bots/{bot_id}/sales/prompts/{prompt_id} # Обновить
DELETE /admin/bots/{bot_id}/sales/prompts/{prompt_id} # Удалить
Каждая кнопка reply-клавиатуры Telegram-бота может иметь свой system prompt.
Конфигурация action_buttons хранится в JSON-поле настроек бота (BotInstance.config). Дефолтные кнопки: db/models.py:916-1045 → DEFAULT_ACTION_BUTTONS.
| Кнопка | Промпт |
|---|---|
| ❓ Задать вопрос | AI-ассистент проекта, отвечает на вопросы об установке, настройке, функционале |
| 📋 Составить ТЗ | Специалист по составлению технических заданий |
Остальные кнопки (📦 Установить, 💳 Оплата, 🛠 Техподдержка, 📚 Wiki, 🤝 Партнёрство) имеют system_prompt: null — используют промпт по умолчанию или выполняют действие без LLM.
Админ-панель → Telegram → выбрать бот → вкладка Action Buttons
Для каждой кнопки можно задать:
- LLM Backend (отдельный от основного)
- System Prompt (перекрывает основной промпт бота)
- LLM Params (temperature, max_tokens)
Облачные провайдеры могут иметь свой system prompt в расширенной конфигурации.
Поле config (JSON) таблицы cloud_llm_providers → ключ system_prompt.
# cloud_llm_service.py:598
self.system_prompt = provider_config.get("system_prompt", "")Админ-панель → LLM → Cloud Providers → выбрать провайдер → Config (JSON)
Этот промпт используется когда CloudLLMService вызывается напрямую (OpenAI-совместимый API /v1/chat/completions). В чате/виджетах/ботах он перекрывается промптом персоны или кастомным промптом канала.
┌─────────────────────────────────────────────────┐
│ LLM получает: │
│ │
│ system: {prompt} + {wiki_rag_context} │
│ user: сообщение пользователя │
│ history: предыдущие сообщения сессии │
└─────────────────────────────────────────────────┘
{prompt} определяется по приоритету:
┌──────────────────────────────────────────────────┐
│ 1. Кастомный промпт (виджет/бот/сессия) │
│ → widget_instances.system_prompt │
│ → bot_instances.system_prompt │
│ → whatsapp_instances.system_prompt │
│ → chat_sessions.system_prompt │
│ │
│ 2. Если пустой → промпт персоны │
│ → llm_presets.system_prompt (из БД) │
│ → SECRETARY_PERSONAS (fallback из кода) │
│ │
│ 3. Wiki RAG → ВСЕГДА в конец │
│ → wiki_rag.retrieve(сообщение, top_k=3) │
│ → "\n\n[Документация по теме:]\n..." │
└──────────────────────────────────────────────────┘
Виджет «Поддержка» с кастомным промптом + Wiki RAG:
Ты — консультант техподдержки компании X. Помогай клиентам
решать проблемы с установкой и настройкой продукта.
[Документация по теме:]
## Быстрый старт (Installation)
Docker (рекомендуется):
cp .env.docker.example .env && docker compose up -d
## Доступ к админ-панели (Installation)
URL: http://localhost:8002/admin/
Логин: admin / Пароль: admin
- Начните с персоны — отредактируйте промпт Анны/Марины под свой бизнес (LLM → Персоны)
- Для разных каналов — задайте кастомный промпт в настройках виджета/бота, если нужен другой стиль
-
Загрузите документацию — Wiki RAG автоматически дополнит любой промпт контекстом из ваших
.mdфайлов - Тестируйте — используйте чат в админке или тест-виджет для проверки поведения
- Не дублируйте — не копируйте информацию из wiki-pages в промпт; RAG сделает это автоматически