O que você vê na busca de discursos
O plenário é também um microfone. O Cadeira Vazia ingere os discursos proferidos na Câmara e os torna pesquisáveis por sentido — não só por palavra exata, mas por ideia. Isso aparece em:
- Busca de discursos — você digita um tema (“escala 6x1”, “marco temporal”, “isenção de imposto”) e encontra as falas relevantes, mesmo quando o orador não usou exatamente essas palavras. Com um assistente de IA que lê os discursos encontrados e responde citando as fontes.
- Sobre o que a Câmara fala — o mapa dos temas discutidos no plenário, o tamanho de cada um e a evolução no tempo.
Esta página explica como o corpus é montado, como a busca encontra por sentido, e como os temas são classificados.
O corpus: só os discursos substantivos
Nem todo discurso é conteúdo. Boa parte do que a API entrega é processual — “Sr. Presidente, peço a palavra pela ordem…”, “encaminho o voto do meu partido…”. Esse ruído atrapalha uma busca por sentido.
Por isso o corpus indexável é filtrado aos discursos substantivos — os ligados ao debate e à decisão legislativa (Discussão, Encaminhamento de Votação, Como Líder, etc.). São cerca de 7,3 mil discursos de conteúdo real, separados das dezenas de milhares de falas processuais. A unidade é honesta: 1 documento = uma fala coesa de um orador, com seu autor, partido e data.
Como a busca encontra por sentido
A busca combina dois mecanismos, porque cada um acha o que o outro perde:
- Palavra-chave (BM25) — o método clássico: acha a sigla, o nome próprio, o termo exato. Se você busca “PL 2630”, ele acha onde está escrito “PL 2630”.
- Semântica (vetorial) — cada discurso é convertido em um vetor que captura seu significado. A sua busca também vira vetor, e a comparação acha falas próximas em sentido — mesmo sem a palavra exata. Buscar “demissão sem justa causa” pode trazer uma fala sobre “rescisão do contrato de trabalho”.
Os dois resultados são fundidos por Reciprocal Rank Fusion — cada documento ganha pontos pelo inverso da sua posição em cada ranking (1/(k + posição), com k=60), e a soma define o ranking final. É o método padrão da área para combinar rankings heterogêneos sem precisar calibrar pesos arbitrários. O resultado é mais robusto do que qualquer um isolado.
Detalhes que importam para a qualidade da busca por palavra-chave: removemos stopwords (de, a, o, que…) só no BM25 (no vetorial não — o modelo lida com elas); buscar entre aspas trata a frase como bloco exato; e o grifo dos termos no resultado é insensível a acento (você digita “saude”, ele grifa “saúde”).
Onde o cálculo roda
A busca é soberana: o índice é servido como arquivo do nosso object storage (R2), e a comparação roda no seu próprio navegador — nada é enviado a um servidor de busca de terceiros. O índice é enxuto por desenho: os vetores são guardados em meia-precisão (float16), com 512 dimensões (suficiente para busca; metade do tamanho de 1.024), e o texto completo não vai no índice — só um trecho, recortado ao redor do termo casado.
A única exceção técnica: transformar a sua pergunta em vetor exige um modelo de linguagem, então a consulta passa por uma função de borda leve (a chave da API fica no servidor, nunca exposta no navegador). Essa função também tem um reranker opcional — um segundo modelo que relê os melhores candidatos junto com a pergunta e refina a ordem (precisão fina sobre o recall rápido do embedding). Se a função falhar, a busca degrada graciosamente para o modo palavra-chave (que roda 100% no navegador, custo zero) — continua funcionando.
A classificação por tema
Cada discurso recebe um ou mais temas do vocabulário oficial do CEDI (Centro de Documentação e Informação da Câmara) — saúde, segurança, meio ambiente, etc. É a mesma taxonomia que a Câmara usa para indexar proposições, agora aplicada às falas.
A classificação usa um método deliberado, e vale explicar por que ele é melhor que a alternativa ingênua:
A primeira ideia seria comparar o vetor do discurso com o vetor de cada tema (similaridade de cosseno). Isso foi testado e reprovado — o cosseno tropeçava no ruído processual e errava o tema. A solução: pedir a um modelo de linguagem (Qwen-Plus) que leia o discurso e responda qual tema, devolvendo uma única letra (cada um dos 30 temas = uma letra). E aproveitamos os logprobs do modelo — a probabilidade real que ele atribui a cada tema candidato (os 5 mais prováveis), não um palpite inventado. O LLM lê através do ruído (“encaminhou a votação do requerimento…”) até o tema da proposição, que o cosseno não conseguia alcançar.
O resultado é uma distribuição honesta de temas por discurso, com a probabilidade calibrada de cada um. O painel de temas usa o tema dominante de cada fala (o mais provável) — intuitivo para “N discursos sobre X” — enquanto a distribuição completa fica disponível para análises que precisam de nuance.
O assistente de IA — com a sua própria chave
A busca tem um assistente de IA: você pergunta em linguagem natural (“o que falaram sobre reforma tributária?”) e ele lê os discursos relevantes e responde citando as fontes — cada afirmação ligada à fala que a sustenta.
A decisão de desenho importa: o assistente usa a sua própria chave de API (bring your own key). Você cola a chave uma vez (do seu provedor de IA), ela fica só no seu navegador, e o custo da conversa é seu — não nosso, e não de mais ninguém. Isso mantém o recurso gratuito e sustentável para o projeto, e dá a você controle total. A conversa é efêmera (não guardamos nada).
Limites honestos
- Cobertura do corpus. Indexamos os discursos substantivos disponíveis na API; falas muito antigas ou não-transcritas ficam de fora.
- A IA pode errar. Um modelo de linguagem pode interpretar mal ou sobre-afirmar. Por isso ele cita — a fala original é a fonte de verdade, não o resumo. E a busca por sentido prioriza relevância, não garante recuperar todas as falas sobre um tema; quando há uma contagem, ela é declarada como “pelo menos N”.
- Atribuição de autoria. Quando a fonte é ambígua sobre quem falou (homônimos — dois “Silva” diferentes), resolvemos por uma cascata de critérios determinísticos, em ordem de confiança: primeiro o nome exato batido contra múltiplos campos do cadastro; depois nome contido + um atributo desambiguador (UF, data) que isola um único candidato; depois similaridade de grafia com folga clara; e o que nenhum critério resolve é marcado como incerto — nunca chutado. Um teste automatizado trava o build se algum discurso acabar atribuído a duas pessoas distintas. Atribuir à pessoa errada seria pior que não atribuir.
Linkagem
- Busca de discursos · Sobre o que a Câmara fala — onde o método aparece.
- Votações — o que os deputados fazem depois de discursar.