estudo de caso  /  acessibilidade + ia

EntreSentidos

Bulas de remédio que se escutam e respondem.

Quem é cego ou tem baixa visão não consegue ler a bula. O EntreSentidos resolve isso: a pessoa encosta o celular na embalagem (NFC) ou aponta para o QR Code e pergunta, por voz ou texto, o que precisa saber. A resposta vem só da bula oficial e passa por uma verificação antes de ser lida em voz alta.

papel
Autor: API, app e infraestrutura
período
2026, em andamento
status
API em produção
deploy
CI com testes → VM com Docker
01

O problema

A bula é a fonte oficial de como tomar um remédio, mas ela vem em letra miúda e num papel dobrado. Para quem não enxerga, isso significa depender de outra pessoa para saber a dose, as contraindicações ou o que fazer numa superdosagem.

Jogar a bula num chatbot genérico não resolve, porque ele pode inventar. Em conteúdo médico, uma dose errada dita com confiança é pior do que nenhuma resposta. O desafio era usar IA para dar uma resposta natural sem nunca sair do que a bula diz.

02

Como funciona

  1. IdentificaçãoNFC ou QR Code levam a bulas://m/CÓDIGO. Também resolve GTIN e registro Anvisa.
  2. Fala → textoTranscrição com Whisper, rodando local no servidor (faster-whisper).
  3. RecuperaçãoBM25 sobre as 9 seções da bula. Sem trecho relevante, responde "não encontrei" sem chamar o LLM.
  4. GeraçãoClaude recebe só os trechos e devolve JSON estruturado, podendo recusar.
  5. VerificaçãoCada frase e cada número com unidade precisa estar nos trechos. Se reprovar, entra uma resposta segura.

A verificação é fail-closed. Se o LLM ou o verificador estiverem fora do ar, ou se a resposta reprovar duas vezes, o sistema devolve o trecho literal da bula. Perguntas de emergência ("tomei demais") pulam o pipeline e informam o SAMU 192 e o Disque-Intoxicação antes de qualquer outra coisa.

03

Teste ao vivo

Esta caixa chama a API de produção de verdade. O medicamento é fictício de propósito (Demonstrina 500 mg), para não reproduzir bula real fora da fonte oficial. Experimente uma pergunta que a bula não responde, ou uma emergência.

POST /api/v1/chat  ·  Demonstrina 500 mg (DEMO)produção

Neste servidor a API roda em modo extrativo, sem chave do Claude: ela responde com as frases literais da bula que melhor cobrem a pergunta. O modo generativo usa o mesmo pipeline e é ativado só por configuração.

04

Decisões técnicas

Verificar números junto com a unidade

"2 comprimidos" não passa só porque a bula diz "2 doses" em outro trecho. Cada número é ligado à sua unidade, e uma negação invertida reprova a frase.

BM25 antes de embeddings

A busca léxica é previsível e fácil de auditar. Quando ela falha, falha do jeito seguro: "não encontrei na bula". A busca semântica fica para depois.

Bulas versionadas por hash

Reimportar a mesma bula não duplica nada. Se o texto mudou, nasce a versão N+1 e a anterior fica guardada. Cada resposta informa a versão usada.

Importação de PDFs da Anvisa

O parser reconhece bula de paciente, bula de profissional e o formato antigo, e trata PDFs em duas colunas e títulos hifenizados.

Acessibilidade como requisito

Botões de pelo menos 64dp, alto contraste automático, rótulos para TalkBack e VoiceOver, comandos de voz e interrupção da leitura a qualquer momento.

Deploy com o mínimo de privilégio

Cada push na main roda os testes no GitHub Actions. O deploy entra na VM com uma chave que só pode executar o script de deploy, atrás de um Caddy com HTTPS automático.

05

Limitações e próximos passos

  • Teste com usuários cegos reais: é o passo mais importante que ainda falta.
  • Tabelas de dose dos PDFs viram texto corrido na importação. Cada bula importada precisa de revisão humana na seção de uso.
  • Busca semântica, para perguntas com palavras muito diferentes das usadas na bula.
  • Leitura de NFC com o app fechado no iOS, que exige Universal Links no domínio próprio.