Gyovana Santos do Prado

Gyovana Santos do Prado

Engenheira de Dados & IA — Human in the Loop

São Paulo, Brasil

Engenheira de Dados & IA com 9 anos em tecnologia, focada em construir pipelines de dados escaláveis e desenhar sistemas de IA onde o julgamento humano permanece no circuito. Especialista em dbt, BigQuery e GCP, com experiência prática construindo soluções baseadas em Claude — skills customizadas, servidores MCP e integrações de API — para clientes enterprise. À vontade tanto com stakeholders técnicos quanto de negócio, e reconhecida por liderar treinamentos internos e democratização de dados.

6 repositórios0 seguidores0 estrelas

Agora

atualizado 13 jul 2026

Feed

  1. Entregue

    Entregou o primeiro marco de uma API de geração de insights com LLM para um cliente enterprise. O sistema recebe dados de pesquisa estruturados, atomiza-os em fatos fundamentados e produz briefings em camadas — com um guardrail que exige que cada afirmação rastreie sua fonte. Validado com dados reais: 29 insights gerados com 100% de correção de grounding e zero falhas de guardrail.

    Resultado: 29 insights gerados em dados reais de pesquisa; 100% de correção de grounding; 0 falhas de guardrail.

    Detalhe técnico

    Construído em FastAPI com Pydantic AI para parsing. Pipeline central: extração de fatos → atomização multi-pass → geração de documentos (padrão H3). Guardrail de grounding rejeita qualquer afirmação sem proveniência direta de registro. Arquitetura multi-provider (OpenAI e Anthropic validados de forma intercambiável via model-as-config). Sequenciamento de build ciente de DAG: cards em paralelo onde dependências permitiam, sequencial onde schemas precisavam estabilizar primeiro. Fechou empiricamente uma questão arquitetural — cálculo de fatos sob demanda foi descartado após zero ocorrências em runs com dados reais, evitando abstração prematura. Seis PRs empilhados estruturados para sequência de merge limpa.

    fastapillm-pipelinepydantic-aigroundinginsights-generation
  2. Decisão

    Ao extrair insights estruturados de milhares de respostas abertas sobre um app mobile de consumo, a primeira pergunta não era qual modelo usar — mas qual *estratégia* de extração usar. Três abordagens foram comparadas ponta a ponta: um pipeline de claims atômicos em dois estágios, uma abordagem de documento direto e um híbrido com etapa de rascunho preliminar. A estratégia vencedora não foi a mais sofisticada.

    Resultado: H3 selecionado como estratégia padrão de extração: menor custo ($0,0216/doc), zero violações de altitude, 100% de grounding em todos os documentos de teste.

    Detalhe técnico

    Spike comparando três fluxos de extração LLM para dados qualitativos (respostas abertas de pesquisa de satisfação) usando Pydantic AI e prompts Jinja via ai-prompter:

    • H3 (dois estágios: fatos → claims atômicos → síntese): $0,0216/doc, 0 violações de altitude, 100% de grounding
    • H1+doc_separado: $0,0296/doc, 1 violação, 71% de cobertura de famílias de fatos
    • H3+predraft (H3 + rascunho prévio): $0,0348/doc, 3 violações, 60% mais claims mas com mais ruído

    Trade-off central: H3+predraft gerou 60% mais claims que H3, mas introduziu 3 'violações de altitude' (generalizações sem suporte nos dados). H1 teve maior cobertura de fatos (71% vs 57% de famílias) mas custo maior e uma violação. H3 venceu em todos os critérios ponderados.

    O pipeline inclui um guard determinístico de PII (emails, telefones, CPF, handles) rodando antes de qualquer chamada LLM — 20% das respostas reais continham PII, tornando esse passo obrigatório. Um validador quote_grounding confirma que cada claim gerado rastreia até uma citação verbatim, tornando o pipeline auditável. O fact index cobre 67 fatos em 7 famílias (boolean, categorical, cooccurrence, cross_tab, matrix, multi_select, persona).

    llmpydantic-aiprompt-engineeringqualitative-analysisdata-pipeline
  3. Entregue

    Construí um segundo parser LLM-powered para uma plataforma de análise de pesquisas — esse converte descrições em texto livre de personas de audiência em uma spec estruturada e validada. A restrição interessante: a fábrica de clustering downstream verifica configuração de features usando `'key' in dict` (presença de chave), não `dict.get('key')` (verificação de valor). Essa distinção forçou uma escolha de design de modelo não-óbvia.

    Resultado: 16 testes passando (2 skippados aguardando API key), ruff limpo — parser, modelos, rota e suíte de testes entregues como uma unidade coesa.

    Detalhe técnico

    O parser usa Pydantic AI com output_type=PersonaSpec, e PersonaSpec contém objetos PersonaVariable com campos opcionais order e scale. A escolha de design: ambos os campos usam Optional[list] = None em vez de list[str] = []. Razão: a fábrica downstream chama model_dump(exclude_none=True) e depois verifica 'order' in var — uma lista vazia [] seria falsy em checagem booleana mas truthy para in, quebrando silenciosamente o tratamento de variáveis ordinais. Com defaults None, exclude_none=True remove as chaves completamente, e 'order' in var retorna corretamente False para variáveis categóricas. A suíte de testes usa TestModel(custom_output_args={...}) do Pydantic AI para substituir o LLM por output estruturado determinístico — sem chamadas de API no CI. Um teste (test_parse_persona_spec_model_dump_exclui_nulos) documenta explicitamente o invariante de ausência de chave. Stack: Pydantic AI, FastAPI, Pydantic v2, pytest.

    pydantic-aillm-parserspythonfastapiapi-design
  4. Problema resolvido

    Escrevi uma migration reversível para um novo milestone de modelo de dados. No processo, descobri que compartilhar um namespace SurrealDB entre dois projetos locais causava corrupção silenciosa do tracker de migrations — a tabela de histórico acumulava entradas fantasma de outro projeto, quebrando o rollback. Isolei a causa raiz, limpei o estado manualmente e documentei o padrão de isolamento.

    Resultado: Migration aplicada e revertida sem erros: ruff limpo, 10/10 testes passando, tipos verificados via INFO FOR TABLE.

    Detalhe técnico

    SurrealDB v3, Python, uv. A migration cria novas tabelas SCHEMAFULL e re-tipa campos existentes. O ponto crítico: re-tipar um campo em uma tabela SCHEMAFULL pré-existente exige DEFINE FIELD OVERWRITE — um DEFINE FIELD simples pode não fazer nada ou lançar erro dependendo da versão do SurrealDB. O down migration reverte na ordem inversa de dependências e remove explicitamente sub-campos de array para evitar campos fantasma residuais.

    Bug de ambiente: dois projetos compartilhando o mesmo namespace/database no SurrealDB faziam suas tabelas de tracking de migrations colidirem. O runner do outro projeto havia inserido linhas na tabela compartilhada; ao tentar rollback, o runner não encontrava os arquivos de migration correspondentes no diretório do projeto atual e abortava. Correção imediata: deleção manual dos registros contaminantes. Solução definitiva: cada projeto usa seu próprio par namespace/database em dev local.

    surrealdbschema-migrationdatabasedev-environment
  5. Decisão

    Projetar uma API que transforma dados de pesquisa survey em insights de negócio trouxe uma questão central: como tornar achados gerados por IA confiáveis o suficiente para agir? Em vez de debater no abstrato, medimos primeiro — e só então decidimos. A resposta combinou duas estratégias de verificação independentes que mantêm a IA accountable aos dados originais em cada etapa, sem adicionar infraestrutura de embedding nem descartar as runs que falham.

    Detalhe técnico

    Sessão de design arquitetural para um serviço FastAPI async (Python / Pydantic AI / SurrealDB) que processa dados de pesquisa survey em insights estruturados e auditáveis — substituindo um pipeline legado baseado em claude -p no shell.

    Medir antes de decidir: Antes de comprometer com um pipeline de retrieval/seleção, escrevemos um script para consultar o SurrealDB local e medir o fact space persistido. Resultado: 12–14 k tokens (6% da janela de contexto). Nenhum pipeline se justificava até esse sintoma aparecer em produção — um número concreto fechou um debate que seria puramente especulativo.

    Regime híbrido determinístico/LLM: O núcleo de insights foi dividido em dois regimes com invariantes distintos:

    • Questões fechadas (Likert, NPS, múltipla escolha): Python puro, completamente determinístico, testável com golden files — LLM nunca toca esse caminho.
    • Questões abertas/qualitativas: LLM identifica temas e padrões de frequência; um guardrail de quote-grounding (substring match verbatim contra o CSV fonte) valida cada afirmação antes da persistência. Alucinação capturada sem embeddings — custo zero, 100% auditável. O invariante: todo fato qualitativo precisa citar um fragmento rastreável da fonte.

    Falha de guardrail como sinal de avaliação: O output validator do Pydantic AI faz 1 retry em falha; falhas persistentes são gravadas com flag guardrail_failed em vez de descartadas. Justificativa: nas primeiras runs em produção, a taxa de falha é o sinal de qualidade mais valioso — descartar silenciosamente os outputs que falham esconde exatamente o que se precisa aprender.

    Fact space recomputado por run: Cada run reconstrói seu próprio fact space a partir dos specs da fonte e o persiste de forma independente. Trade-off: computação redundante vs. reprodutibilidade total — qualquer run pode ser reauditada em isolamento, independente de mudanças futuras no schema ou nos dados.

    architecturepydantic-aillm-guardrailssurvey-analysisapi-design
  6. EntregueParte de Portfólio Vivo

    Entreguei o motor por trás deste exato site: um portfólio bilíngue cujo conteúdo é curado automaticamente a partir de sessões reais de trabalho. Um hook de fim de sessão avalia cada sessão do Claude Code contra um rubric de relevância; quando algo passa na régua, é escrito em dois idiomas, sanitizado e commitado como rascunho que publica com um comando.

    Resultado: O site que você está lendo foi produzido por esse pipeline.

    Detalhe técnico

    Três componentes: um site estático em Astro (i18n EN/PT, feed/projetos/CV renderizados de JSON no build), um servidor MCP em Python expondo cinco tools (log_activity, review_and_publish, add_project, update_now, get_portfolio_state) que escrevem pela API de Contents do GitHub, e um hook de Stop que embute o rubric verbatim — mudar critérios não exige mudar código. A validação tem três camadas: JSON Schema, completude bilíngue (tradução faltando quebra o build, de propósito) e uma denylist local como retaguarda determinística atrás da sanitização por categoria do LLM.

    astromcppythonclaude-codei18n
  7. AprendizadoParte de Portfólio Vivo

    Primeiro uso em produção de scroll-driven animations do CSS: a linha do tempo deste feed se desenha conforme você rola, com zero JavaScript. O conceito de movimento do site — pulso, traço, respiração — precisava comunicar 'vivo' sem nenhuma biblioteca de animação.

    Resultado: A linha do feed se desenha no scroll em ~20 linhas de CSS; zero JS, zero bibliotecas.

    Detalhe técnico

    animation-timeline: view() mapeia o progresso de uma animação à posição do elemento no viewport — a borda da linha do tempo escala de 0 à altura total conforme cada entrada a cruza. Embrulhado em @supports para que navegadores sem suporte vejam só a borda estática, e desligado sob prefers-reduced-motion. O resto do sistema de movimento é um IntersectionObserver inline de ~30 linhas (reveal escalonado) atrás de uma classe html.js, então uma falha de JavaScript nunca deixa conteúdo escondido.

    cssscroll-driven-animationsprogressive-enhancement
  8. Problema resolvidoParte de Rotas-SP — rotas de transporte que pensam além do óbvio

    Precisava de reranqueamento de rotas com IA para um projeto pessoal de planejamento de transporte, mas sem chave de API — apenas uma assinatura Claude Code. Construí uma integração LLM de custo zero chamando o CLI do Claude em modo headless via subprocess. Deparei com um bug não óbvio: os hooks globais de sessão eram herdados pelo subprocess, injetando texto de avaliação na saída JSON e corrompendo silenciosamente cada resposta. Rastreei a corrupção, encontrei a causa raiz e corrigi com uma única flag.

    Resultado: Milestone M4 concluído: reranqueamento com IA funcionando sem chave de API; 57 testes verdes, 6/6 saídas de ranking válidas.

    Detalhe técnico
    • Stack: Python + subprocess, Claude Code CLI (claude -p --output-format json)
    • Adicionado provider ROTAS_LLM_PROVIDER=claude-code ao lado do caminho baseado em API existente, para coexistência
    • Causa raiz: hooks globais de Stop (usados para avaliação de sessão do portfólio) eram herdados pelo processo filho do CLI headless, acrescentando a saída de avaliação ao campo result e quebrando o parsing JSON
    • Correção: --settings '{"disableAllHooks": true}' passado na chamada do subprocess
    • Parser JSON tornado tolerante a prosa markdown ao redor, como medida defensiva contra deriva de prompt
    • Trade-off aceito: ~95s por consulta vs 5-10s com chave de API real — custo zero supera a latência para um protótipo pessoal; UX exibe aviso de 'IA lenta'
    • Critérios de aceite cumpridos: 6/6 IDs de itinerário corretos, justificativas ≤280 chars, reranqueamento contextual inverteu corretamente a ordem de prioridade e sinalizou uma baldeação noturna como eliminatória
    llm-integrationsubprocesstransit-routingbug-fixzero-cost
  9. DecisãoParte de Portfólio Vivo

    Meu portfólio precisava se atualizar sozinho sem virar um servidor pra manter. A decisão: sem CMS, sem banco de dados, sem backend — o conteúdo vive como JSON num repositório git, cada atualização é um commit, e o site é um build estático disparado por push. Uma branch drafts funciona como buffer obrigatório: a automação pode escrever, mas nada vai a público sem um merge humano.

    Resultado: Zero infraestrutura pra operar; toda mudança de conteúdo é auditável no histórico do git.

    Detalhe técnico

    Um par competente poderia razoavelmente ter escolhido um CMS headless ou uma API pequena. Git-como-banco-de-dados venceu em três frentes: histórico completo e rollback de graça, custo de infraestrutura zero, e um pipeline de deploy (push → rebuild) que hosts estáticos oferecem de fábrica. A branch drafts existe por confidencialidade, não relevância — trabalho de cliente nunca pode auto-publicar sem um olhar humano. Trade-off aceito: sem atualizações em tempo real, que um portfólio não precisa.

    architecturestatic-sitegitastro

Projetos

Portfólio Vivo

jul 2026 – atual

Um portfólio que se atualiza sozinho: um site estático em Astro cujo conteúdo é curado automaticamente a partir de sessões reais de trabalho, através de um pipeline de publicação via MCP.

Estudo de caso

O problema: sites pessoais envelhecem porque mantê-los atualizados é um trabalho que ninguém sustenta. A ideia: um hook de fim de sessão avalia cada sessão do Claude Code contra um rubric de relevância; quando o trabalho vale para o portfólio, um LLM o escreve em duas camadas (narrativa + técnica) e dois idiomas (EN/PT), sanitiza detalhes confidenciais de clientes por categoria e commita numa branch drafts. O dono publica com um comando. O site é um build estático — a 'vida' vem do pipeline de conteúdo, não de um servidor rodando. O git é o banco de dados: cada mudança é um commit, com histórico completo e custo de infra zero.

astrotypescriptpythonmcpclaude-codegithub-actions

Rotas-SP — rotas de transporte que pensam além do óbvio

jul 2026 – atual

Um planejador de rotas de transporte público para São Paulo que gera alternativas estruturalmente diferentes (ir a pé até um terminal, pegar a estação mais distante), classifica quão segura é cada baldeação e usa um LLM para ranquear e explicar as opções conforme a prioridade que o usuário escolhe na hora da consulta).

Estudo de caso

O difícil não é traçar uma rota — APIs prontas fazem isso. É revelar a boa alternativa que um app comum nunca mostra. O motor roda um OpenTripPlanner próprio sobre os dados GTFS/OSM de São Paulo e faz um sweep de parâmetros: várias consultas de roteamento com funções de custo diferentes (anti-caminhada, pró-caminhada-menos-baldeação, só-trilhos) cuja união produz candidatas genuinamente diversas. Um índice pré-computado classifica cada baldeação como terminal / estação / rua, e um scorer determinístico por perfil as ordena antes de um LLM reordenar as melhores opções e escrever justificativas em linguagem natural — com a regra estrita de só citar números presentes nos dados. Spec-first: o sistema inteiro foi documentado antes de uma linha de código, então a implementação expôs só divergências pequenas e isoladas (um bug de regex, um orçamento de latência que não sobreviveu ao grafo real — cada uma medida e corrigida). A fase 1 é um CLI com 74 testes; a fase 2 é uma API + PWA reaproveitando o mesmo motor.

pythonopentripplannergtfsosmdockertyperpydanticesperantoclaude-code

Otimização de Pipeline Crítico (88% Mais Rápido)

jun 2023 – set 2023

Uma tabela materializada estava estourando timeout. Modularização e boas práticas de modelagem cortaram seu tempo de execução em até 88%.

Estudo de caso

Uma tabela materializada crítica havia crescido a ponto de estourar timeout. Quebrei a transformação monolítica em passos modulares e apliquei boas práticas de dbt, reduzindo o tempo de execução em até 88% e eliminando os timeouts. Também usei técnicas assistidas por IA (prompt engineering e in-context learning) para acelerar a investigação e validar as refatorações candidatas.

dbtbigquerysqlprompt-engineering

Modelagem de Jornada Multi-Desfecho em dbt

jan 2023 – jun 2023

Redesenhei um modelo de dados cuja forma original não conseguia representar múltiplos desfechos por jornada de usuário, usando conceitos de modelagem de data warehouse para torná-lo conciso e escalável.

Estudo de caso

O modelo existente assumia um único desfecho por jornada, o que quebrava à medida que o negócio precisava rastrear vários. Identifiquei a limitação estrutural e então propus e implementei um modelo dbt reestruturado, alinhado às regras de negócio — trocando uma forma rígida e difícil de estender por uma que permanece concisa conforme novos desfechos são adicionados.

dbtbigquerysql

Experiência

Engenheira de Dados & IA (Human in the Loop) · Supernova Labs

fev 2026 – atual

Remoto

Desenho e opero pipelines de dados e IA no GCP, construindo ferramentas baseadas em Claude que permitem aos modelos operar com o conhecimento, as regras e o contexto de cada cliente, mantendo o julgamento humano no circuito.

  • Desenho e opero pipelines de dados/IA no GCP (Cloud Functions, BigQuery), integrando APIs externas para alimentar contexto estruturado aos LLMs e processar as saídas antes do consumo final.
  • Construo skills reutilizáveis do Claude e servidores MCP (Model Context Protocol) customizados para Claude Code, Claude API e Claude Enterprise.
  • Entreguei um pipeline de analytics com IA para um grande cliente de fitness enterprise que lê respostas de pesquisa em escala, com validação e refinamento humanos mantidos no circuito.
  • Curo prompts e contexto para garantir saídas de LLM consistentes e prontas para produção, e traduzo necessidades de negócio em arquiteturas onde a IA acelera a entrega sem substituir o julgamento humano.

Engenheira de Dados (Pleno) · UOL EdTech

out 2022 – jan 2026

São Paulo, Brasil

Construí pipelines escaláveis com dbt Cloud, BigQuery e Looker, e liderei trabalhos de modelagem de dados e performance junto a iniciativas de democratização de dados.

  • Reestruturei modelos de dados para suportar múltiplos desfechos por jornada de usuário.
  • Otimizei uma tabela crítica, reduzindo o tempo de execução em 88%.
  • Contribuí em RFCs, revisões de solução e entrevistas com stakeholders.
  • Fiz o onboarding de contratações júnior e pleno e criei um canal interno de compartilhamento de conhecimento para democratização de dados.

Engenheira de Dados (Pleno) · Tenbu

dez 2021 – jul 2022

São Paulo, Brasil

Desenvolvi pipelines de ETL e soluções analíticas, apoiando squads do levantamento de requisitos à entrega.

  • Desenvolvi pipelines de ETL com IBM DataStage e desenhei workflows no Control-M.
  • Construí dashboards em Power BI e apoiei squads com levantamento de requisitos e entrega.

Desenvolvedora de Aplicações Associada & Estagiária BTP · IBM Brasil

ago 2019 – mai 2021

São Paulo, Brasil

Desenvolvi e mantive jobs de ETL e apoiei relatórios de BI em ambiente enterprise.

  • Desenvolvi e mantive jobs de ETL com IBM DataStage.
  • Produzi documentação técnica, gerenciei cubos OLAP e apoiei relatórios com IBM Cognos.

Habilidades

Linguagens & Frameworks
SQLPythonJinja
Dados & Cloud
dbt CloudBigQueryGCPCloud FunctionsGitHub Actions
Engenharia de IA & LLM
Claude APIClaude CodeClaude EnterpriseMCPClaude SkillsPrompt Engineering
BI & Visualização
LookerPower BIIBM Cognos
ETL & Orquestração
dbtIBM DataStageControl-MPrefect

Formação

Pós-graduação em Ciência de Dados e Inteligência Artificial · PUC-RSnov 2023 – atual
Tecnólogo em Análise e Desenvolvimento de Sistemas · UNASPabr 2018 – jun 2020
Ensino Médio com Técnico em Informática · ETEC Euro Albino de Souzafev 2015 – dez 2018

Certificações

dbt Learning Path · dbt Labsmai 2025
dbt Fundamentals · dbt Labsmai 2025
Refactoring SQL to Modularity · dbt Labsmai 2025
Big Data Foundations · IBMnov 2019
Python for Data Science · IBMout 2019

Idiomas

PortuguêsNativo
InglêsAvançado

Prêmios

1º lugar — Hackathon ABStartups (desafio universitário com foco em soluções inovadoras e orientadas a mercado) · ABStartups2019