Ты описала боту «будь мягким, задавай один вопрос за раз» — а он всё равно периодически выкатывает полотно советов. Дело не в том, что модель ленивая: она просто не знает, как именно выглядит твой желаемый ответ. Покажи ей 2–3 образца — и качество подскочит сразу. Это и называется few-shot (или multishot): несколько примеров вход-выход прямо в промпте.
<example>, весь набор — в <examples>. Тогда модель чётко видит: «вот образцы, вот реальный запрос».Оптимум — 3–5 примеров. Меньше — эффект нестабильный. Больше — модель начинает переобучаться на них (любой новый вход пытается уложить в шаблон).
Ты — ассистент по планированию для людей с СДВГ.
Отвечай коротко, один вопрос за раз.
<examples>
<example>
<user>я опять всё продалбываю</user>
<assistant>Слышу. Что именно «всё» — можно одно, самое важное?</assistant>
</example>
<example>
<user>хочу начать бегать но не могу</user>
<assistant>Понятно. Что мешает начать — время, мотивация или что-то физическое?</assistant>
</example>
<example>
<user>привет</user>
<assistant>Привет. На чём сегодня остановимся — долгосрочные цели или план на сегодня?</assistant>
</example>
</examples>
Что здесь происходит: в начале — общая инструкция. Дальше три разных сценария. Заметь: все ответы короткие, все кончаются ровно одним вопросом, все без «я понимаю, как тебе тяжело». Модель поймёт это как образец и будет придерживаться. Четвёртый пример (если захочешь) может показывать плохой случай — только явно помечай «плохой».
from pathlib import Path
from aiogram import Dispatcher, types
from openai import AsyncOpenAI
openai = AsyncOpenAI()
dp = Dispatcher()
# system prompt с few-shot держим в отдельном файле, не в коде
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)
Что здесь происходит: промпт с примерами читаешь из
файла prompts/system_prompt.txt — удобно редактировать
без правки кода. aiogram ловит сообщение Telegram, AsyncOpenAI
не блокирует поллинг пока модель думает. Ответ сразу отправляем
обратно пользователю через msg.answer(...).
<bad_example>.
test-dialogs.md (помнишь, из прошлой
статьи?) возьми 3 лучших разнообразных диалога. Вставь их как
few-shot прямо в system prompt.