В system prompt у тебя смешаны разные вещи: характер бота, примеры
диалогов, заметки о пользователе, инструкции. Когда модель читает
этот «суп», она иногда путает инструкции с примерами или считает
заметки пользователя частью системного правила. Лекарство простое —
обернуть каждый тип содержимого в свой XML-тег. Тег выглядит
как <user_notes>…</user_notes>: модель их
любит и чётко различает.
{{USER_NOTES}}), теги отделяют подставленное от инструкций.Ты — Лиса, помощник по планированию дня для людей с СДВГ.
<user_notes>
Текущая цель: «выйти на бег 3 раза в неделю»
Последний срыв: вторник — не лёг вовремя, просидел в телефоне.
Любит: котов, читать ночью.
</user_notes>
<rules>
- Короткие сообщения, до 40 слов.
- Один вопрос или один микрошаг за раз.
- Не давай медицинских советов.
</rules>
<examples>
<example>
<user>я опять всё продалбываю</user>
<assistant>Слышу. Что именно «всё» — можно одно, самое важное?</assistant>
</example>
</examples>
Сейчас пользователь напишет новое сообщение. Ответь в духе примеров
выше, опираясь на user_notes.
Что здесь происходит: заметки пользователя, правила и примеры
— каждое в своём теге. Модель чётко видит границы. Подставить заметки из
БД в <user_notes> — строка Python на
.format(user_notes=...).
Попроси модель класть результат в тег — и ты сможешь легко его извлечь:
Ответ пользователю положи внутри <reply>...</reply>
Внутренние заметки (что пометить в БД про пользователя) — в
<note_for_db>...</note_for_db>
Что здесь происходит: модель возвращает сразу два куска: один показываем пользователю, второй сохраняем в БД. В коде — простая регулярка или xml-парсинг.
import re
text = response.choices[0].message.content
reply = re.search(r"<reply>(.*?)</reply>", text, re.DOTALL).group(1).strip()
note = re.search(r"<note_for_db>(.*?)</note_for_db>", text, re.DOTALL)
note = note.group(1).strip() if note else None
<user_notes> всегда user_notes, не userNotes или notes.<examples> → <example>.<reply>,
<note_for_db>, <next_check_in>).
Тогда одним вызовом API можно и ответить пользователю, и записать
что-то в БД.
<user_notes>
через f-string в Python. Не пиши это руками каждый раз.