System prompt (системный промпт) — это «договор», который ты заключаешь с моделью до того, как пользователь напишет первое сообщение. Там ты задаёшь роль, тон, границы — всё, что должно оставаться неизменным на протяжении всего диалога. Для психотерапевтически-окрашенного бота это, пожалуй, самая важная часть системы.
В OpenAI API (как и в Anthropic) сообщения делятся на три типа:
system — инструкция для всей сессии. Туда кладёшь характер бота, ограничения, формат.user — что говорит пользователь.assistant — что отвечает модель. В истории диалога ты собираешь ответы бота, чтобы он «помнил» разговор.from pathlib import Path
from aiogram import Dispatcher, types
from openai import AsyncOpenAI
openai = AsyncOpenAI()
dp = Dispatcher()
SYSTEM = Path("prompts/system_prompt.txt").read_text(encoding="utf-8")
@dp.message()
async def on_message(msg: types.Message):
response = await openai.chat.completions.create(
model="gpt-5.4-mini",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": msg.text},
],
)
await msg.answer(response.choices[0].message.content)
Что здесь происходит: в system ты описываешь
характер бота — текст лежит в отдельном файле
prompts/system_prompt.txt, чтобы редактировать без правки
кода. В user — свежее сообщение пользователя из Telegram.
AsyncOpenAI делает запрос неблокирующим (бот не «висит»,
пока модель думает).
Когда пользователь пишет следующее сообщение и ты хочешь, чтобы бот
«помнил» прошлый диалог — собираешь историю из SQLite (у тебя
bot.db) и передаёшь в messages:
[system, user_1, assistant_1, user_2, ...].
Слабый:
Ты — добрый помощник. Помогай людям с их задачами.
Сильный:
Ты — Лиса. Ассистент по планированию дня для людей с СДВГ.
Аудитория: взрослые, которые пришли в момент перегруза или после срыва.
Стиль:
- Короткие сообщения (до 40 слов).
- Один вопрос или один микрошаг за раз.
- Не оценивай, не учи жизни, не сравнивай с «нормой».
Что делаешь:
- Помогаешь распаковать текущее состояние в одно ощущение.
- Предлагаешь один маленький следующий шаг.
- Ведёшь короткую запись итогов в конце сессии.
Что не делаешь:
- Не ставишь диагнозы, не назначаешь терапию, не даёшь медицинских
советов.
- Не заменяешь живого специалиста.
Если пользователь говорит о намерении причинить себе вред — сразу выдай
текст про кризисную линию (отдельный шаблон) и предложи позвонить.
Что здесь происходит: у бота появилось имя, чёткая аудитория, набор «что делать» и «чего не делать», и обработчик критичного случая. Модель теперь не будет дрейфовать в сторону «я твой терапевт» или «давай я тебе расскажу про pomodoro».
system_prompt.txt
или переменную в коде. Не захардкоживай в середину логики.