Skip to content
View Rodrigo-Palma's full-sized avatar

Block or report Rodrigo-Palma

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Rodrigo-Palma/README.md

Rodrigo Palma

Senior Data and AI Engineer in Porto Alegre, Brazil (UTC-3).

I build data platforms and LLM systems, and most of my time goes into the part that decides whether they keep working: pipelines that rerun cleanly, retrieval you can actually evaluate, and gates that stop a worse model from shipping.

LinkedIn · email.rodrigopalma@gmail.com

Upstream open source

I fix bugs in the tools I use at work. 16 pull requests merged so far, in great-tables (11), fsspec (2), polars, delta-rs and iceberg-python, with more still open in huggingface/datasets, mlflow, pandera, litellm, sqlmesh, dspy and lm-evaluation-harness. Everything, merged and open: search.

Three that show the kind of bug I go after:

  • delta-rs #4747. The doc comment said a directory counts as a partition when it is named partitionCol=value, but the code only compared the prefix. With a partition column called _date, an unrelated _dates_backup/ directory matched, lost the protection a leading underscore is supposed to give it, and became a deletion candidate for vacuum.
  • iceberg-python #3995. Rewriting a predicate to DNF distributed every AND over the ORs below it with nothing bounding the result. Twenty groups of two branches, about 40 predicates in all and a plausible size for a filter built from user input, expanded to 1,048,576 terms in 16.9s and about 1 GiB. The same input now fails in 0.22s against an explicit limit.
  • great-tables #869. date_style="iso" used the CLDR pattern y, which has no minimum width, so the year 999 rendered as 999-01-05 and the package's own ISO parser rejected the package's own output.

Most of them come from two habits: round-tripping a value through the library's own parser, and reading what a function's name promises against what the body actually does.

Projects

quantlens is a quant analyst over B3 (Brazilian exchange) data running entirely on local models. Retrieval with guardrails, an offline eval suite that CI enforces as a gate, and a benchmark that fails the build on regression (the offline path end to end, no LLM call, p50 441 µs). Local models were a deliberate trade: no per-query cost and no data leaving the machine, paid for with weaker generation, which is why the guardrails and the evals exist at all. The decisions behind it are written down as ADRs.

anchora is retrieval over Brazilian public-law documents, where an answer either carries its citations or abstains. My first fine-tune scored 0.92 and the number was wrong, because the split I measured on overlapped with training. On a clean holdout the honest numbers are 0.818 citation correctness and 0.833 abstention, against 0.500 and 0.167 for the base model with few-shot prompting. make eval-honest reproduces every arm from frozen generations with no GPU, and the promotion gate rejects the more cautious 10-example adapter because its citation accuracy falls to 0.636.

market-elt is market-data ELT on dbt and DuckDB, where data-quality tests break the build instead of letting bad rows travel downstream. Deliberately boring.

Day job

Data and AI engineer at the public defender's office of Rio Grande do Sul. The systems are internal and cannot be open sourced: ETL for data nobody could query before, analytics with NLP, and the one I am responsible for, which measures excess caseload and allocates more than R$85 million a year in compensation to public defenders. A wrong number there is not a bad chart; it is somebody's pay, so most of the engineering went into making the comparison between units hold up when a unit disputes its own result. I am a co-author on it: the criterion for comparing units across defensorias came from a public defender, not from engineering. Second place in digital innovation at the 2nd CNTI.Def / 5th Enastic, the Brazilian public-defender technology conference, 2026.

Before that

I trained as a psychologist, then spent about five years as the only developer of my own PC-gaming e-commerce (backend, frontend, payments and the 2am operations), and moved into public-sector systems and data after that. BSc in Computer Engineering, MSc in Big Data and Business Intelligence.

Stack

Proven in the repositories above: Python, SQL, PyTorch, FastAPI, dbt, DuckDB, Polars, Docker, GitHub Actions, Ollama, LoRA fine-tuning.

Used at work, where the code is not public: Spark, Airflow, Kubernetes, Terraform, AWS, Azure.

Microsoft certified: DP-100 (Azure Data Scientist), DP-600 (Fabric Analytics Engineer).

Pinned Loading

  1. anchora anchora Public

    Offline RAG over Brazilian public-law documents — cited, domain-grounded answers.

    Python

  2. market-elt market-elt Public

    DuckDB + dbt ELT with data-quality tests — reproducible end to end, zero infra.

    Python

  3. quantlens quantlens Public

    Production-grade local-LLM quant analyst for the B3 stock market: RAG, guardrails, measured offline evals.

    Python