Completar palavras: o que funciona na prática
Completar palavras é basicamente um sistema que prevê qual texto vem a seguir com base no que você já digitou. Parece simples até você tentar implementar um que não erre feio todo o tempo. A maioria dos tutoriais começa explicando n-gramas e depois pula para transformers como se fosse óbvio. Vou explicar do jeito que eu descobri que funciona, não do jeito que os papers descrevem. O problema real não é a teoria. É que um sistema de completar palavras ingênuo falha miseravelmente em textos técnicos, nomes próprios e código. Eu gasthei semanas debuggando um autocompletar pra um projeto interno de documentação e o modelo simplesmente não conseguia lidar com variáveis como userSessionTimeoutMillis porque o tokenizer quebrava em CamelCase de formas imprevisíveis. A solução foi trocar o tokenizer padrão por um BPE customizado treinado especificamente no corpus do projeto, o que reduziu os erros de completamento em cerca de 70%.
Como implementar completar palavras de verdade
Comece entendendo a diferença entre completamento baseado em regras e completamento estatístico. Regras funcionam bem para listas fixas — tipo completer nomes de comandos em uma CLI. Para texto livre, você precisa de um modelo preditivo. O fluxo básico é: input do usuário -> tokenização -> embedding -> previsão do próximo token -> pós-processamento -> exibição. O passo que todo mundo subestima é o pré-processamento do corpus de treino. Eu viaava com a qualidade dos dados antes de me dar conta que modelos treinados em texto da internet pura geravam completamentos cheios de gírias e erros de pontuação quando aplicados a documentos formais. Filtragem por domínio e normalização de whitespace fizeram mais diferença do que qualquer ajuste de hiperparâmetro.
Para quem quer algo funcional rápido, uma abordagem prática é usar um modelo leve do tipo CharRNN ou um Transformer pequeno (tipo 125M parâmetros) fine-tunado no seu domínio específico. Isso roda em CPU decente e dá latência de completamento na casa dos 50-150ms, o que é aceitável para interação humana. Modelos maiores como GPT-2 completo dão qualidade superior mas exigem GPU e a latência sobe pra 300ms+, o que começa a parecer lento quando você tá digitando.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Pegadinhas que ninguém conta
A primeira é sobre contexto. Completar palavras funciona mal quando o contexto disponível é muito curto. Se o usuário digitou só "pro", o modelo não tem como saber se é "programa", "projeto", "promover" ou "proibido". Eu configurei um limiar mínimo de 4 caracteres antes de ativar o autocompletar e a taxa de frustração do usuário caiu bastante. Também ajuda manter um buffer de histórico — as duas últimas palavras digitadas já dão uma direção melhor pro modelo. A segunda pegadinha é mais sutil: o efeito de confirmação. Quando você mostra sugestões de completamento, os usuários tendem a aceitar a primeira opção mesmo quando está errada. Eu fiz um teste A/B onde alguns usuários viam três opções em vez de uma e a taxa de aceitação caindo 15%, mas a precisão geral subiu porque as pessoas escolhiam melhor. Se o seu sistema mostra completamento, mostre pelo menos duas alternativas.
O problema do overfitting de domínio também merece atenção. Um modelo treinado em textos médicos vai completar muito bem termos técnicos da área mas vai travar em linguagem cotidiana. Se o seu sistema atende múltiplos domínios, considere manter modelos separados por domínio e fazer routing baseado no contexto atual. Isso adiciona complexidade mas evita que um modelo genérico medie entre todos os estilos e fique ruim em tudo.
Implementação prática
Se você quer montar algo rápido, a.stack mais acessível hoje usa Python com transformers da Hugging Face. Carrega um modelo como gpt2 ou mistral, passa o texto atual, e pede o próximo token com max_new_tokens=1. O código leva menos de 30 linhas. Mas atenção: o GPT-2 original foi treinado em inglês. Para português, use modelos como neilnaveen/masked-language-model-portuguese ou o Chronos/gpt2-portuguese, que dão resultados bem melhores em PT-BR. Um detalhe importante na hora de rodar: ative do_sample=False e top_k=50 top_p=0.95 se quiser completamentos mais determinísticos. Se ligar o sampling muito agressivo, o modelo começa a gerar completamentos criativos demais — às vezes corretos gramaticalmente mas semanticamente fora do contexto. Eu aprendi isso na marra quando um sistema de completar palavras pra corretores de texto sugeriu "ele disse que iria ao mercado comprar pão" como completamento de "ele disse que iria ao...", o que era gramaticalmente perfeito mas completamente fora do tópico da frase original.
Quando não usar completar palavras
Existem cenários onde autocompletar piora a experiência em vez de ajudar. Textos altamente estruturados como JSON, XML ou logs de servidor se beneficiam mais de validação sintática do que de previsão estatística. Um parser que detecta erros de sintaxe em tempo real é mais útil do que um modelo sugerindo o próximo token provável. Também não recomendo completar palavras em interfaces onde precisão absoluta é crítica — sistemas médicos, controle de tráfego aéreo, contratos jurídicos. Nesses casos, o risco de um completamento errado ser aceito sem revisão é alto demais. O custo computacional também pode não valer a pena. Se o seu cenário tem apenas quelques dezenas de comandos ou opções fixas, uma tabela hash simples com busca por prefixo resolve mais rápido, consome zero memória adicional e não precisa de GPU. Eu vi equipe inteira gastar semanas implementando um sistema neural de completar palavras num dashboard interno quando uma simple autocomplete baseada em Trie resolvia o problema em um final de semana.