DSDiego Salles
← Todos os projetos
Case secundárioProduçãoOnlineProjeto privado

Feedback Telemarketing

Avaliação de qualidade de atendimento com IA sobre gravações de PABX

Plataforma que coleta atendimentos de voz do Contact Center Vonix, transcreve as gravações com diarização e avalia a qualidade da tratativa com IA, usando métodos operacionais como base de conhecimento.

Node.js 22TypeScriptExpressPostgreSQL 16MinIOQdrantReact 18ViteDocker ComposeGemini File Searchwhisper.cpp
01

Visão geral

O Feedback Telemarketing é uma aplicação full-stack que conecta a operação de um contact center à avaliação automatizada de qualidade. O backend sincroniza atendimentos de voz da API da Vonix, normaliza os campos, deduplica registros e baixa as gravações para um bucket privado no MinIO. Cada áudio é transcrito por um worker externo de whisper.cpp com diarização, gerando texto por falante e segmentos com timestamps. A partir da transcrição, o sistema consulta uma base de métodos operacionais indexada no File Search do Gemini, identifica o produto ou serviço tratado e atribui notas de 1 a 5 em seis dimensões: primeira resposta, qualidade, compatibilidade, resolução, acompanhamento e inovação. O resultado inclui justificativas, resumo, sugestões de melhoria e as fontes do RAG usadas como evidência. O painel web em React consolida indicadores por período, fila e agente, permite filtrar atendimentos, exportar CSV e acompanhar o histórico de sincronizações, transcrições e avaliações. Tudo roda em Docker Compose com PostgreSQL, MinIO e Qdrant, e as credenciais sensíveis ficam cifradas em um cofre AES-256-GCM no próprio sistema.

A dor

Avaliar a qualidade de atendimentos de voz em um contact center costuma ser manual, amostral e inconsistente entre avaliadores. As gravações ficam dispersas, a transcrição é trabalhosa e os critérios de avaliação raramente são aplicados com a mesma régua para todos os agentes.

A solução

O sistema automatiza a coleta, a transcrição e a avaliação dos atendimentos, aplicando um modelo de notas com pesos fixos e usando os métodos operacionais da empresa como fonte da verdade. O resultado é uma avaliação rastreável, com justificativas e fontes, disponível em painel e por atendimento.

02

Abordagem de engenharia

01

Ingestão e normalização dos atendimentos

A sincronização pagina a API da Vonix, normaliza campos com nomes alternativos em português e inglês e deduplica por ID. Falhas de áudio não interrompem a importação: o registro fica com status de erro e é reprocessado depois.

02

Armazenamento de áudio e transcrição

As gravações são baixadas para um bucket privado no MinIO e servidas com suporte a Range. A transcrição é feita por um worker externo de whisper.cpp com diarização, e o resultado inclui segmentos, falantes e indicação de revisão.

03

Base de conhecimento operacional

Documentos em PDF, DOCX, PPTX, TXT, MD, HTML, CSV e JSON são enviados a um File Search Store do Gemini, com operações de adicionar, atualizar, apagar e reindexar. O store é criado automaticamente no primeiro documento.

04

Avaliação com IA e notas por dimensão

A IA consulta os métodos no RAG, identifica o produto e retorna notas de 1 a 5 em seis dimensões, com pesos fixos para a nota geral. Cada avaliação guarda justificativas, resumo, sugestões e as fontes usadas como grounding.

05

Operação e recuperação de estado

Na inicialização, o backend recupera transcrições, avaliações e backfills interrompidos, garantindo que jobs em andamento não fiquem órfãos. O scheduler controla a sincronização periódica e o encerramento é tratado por sinais.

03

O que o projeto entrega

  • Sincronização incremental com sobreposição de 10 minutos e limite de páginas configurável
  • Transcrição com diarização e papéis por falante
  • Avaliação com RAG sobre métodos operacionais e notas ponderadas
  • Cofre AES-256-GCM para credenciais, sem chaves em arquivo de ambiente
  • Modo demonstração com atendimentos e áudios gerados
04

Arquitetura e desafios técnicos

Feedback Telemarketing: ingestão, transcrição e avaliação com IA

Plataforma full-stack que sincroniza atendimentos de voz do Contact Center Vonix, armazena áudios em MinIO, transcreve com whisper.cpp e avalia a qualidade da tratativa com Gemini File Search, expondo indicadores em um painel React.

Renderizando diagrama...

Desafios técnicos

Ingestão resiliente com falhas parciais de áudio

Contexto

A sincronização com a API da Vonix pode encontrar registros cujo áudio não está disponível ou falha no download, e uma importação monolítica interromperia todo o lote.

Decisão

Tratar cada atendimento de forma independente: normalizar, deduplicar por ID e marcar falhas de áudio com status de erro para reprocessamento posterior, sem interromper a importação.

Trade-off

A importação conclui com registros em estado de erro que exigem reprocessamento e monitoramento, mas garante que um áudio problemático não bloqueie os demais e mantém a operação fluindo.

Transcrição externa com whisper.cpp em vez de transcrição embutida

Contexto

A transcrição com diarização é custosa em CPU/GPU e precisa gerar texto por falante e segmentos com timestamps para alimentar a avaliação.

Decisão

Delegar a transcrição a um worker externo de whisper.cpp com diarização, mantendo o backend responsável por orquestrar jobs e persistir segmentos e falantes.

Trade-off

Adiciona um serviço externo e uma etapa de orquestração de jobs, mas isola o custo computacional da API e permite evoluir o worker sem acoplar o backend ao modelo de transcrição.

RAG com Gemini File Search e índice vetorial em Qdrant

Contexto

A avaliação precisa consultar métodos operacionais internos em múltiplos formatos e usar as fontes como evidência rastreável das notas.

Decisão

Indexar documentos em um File Search Store do Gemini, com operações de adicionar, atualizar, apagar e reindexar, e manter um índice vetorial em Qdrant para busca.

Trade-off

Cria dependência de um serviço externo de IA e de um índice vetorial adicional, mas entrega grounding rastreável e permite atualizar a base de conhecimento sem reescrever regras de avaliação.

Recuperação de jobs interrompidos na inicialização

Contexto

Transcrições, avaliações e backfills podem ficar órfãos se o processo for encerrado no meio de um job, deixando registros sem estado final.

Decisão

Na inicialização, o backend varre o estado persistido e retoma jobs interrompidos, além de tratar o encerramento por sinais para finalizar o que estiver em andamento.

Trade-off

A inicialização fica mais lenta e exige que o estado dos jobs seja persistido de forma consistente, mas evita registros órfãos e retrabalho manual após reinícios.

Credenciais cifradas em cofre local com chave-mestra separada

Contexto

O sistema precisa armazenar credenciais sensíveis da Vonix e do Gemini sem expô-las em variáveis de ambiente ou no banco de dados em texto claro.

Decisão

Cifrar os segredos com AES-256-GCM em um cofre no próprio sistema, mantendo a chave-mestra em um volume separado do restante dos dados.

Trade-off

A gestão da chave-mestra passa a ser uma responsabilidade operacional crítica, mas reduz a superfície de exposição de segredos e mantém o controle local sem depender de um serviço externo de cofre.

05

Resultados

Atendimentos transcritos e avaliados com notas por dimensão e justificativas rastreáveis.

Avaliação automatizada

Cada avaliação registra as fontes do RAG usadas como evidência da tratativa.

Rastreabilidade

Recuperação de jobs interrompidos na inicialização e reprocessamento de falhas de áudio.

Operação resiliente

Segredos cifrados com AES-256-GCM e chave-mestra em volume separado.

Segurança de credenciais

06

Stack

Node.js 22TypeScriptExpressPostgreSQL 16MinIOQdrantReact 18ViteDocker ComposeGemini File Searchwhisper.cpp
07

Temas

#contact center#qualidade de atendimento#transcrição#RAG#Gemini#whisper.cpp#TypeScript#Docker

Vamos conversar sobre a próxima oportunidade.

Infraestrutura, IA aplicada, mobile/edge ou integrações críticas — se o desafio exige profundidade, me conte o contexto.