Habr AI mostra como adicionar memória e contexto a um chat LLM em Python com Ollama e LiteLLM
Na terceira parte da série sobre chat LLM em Python, o autor adicionou o essencial para transformar um diálogo em mais que requisições isoladas—o histórico…
Processado por IA de Habr AI; editado por Hamidun News
Um simples chat de console com um LLM deixa de ser um verdadeiro chat se o modelo vê apenas a pergunta atual. Em uma nova parte do guia prático de Python usando Ollama e LiteLLM, o autor mostra o passo mais importante após a integração básica: como adicionar histórico de mensagens e transformar uma sequência de requisições separadas em um diálogo coerente com contexto. O problema da versão anterior era que a cada turno, o programa enviava ao modelo apenas a instrução do sistema e uma resposta do usuário nova.
Para um humano, isso parece uma limitação quase imperceptível até que surgem perguntas dependentes como "torne mais curto" ou "adicione prática a isso". Sem mensagens anteriores, o modelo não sabe a quais pronomes e esclarecimentos se referem, e portanto pode responder aleatoriamente ou perder o fio da conversa. Exatamente isso é o que distingue uma chamada modelo única de uma interface de diálogo.
A análise enfatiza uma ideia importante que é frequentemente simplificada nas discussões sobre LLM: o modelo não possui memória oculta de longo prazo entre chamadas. A memória em tal chat não é criada pelo Ollama ou pelo LiteLLM em si, mas pela aplicação que armazena a conversa e a envia ao modelo novamente a cada nova requisição. No exemplo educacional, usa-se uma simples lista Python conversation_history para isso, onde mensagens com funções user e assistant são gravadas em sequência.
O prompt do sistema não é armazenado no histórico, mas adicionado separadamente cada vez que a requisição é montada. Arquiteturalmente, a mudança parece pequena, mas muda radicalmente o comportamento do programa. A função de envio de requisição agora recebe não apenas o user_message atual, mas também o histórico.
Depois forma-se uma lista de messages em ordem rigorosa: system, depois todas as respostas anteriores, depois a nova pergunta do usuário. Após a resposta do modelo, a aplicação salva ambos os lados da troca — tanto a pergunta quanto a resposta. Não é um detalhe decorativo: se você registrar apenas as respostas do usuário, a próxima requisição será incompleta porque o modelo verá que a pergunta já foi feita, mas não verá como respondeu a ela mesma.
Separadamente, a limitação do histórico também é discutida. No exemplo, uma constante MAX_HISTORY_MESSAGES = 6 é introduzida, e uma função auxiliar trim_history mantém apenas as últimas seis mensagens, ou seja, as últimas três trocas de mensagens. Para um protótipo local, este é um compromisso prático: o histórico não cresce infinitamente, as requisições não incham, e o modelo ainda obtém o contexto mais próximo.
Esta é uma boa forma de mostrar que a memória em aplicações LLM sempre precisa equilibrar entre qualidade de resposta, latência e custo ou carga, mesmo quando se trata de um modelo local. O artigo usa uma configuração local baseada em Ollama, LiteLLM e modelo qwen2.5:3b.
Esta stack é conveniente para aprendizado porque permite construir um chat funcionando sem API externa e sem infraestrutura complexa. Nos exemplos, é bem claro como a reação do sistema muda após adicionar histórico: a requisição "conte-me mais sobre o segundo" agora se refere corretamente à lista anterior, e a frase "torne mais curto" não é mais percebida como um comando abstrato separado. Ou seja, o modelo não fica mais inteligente por si só, mas a aplicação lhe dá o contexto que antes simplesmente se perdia.
Ao mesmo tempo, as limitações desta versão também são nomeadas diretamente. Todo o histórico é armazenado apenas na RAM da execução atual: se você fechar o script, o diálogo desaparece. Para um CLI educacional, isso é suficiente, mas para um bot do Telegram, serviço web ou assistente de cliente, seria necessário armazenamento permanente — pelo menos em um arquivo, SQLite ou banco de dados completo.
Os próximos passos geralmente incluem também sumarização de diálogos longos, filtragem de respostas irrelevantes e gerenciamento mais flexível da janela de contexto. A conclusão principal desta parte é muito pragmática e portanto útil: a memória em um chat LLM não é uma função mágica separada do modelo, mas a responsabilidade comum do código ao redor dele. Apenas algumas linhas com conversation_history, a ordem correta de messages e um simples limite de tamanho do histórico já transformam o script de demonstração na base para um assistente mais realista.
Para desenvolvedores, este é um bom exemplo de como o valor de uma interface de chat frequentemente nasce não na escolha do modelo em si, mas em como cuidadosamente a aplicação coleta e passa o contexto da conversa.
Quer parar de ler sobre IA e começar a usar?
AI News é um feed curado de notícias de IA. A Hamidun Academy ensina você a usar IA no trabalho.