Habr AI montre comment ajouter la mémoire et le contexte à un chat LLM en Python avec Ollama et LiteLLM
Dans la troisième partie de la série sur le chat LLM en Python, l'auteur a ajouté l'essentiel pour que le dialogue soit plus que des requêtes isolées—l'historiq

Простой консольный чат с LLM перестаёт быть настоящим чатом, если модель видит только текущий вопрос. В новой части практического руководства по Python, Ollama и LiteLLM автор показывает самый важный шаг после базовой интеграции: как добавить историю сообщений и превратить цепочку отдельных запросов в связный диалог с контекстом. Проблема прошлой версии заключалась в том, что на каждом ходе программа отправляла модели только системную инструкцию и свежую реплику пользователя.
Для человека это выглядит почти незаметным ограничением, пока не появляются зависимые вопросы вроде «сделай его короче» или «добавь в него практику». Без предыдущих сообщений модель не знает, к чему относятся местоимения и уточнения, и поэтому может отвечать случайно или терять нить разговора. Именно это и отличает одноразовый вызов модели от диалогового интерфейса.
В разборе подчёркивается важная мысль, которую часто упрощают в обсуждениях LLM: у модели нет скрытой долговременной памяти между вызовами. Память в таком чате создаёт не сама Ollama и не LiteLLM, а приложение, которое хранит переписку и при каждом новом запросе заново отправляет её модели. В учебном примере для этого используется обычный Python-список conversation_history, куда по очереди записываются сообщения с ролями user и assistant.
System prompt при этом не хранится в истории, а добавляется отдельно при каждой сборке запроса. Архитектурно изменение выглядит небольшим, но меняет поведение программы радикально. Функция отправки запроса теперь принимает не только текущий user_message, но и историю.
Затем формируется список messages в строгом порядке: system, затем все прошлые реплики, затем новый вопрос пользователя. После ответа модели приложение сохраняет сразу обе стороны обмена — и вопрос, и ответ. Это не декоративная деталь: если записывать только пользовательские реплики, следующий запрос окажется неполным, потому что модель увидит, что вопрос уже задавался, но не увидит, как сама на него ответила.
Отдельно разбирается и ограничение истории. В примере введена константа MAX_HISTORY_MESSAGES = 6, а вспомогательная функция trim_history оставляет только последние шесть сообщений, то есть три последних обмена репликами. Для локального прототипа это практичный компромисс: история не растёт бесконечно, запросы не раздуваются, а модель всё ещё получает ближайший контекст.
Это хороший способ показать, что память в LLM-приложениях всегда приходится балансировать между качеством ответа, задержкой и стоимостью или нагрузкой, даже если речь идёт о локальной модели. В статье используется локальная конфигурация на базе Ollama, LiteLLM и модели qwen2.5:3b.
Такой стек удобен для обучения, потому что позволяет собрать рабочий чат без внешнего API и без сложной инфраструктуры. На примерах хорошо видно, как после добавления истории меняется реакция системы: запрос «расскажи подробнее про второй» начинает корректно ссылаться на предыдущий список, а фраза «сделай его короче» больше не воспринимается как отдельная абстрактная команда. То есть модель не становится умнее сама по себе, но приложение даёт ей тот контекст, который раньше просто терялся.
При этом ограничения версии тоже названы прямо. Вся история хранится только в оперативной памяти текущего запуска: если закрыть скрипт, диалог исчезнет. Для учебного CLI этого достаточно, но для Telegram-бота, веб-сервиса или клиентского помощника понадобится уже постоянное хранение — хотя бы в файле, SQLite или полноценной базе данных.
Следующим шагом обычно становятся также суммаризация длинных диалогов, фильтрация нерелевантных реплик и более гибкое управление контекстным окном. Главный вывод из этой части очень приземлённый и поэтому полезный: память в LLM-чате — это не отдельная магическая функция модели, а обычная ответственность кода вокруг неё. Несколько строк с conversation_history, правильный порядок messages и простое ограничение размера истории уже превращают демо-скрипт в основу для более реалистичного ассистента.
Для разработчиков это хороший пример того, что ценность чат-интерфейса часто рождается не в выборе самой модели, а в том, как аккуратно приложение собирает и передаёт контекст разговора.