O problema: você não sabe as palavras que o documento usa
O Tribunal de Contas dos Municípios de Goiás (TCM-GO) guarda um grande acervo de decisões, acórdãos e normas internas. Quem já buscou em um acervo assim conhece o problema. Você sabe o que procura, mas o documento diz de outro jeito, então a busca por palavras-chave não retorna nada, ou retorna centenas de resultados na ordem errada.
O ChatDoc é a ferramenta em que trabalhei para resolver isso. Ele permite que a equipe da instituição faça buscas semânticas em decisões e normas usando linguagem natural. Atuei em um time em parceria com o CEIA/UFG, passando por frontend, backend, arquitetura, machine learning e ciência de dados, e o projeto foi apresentado publicamente no AI.Brasil Experience.
Busca por palavras-chave versus busca semântica
A busca por palavras-chave pergunta: quais documentos contêm estes termos? A busca semântica pergunta: quais trechos significam algo próximo desta pergunta?
O jeito usual de fazer a segunda é com embeddings. Um modelo transforma cada trecho em um vetor de números, de modo que trechos de significado parecido fiquem próximos. A pergunta vira um vetor da mesma forma, e o sistema devolve os trechos mais próximos.
import numpy as np
def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
def top_passages(question_vec, passage_vecs, k=5):
scores = [cosine_similarity(question_vec, p) for p in passage_vecs]
return sorted(range(len(scores)), key=scores.__getitem__, reverse=True)[:k]O trecho é ilustrativo. Um sistema real adiciona um índice para ganhar velocidade, divide documentos longos em trechos e filtra por metadados como tipo de documento ou data. A ideia por baixo é a mesma.
Torná-lo confiável, não só rápido
Para uma instituição pública, uma resposta que não pode ser conferida é um risco. Alguns princípios que eu aplicaria a qualquer ferramenta de busca sobre documentos oficiais:
- Mostre sempre a fonte. Devolva o trecho e o documento de onde veio, para que a pessoa leia o texto original em vez de confiar em uma paráfrase.
- Divida os documentos pela estrutura natural. Decisões e normas têm artigos, seções e itens numerados. Cortar os trechos por essa estrutura mantém cada resultado autocontido.
- Combine significado com termos exatos. Texto jurídico é cheio de identificadores: números de processo, de artigo, nomes. Quem busca isso quer correspondência exata, então os melhores sistemas mantêm a busca por termos ao lado da semântica.
- Avalie com perguntas reais. Reúna as perguntas que a equipe de fato faz, registre qual trecho responde a cada uma e meça se o sistema o encontra. É a única forma honesta de comparar mudanças.
O que muda para quem usa
A mudança é sutil, mas real. Em vez de adivinhar o vocabulário do documento, a pessoa pode perguntar do jeito que perguntaria a um colega. Para o tribunal, isso significa menos tempo perdido caçando o trecho certo e uma barreira menor para quem não é especialista em como os documentos são redigidos.
Também explorei o ChatDoc junto com o GAIA, um modelo de linguagem em português brasileiro, como registrado no estudo de caso.



