Если речь идет о готовых llm-ках, то в системном промпте буквально прописывают все в принципе мыслимое и не мыслимое (на десятки тысяч токенов), и характер, и поведение, и типовые реплики с примерами далогов,.. примеры кстати для llm-ок очень хорошо настраивают на нужный лад.
Обязательно это делать именно в системном промпте а не в первом сообщении, потому что когда контекстное окно будет переполнено, многие системы инференса (но это настраивается) начинают сдвигать сообщения в диалоге 'вверх', удаляя старые сообщения что бы влезли новые, оставляя системный промпт не тронутым.
Чем длиннее диалог тем хуже будет качество ответов. llm-ки имеют идеологический баг (он же фича) они тем сильнее концентрируются на информации, чем ее больше в контекстном окне, воспринимая все вышесказанное как безусловный приказ подстраиваться под этот пример! Т.е. например если в какой то момент беседы у модели была большая вариативность в вариантах ответа и она свободно выбирала между условно какой цвет тебе нравится - выбирать любой, то в следующий раз, когда модели понадобится понять. какой у нее любимый цвет, вариативность исчезнет... это ведь хорошо, это работает как память? но беда в том что сообщения пользователя она может воспринимать точно так же (собственно основное обучение модели ведется безотносительно что в контекстном окне есть пользователь а что ассистент, и только последующими ухищрениями ее доводят до состояния - ты ассистент а остальные нет, но это вероятностный процесс и ничего не гарантирует). И стиль беседы и главное глюки, которые были допущены в процессе, все будет воспринято и приумножено. Это поведение может быть опасно для собеседника, особенно внушаемого и слабого, а это основные потребители виртуальных личностей ИИ. И наверное именно это является причиной последующих проблем (люди ломают свою реальную жизнь, побеседовав с чатботом, и есть случаи самоубийств).
С этим можно бороться (без гарантий само собой), если отдельными запросами (это называется 'отдельным агентом') параллельно основной беседы, будет выбираться важная информация, которую необходимо помнить, складируется в каком то удобном виде (например rag индекс) и подмешивается в последующие беседы по мере необходимости.
ключевые слова: summarization + memory store + retrieval
И да, это не решит проблем внушаемости пользователей и приченения им вреда, эта задача по сложнее, над которой все еще бьются топы.
Т.е. к примеру пользователь сказал что любит красный цвет, агент должен выделить это сообщение, оформить его в каком то виде (типа такая то дата, такой то пользователь, такая то информация) и снабжен индексом rag, в последствии каждое следующее сообщение должно искать в базе подходящий ответ (это не просто, ведь вопрос может не содержать в принципе нужную информацию, поэтому и индекс строить нужно творчески) и если оно найдено - добавлять его в беседу с пометкой - что это из памяти, прямо текстом - "из памяти - пользователь любит красный цвет, дата.", (из памяти может быть отдельным собеседником, например в шаблонах llama.cpp assistent и user это просто имена пользователей, вместо user можно вставить memory... но системный промпт должен это упомянуть, в идеале с примерами!
Чем больше контекст тем хуже качество нейросетей, открытые слабые хороши более менее на малых контекстах 8к..16к, топовые выходят на 64к, недавно гугл хвастались и независимые тесты показывали что они держат контекст на 128к, это очень много... да, заявлены миллионы токенов контекста, но качество обработки информации в нем стремительно падает с выходом за начальный размер контекста.
rag естественно не обязателен, для простых систем памятью может являться просто кусок текста, всегда подмешиваемый к беседе (тогда ломается кеширование kvcache конечно, но кого это волнует, после переполнения окна оно и так и так обрывается на системном промпте)