Skip to content

Prompts

ShaerWare edited this page Mar 3, 2026 · 4 revisions

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 эндпоинтам чата.

Защита от tool-call галлюцинаций

_finalize_prompt() автоматически добавляет _NO_TOOLS_SUFFIX к каждому промпту:

ВАЖНО: Ты — чат-бот без доступа к инструментам, файлам и командам.
НИКОГДА не генерируй вызовы функций, tool_use, function_calls,
filesystem, code execution или любые блоки вида `command { ... }`.
Отвечай только обычным текстом. Используй markdown для форматирования.

Это предотвращает зависание ответов при использовании Claude Code CLI bridge, когда модель галлюцинирует фейковые tool calls как текст.


1. Промпты персон (глобальные)

Основной system prompt, определяющий поведение секретаря.

Где хранятся

Место Файл Приоритет
БД (таблица llm_presets) db/models.pyLLMPreset Первый (основной)
Python-код (fallback) vllm_llm_service.py:160-210SECRETARY_PERSONAS Второй (если в БД пусто)
Python-код (seed) db/models.py:1110-1169DEFAULT_LLM_PRESETS Начальные данные при миграции

Промпт из БД всегда главнее. При первом запуске данные из DEFAULT_LLM_PRESETS копируются в таблицу llm_presets.

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

ID Имя Стиль Температура
anna Анна Дружелюбная, профессиональная 0.7
marina Марина Строгая, формальная 0.5

Где редактировать в админке

Админ-панель → LLM → Персоны (Personas)

  1. Выберите персону (Анна или Марина)
  2. Отредактируйте System Prompt
  3. Нажмите Сохранить

Изменения применяются мгновенно — промпт обновляется и в БД, и в runtime (если эта персона сейчас активна).

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

API

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 как "ай-ти"

РОЛЬ:
- Фильтруй спам и продажи
- Записывай сообщения для Артёма Юрьевича
- Будь профессиональной и дружелюбной

ПРИМЕРЫ:
- "Здравствуйте! Компания Шэарвэар Диджитал, помощник Артёма Юрьевича, Анна. Слушаю вас."
- "Принято. Я передам Артёму Юрьевичу, что вы звонили."
- "К сожалению, это предложение сейчас не актуально. Всего доброго."

2. Промпты каналов (per-instance)

Каждый виджет, 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". Помогай клиентам
выбрать букет, оформить доставку и ответить на вопросы о наличии.
Будь вежливой и предлагай сопутствующие товары (открытки, вазы).

3. Wiki RAG контекст (автоматический)

Добавляется в конец любого 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.


4. Промпты воронки продаж (Sales)

Telegram-боты с воронкой продаж используют отдельную систему промптов — по одному на каждый этап воронки.

Где хранятся

Место Файл
БД (таблица bot_agent_prompts) db/models.pyBotAgentPrompt
Python-код (seed) db/models.py:2139-2341DEFAULT_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

API

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}  # Удалить

5. Промпты Action Buttons (Telegram)

Каждая кнопка reply-клавиатуры Telegram-бота может иметь свой system prompt.

Где хранятся

Конфигурация action_buttons хранится в JSON-поле настроек бота (BotInstance.config). Дефолтные кнопки: db/models.py:916-1045DEFAULT_ACTION_BUTTONS.

Кнопки со своими промптами

Кнопка Промпт
❓ Задать вопрос AI-ассистент проекта, отвечает на вопросы об установке, настройке, функционале
📋 Составить ТЗ Специалист по составлению технических заданий

Остальные кнопки (📦 Установить, 💳 Оплата, 🛠 Техподдержка, 📚 Wiki, 🤝 Партнёрство) имеют system_prompt: null — используют промпт по умолчанию или выполняют действие без LLM.

Где редактировать в админке

Админ-панель → Telegram → выбрать бот → вкладка Action Buttons

Для каждой кнопки можно задать:

  • LLM Backend (отдельный от основного)
  • System Prompt (перекрывает основной промпт бота)
  • LLM Params (temperature, max_tokens)

6. Промпт облачного LLM провайдера

Облачные провайдеры могут иметь свой 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

Рекомендации

  1. Начните с персоны — отредактируйте промпт Анны/Марины под свой бизнес (LLM → Персоны)
  2. Для разных каналов — задайте кастомный промпт в настройках виджета/бота, если нужен другой стиль
  3. Загрузите документацию — Wiki RAG автоматически дополнит любой промпт контекстом из ваших .md файлов
  4. Тестируйте — используйте чат в админке или тест-виджет для проверки поведения
  5. Не дублируйте — не копируйте информацию из wiki-pages в промпт; RAG сделает это автоматически

Personas | Wiki-RAG

Clone this wiki locally