Construindo um Chat Inteligente com IA Local: menos modelo, mais contexto
Quando pensamos em um chat com Inteligência Artificial para um sistema, normalmente imaginamos um modelo gigantesco respondendo qualquer pergunta. Na prática, o objetivo costuma ser muito mais específico.
Construindo um Chat Inteligente com IA Local: menos modelo, mais contexto
Quando pensamos em um chat com Inteligência Artificial para um sistema, normalmente imaginamos um modelo gigantesco respondendo qualquer pergunta. Na prática, o objetivo costuma ser muito mais específico.
Neste projeto, o desejo do cliente era simples:
- responder dúvidas sobre o funcionamento da plataforma;
- responder perguntas relacionadas aos próprios dados do usuário, como desafios ativos, ranking, atividades e progresso;
- entregar respostas rápidas, naturais e confiáveis.
Em vez de utilizar um modelo extremamente grande hospedado em um serviço externo, a solução foi construída utilizando gpt-oss executando localmente através do Ollama.
O resultado foi bastante satisfatório.
Isso demonstra que, quando o contexto é bem organizado, nem sempre é necessário utilizar o maior modelo disponível para oferecer uma excelente experiência ao usuário.
Link do projeto
Acesse: https://github.com/marcelo3macedo/simple-chatbot-with-ollama-and-apis
Modelos de IA não conhecem o seu sistema
Esse é um dos conceitos mais importantes ao desenvolver aplicações com IA.
Um modelo de linguagem não conhece:
- quem é o usuário;
- quais dados existem no banco;
- quais desafios ele está participando;
- seu ranking;
- suas atividades recentes;
- regras específicas da plataforma.
Sem essas informações, a IA responderá utilizando apenas o conhecimento adquirido durante o treinamento, produzindo respostas genéricas ou simplesmente incorretas.
A solução consiste em enriquecer cada solicitação enviada ao modelo com as informações necessárias para responder aquela pergunta.
Enriquecendo o contexto dinamicamente
Enviar todos os dados do sistema em toda requisição não é uma boa estratégia. Além de desperdiçar processamento, existe um fator importante:
modelos de IA possuem limites de contexto (tokens).
Quanto maior o prompt, maior o custo computacional e menor a quantidade de histórico disponível para a conversa.
Por isso, neste projeto foi adotada uma estratégia baseada em detecção de intenção. A cada mensagem recebida, o sistema primeiro identifica o que o usuário realmente deseja.
Exemplos:
- "Como estou no ranking?"
- "Quais desafios estão disponíveis?"
- "Como funciona a integração com o Strava?"
- "Quanto falta para completar meu desafio?"
Depois dessa classificação, apenas os módulos realmente necessários são carregados.
O fluxo funciona da seguinte forma:
Usuário
│
▼
Detecção de intenção
│
▼
Seleciona os módulos necessários
│
▼
Consulta APIs / banco de dados
│
▼
Monta o contexto
│
▼
Envia para o modelo
│
▼
Resposta ao usuário
Essa abordagem mantém o contexto pequeno, objetivo e altamente relevante.
Chamando APIs conforme a necessidade
Cada módulo pode representar uma fonte diferente de informação.
Por exemplo:
- perfil do usuário;
- desafios ativos;
- ranking;
- eventos disponíveis;
- histórico de atividades.
No projeto de demonstração esses módulos foram simulados através de arquivos locais, mas em produção eles podem consultar:
- APIs REST;
- bancos de dados;
- microsserviços;
- sistemas legados;
- qualquer outra fonte de dados.
O modelo recebe apenas o resultado dessas consultas, produzindo uma resposta contextualizada.
Melhorando a experiência com Cache e Streaming
Outro ponto importante foi o desempenho. Para evitar chamadas repetidas às mesmas fontes de dados, foi implementado cache para os módulos carregados.
Isso reduz o tempo de resposta e diminui a quantidade de consultas realizadas ao backend. Além disso, as respostas são enviadas utilizando streaming.
Em vez de esperar o texto inteiro ser gerado, o usuário já começa a visualizar a resposta imediatamente, proporcionando uma experiência muito mais natural.
O resultado
Mesmo utilizando um modelo relativamente pequeno executando localmente com Ollama, os resultados foram consistentes.
O sistema conseguiu:
- responder perguntas sobre a plataforma;
- responder perguntas específicas do usuário;
- utilizar apenas os dados necessários em cada interação;
- manter respostas rápidas;
- recusar perguntas fora do escopo quando necessário;
- resistir a tentativas de manipulação do prompt.
Tudo isso sem depender de um grande modelo hospedado na nuvem.
Exemplos de conversa
Consultando informações do usuário
Usuário
Como estou indo esse mês?
Assistente
Você acumulou 142,8 km em 18 atividades, com ritmo médio de 5:21 min/km. Atualmente está em 18º lugar entre 326 participantes.
Consultando um desafio
Usuário
Quanto falta para completar o Circuit Inverno 100K?
Assistente
Faltam 31,6 km para atingir sua meta. O desafio termina em 31/07 e você está atualmente na 12ª posição.
Descobrindo novos eventos
Usuário
Tem algum desafio novo chegando?
Assistente
Sim. Ainda em julho há os desafios Sprint 5K e Ultra Weekend. Em agosto começa o Agosto 150K, com medalha, camiseta e cupom como premiação.
Perguntas sobre a plataforma
Usuário
Como funciona a sincronização com o Strava?
Assistente
Após conectar sua conta, as atividades são sincronizadas automaticamente e contabilizadas nos desafios compatíveis da plataforma.
Conclusão
Uma das principais lições deste projeto é que a qualidade das respostas não depende exclusivamente do tamanho do modelo.
Quando a aplicação entrega ao modelo um contexto claro, organizado e altamente relevante, modelos menores podem produzir resultados surpreendentemente bons.
Mais importante do que utilizar o maior LLM disponível é construir uma arquitetura capaz de fornecer exatamente as informações que o modelo precisa em cada interação.
Nesse cenário, técnicas como detecção de intenção, carregamento dinâmico de contexto, chamadas de APIs, cache e streaming tornam-se tão importantes quanto o próprio modelo de IA.
Esse projeto demonstra justamente essa ideia: um modelo simples, alimentado com informações corretas no momento certo, pode oferecer uma experiência de conversa extremamente eficiente e natural.