Salif Sawadogo

Paris, France · UTC+1 · available remotely

Salif Sawadogo

AI engineer and patent inventor. I take LLM systems from prototype to production, and prove they work.

Most GenAI projects stall at the demo. The gap is never the model. It is evaluation, observability, and the release process that lets you ship a change without breaking what already worked. That gap is what I close.

Start a conversation → See the work

contact@salifsawadogo.com LinkedIn Blog GitHub Hugging Face

Now
Independent consultant since January 2026. Engaged by the African Development Bank, building the AI platform behind its internal assistants.
Before that
Five years in production AI: three at Safran's Data Center of Excellence, and earlier at AXA and Coca-Cola Bottling.
Also
Co-founder of BurkimbIA, and I teach the AI and cloud track of a data science master's.
Trained in statistics
State engineer in statistical modelling (INSEA Rabat), master's in data science (Paris-Est Créteil, Eiffel Excellence Scholarship). Knowing whether a 3-point score improvement is signal or noise is the whole job in evaluation work.

Things you can check yourself

Client work sits behind NDAs. These do not.

Every underlined claim on this page links to the artifact that proves it.

Services

What I do

Five practices. The first three are where most engagements start.

1. LLM evaluation and observability+The measurement layer that tells you whether your system is good, before your users do.You get: A scored eval suite, a dashboard, a release gate · 2 to 4 weeks
  • RAG-specific scoring: answer correctness and similarity, answer relevancy, faithfulness (the hallucination rate), contextual precision and contextual recall. Retrieval and generation scored separately, because they fail for different reasons and the fix is never the same.
  • Deterministic checks alongside the judge: required key facts and must-contain assertions. Some things should not be graded on a 10-point scale. They are either present or the answer is wrong.
  • LLM-as-judge done carefully: pairwise comparison with 3-vote majority, randomized presentation order to kill position bias, calibrated rubrics for faithfulness, helpfulness and safety.
  • Golden datasets built with the business, not by the model. Synthetic data catches technical instability at scale but cannot capture the nuance and policy references a domain expert carries. Every case needs three parts: the question phrased the way a user would actually ask it, the answer an expert would write, and the source document that proves it. Plus negative tests: the questions the system must refuse.
  • SLI/SLO definition and enforcement, with release gates that block a promotion when the numbers miss.
  • Tracing and monitoring: Langfuse per-request traces, token-level streaming, tool-call visualization for multi-agent flows.
  • Drift detection: Kolmogorov-Smirnov and Population Stability Index, with configurable alerting.
  • Multilingual evaluation where exact match and F1 break down: BLEU, METEOR, TER, chrF.
  • Statistical rigor most eval work skips: power analysis before the test, bootstrap confidence intervals, McNemar for paired binary outcomes, alpha-spending to stop teams peeking their way to a false positive.

Typical engagement: you have a RAG or agent system in production and no idea if last week's prompt change made it better or worse. I give you a scored eval suite, a dashboard, and a release gate. Two to four weeks.

2. RAG and agentic systems+Retrieval that returns the right thing, and agents that stop rather than loop.You get: Retrieval and generation audited separately · the failing layer fixed · the eval suite that proves it
  • Hybrid retrieval: BM25 plus dense embeddings, with reranking. Vector stores including Azure AI Search, LanceDB and pgvector.
  • Document ingestion at scale: crawling, Docling parsing, chunking strategies, metadata and breadcrumb-based section retrieval.
  • Agent orchestration with LangGraph, pydantic-ai, LangChain, and MCP tool integration.
  • Agent harnesses and tool calling. The framework is the easy part. The harness is what decides whether an agent is usable in production: typed tool contracts so a malformed call fails at the boundary instead of three steps later, tool surfaces scoped per use case rather than handing every agent everything, explicit termination and step budgets so a loop cannot run up a bill, retry and fallback behaviour when a tool errors or returns nothing, and per-turn logging that makes a bad trajectory readable after the fact. Model Context Protocol where tools need to be shared across systems.
  • Multi-agent routing: structural locks for deterministic paths, LLM routers for semantic ones, with fallbacks when a branch returns too little context.
  • LLM gateway patterns: one routing layer so applications never hardcode a provider SDK, which makes model swaps and cost control a configuration change.

Typical engagement: your RAG answers are plausible but wrong, or your agent loops. I audit retrieval quality separately from generation quality, fix the layer that is actually failing, and leave you the eval suite that proves it.

3. MLOps and AI under constraint+Regulated, offline, sovereign, or low-connectivity, where the standard playbook does not apply.You get: The architecture and the compliance story designed together, not retrofitted
  • CI/CD with automated validation gates: code quality, model validation against golden datasets, infrastructure compatibility, dependency scanning.
  • MLflow Model Registry with staging to production promotion, approval gates, lineage tracking, and rollback to any prior version.
  • Blue-green and canary deployment, shadow traffic, automatic rollback on SLO violation.
  • Kubernetes (AWS EKS), Docker, Terraform, Azure Container Apps, serverless GPU inference.
  • Offline-first architecture: IndexedDB and SQLite cache-first reads, mutation queues, auto-replay on reconnect, AES-GCM encryption at rest.
  • On-device inference: quantized speech and language models running entirely on mid-range Android hardware, benchmarked on the phones users actually own rather than a flagship. Zero network, zero per-request cost, nothing leaving the device.
  • Privacy by design: GDPR-compliant pipelines, PHI encryption, multi-tenant isolation enforced at the database layer, consent modelling with scope and expiry.

Typical engagement: you need AI in an environment with real constraints (health data, air-gapped, intermittent connectivity, a regulator). I design the architecture and the compliance story together, because retrofitting the second onto the first never works.

4. Uncertainty quantification for ML models+A point prediction with no error bar is an opinion.You get: A calibrated uncertainty layer · a decision rule tuned to your real cost of error

Where a model output drives a decision that costs something to get wrong, I make the uncertainty explicit and calibrated.

  • Conformal prediction, which wraps a model you have already trained and returns intervals or prediction sets with a finite-sample coverage guarantee, distribution-free and model-agnostic. For regression, locally adaptive variants and conformalized quantile regression, so the interval widens where the model is genuinely unsure instead of staying a constant band. For classification, prediction sets rather than a single forced label.
  • Judging the intervals themselves, not just producing them: marginal coverage against the target, average interval width, adaptability across regimes, and the Winkler score when you need one number that penalizes both an interval too wide to be useful and one too narrow to be honest.
  • Knowing where the guarantee stops. Coverage is marginal, not conditional: 90 percent overall can hide 60 percent on the subgroup you care about, which is why I check coverage per segment. And the framework assumes exchangeability, so it degrades under distribution shift and needs weighting or an adaptive scheme when the data drifts.
  • Classical uncertainty where it fits better: bootstrap confidence intervals, constrained estimation to tighten standard errors when the sign of an effect is known a priori, and power analysis before an experiment rather than after.
  • Cost-sensitive decision thresholds. Tuning the operating point against the actual business metric and asymmetric error costs, rather than defaulting to 0.5 and accepting whatever the confusion matrix gives you.
  • Calibration, so that a predicted probability of 0.8 means the event happens 80 percent of the time, which is the precondition for any of the above being worth anything.

Typical engagement: your model is accurate enough on average and still makes expensive mistakes, because nothing downstream knows which predictions to distrust. I add the uncertainty layer and tune the decision rule against your actual cost of error.

Provenance The classical side is delivered work, in production for clients: confidence intervals, causal effect estimation, constrained models built specifically to narrow uncertainty bands. Conformal methods I have taught rather than shipped. I ran a session on them for fellow data scientists at DataScientest, which is a different kind of proof than a production system but not a weaker one: you cannot teach coverage guarantees to a room of practitioners without being able to answer why the interval breaks on their subgroup.
5. Revenue growth management and retail analytics+The commercial analytics stack for consumer goods and retail. Where I started.You get: The analytical layer, rerunnable next quarter rather than a one-off deck
  • Geomarketing and trade area analysis: catchment area modelling, spatial indices, point-of-interest and footfall enrichment, geodesic distance over proper projections. Answering which outlets are comparable, and why.
  • Entity resolution and record linkage: fuzzy matching internal customer master data against external sources when there is no shared key, with human-labelled ground truth rather than an unvalidated similarity threshold.
  • Customer segmentation: K-means and hierarchical clustering on behavioural and spatial features, with segments profiled in language the commercial team uses, plus a classifier to assign new accounts.
  • Demand modelling and elasticities: log-log fixed-effects specifications that yield price and cross-price elasticities directly, with cannibalization and halo effects modelled explicitly through a substitution matrix.
  • Assortment and planogram optimization: greedy or constrained range construction that accounts for substitution as the shelf fills, against a volume or margin objective. SKU rationalization on the same machinery.
  • New product forecasting: analog or like-item modelling for SKUs with no history, using attribute-space similarity.
  • RFM, customer lifetime value, and churn: including survival analysis when the business needs to know when, not just whether.
  • Demand forecasting: SARIMAX where the seasonal structure is the signal, gradient boosting where it is not.

Typical engagement: you have transaction data and a commercial question (what should we stock, what will it sell, which customers are worth defending) and no analytical layer between the two. I build it, and I make it rerunnable next quarter rather than a one-off deck.

Selected work

Thirteen engagements, grouped by what each one demonstrates

Platform engineering at organizational scale, then commercial analytics, then shipping product where the environment fights back, then the statistical foundations underneath all of it.

Platform and production AI

African Development Bank, AI Innovation Lab+Current engagement. Shared AI infrastructure plus six domain assistants. Every assistant now ships with an evaluation dataset built with the business and a published score.pydantic-ai · LangGraph · LiteLLM · Langfuse · MLflow · Azure Container Apps · Azure AI Search · MySQL · Docling · FastAPI · Angular
  • Backbone: LiteLLM gateway routing every LLM call in the organization, Langfuse for traces, MLflow for experiment tracking. Model pricing is configuration, not code, so cost control and provider swaps do not require a deploy.
  • Evaluation as a shared service. This is the part I am proudest of. Rather than each bot team improvising its own scoring, there is one FastAPI service every assistant calls: question and expected-answer datasets scored on answer correctness, relevancy, faithfulness, contextual precision and contextual recall, alongside deterministic key-fact and must-contain checks. Judge calls route through the same gateway as everything else. Jobs run async, results land in MLflow. Every bot on the platform now ships with the same standard pair of deliverables: an evaluation dataset built with the business, then a published campaign score.
  • Ingestion: crawler over the bank's document management system, Docling parsing, blob storage plus Azure AI Search indexing. Handles project appraisal reports, country strategy papers, completion reports and thematic evaluations across member countries, in French and English.
  • Assistants: six independent RAG agents (operations quality, SharePoint knowledge, economics, non-sovereign operations, evaluation results, sustainable development goals), isolated from each other so one team's release cannot break another's, but all sitting on one shared core package.
  • One agent framework, deliberately. The bots run on pydantic-ai, wired to the gateway through a shared model adapter, with typed tool contracts and a common turn logger. Standardizing this was a decision, not an accident: before it, every bot had its own orchestration, its own history handling and its own way of failing. One assistant remains on LangGraph because its multi-step graph genuinely needs explicit state transitions, and forcing it to converge would have cost more than it returned. Picking one default and documenting the exception is the part most platform work gets wrong.
  • Document generation: pydantic-ai agents that draft concept notes and score project readiness across four dimensions, using a router plus specialist plus synthesis architecture, with structural locks for the routes that must be deterministic and an LLM router for the rest.
Safran, Data Center of Excellence+November 2022 to December 2025. A patented virtual sensor for aircraft brake wear, and generative AI in production.AWS EKS · Kubernetes · MLflow · Langfuse · LangGraph · XGBoost · Spark · CI/CD

A virtual sensor for aircraft brake wear, and a patent

Checking how worn an aircraft brake heat sink is normally means sending someone to inspect it on the ground. We replaced the inspection with an estimate: read the temperature sensors during the parking phase after landing, measure how long the brake takes to cool, and infer wear from that.

The difficulty is that cooling time is not a clean signal. Ambient temperature, wind, and the conditions on that particular apron all move it, so the same brake in the same condition looks different in Dubai and in Oslo. The method therefore models the environment explicitly, using XGBoost regression to predict how those conditions shift the expected cooling time, and reads wear from what the environment cannot explain. The result is per-aircraft, per-brake monitoring across an entire fleet, continuously, with nobody going out to look.

Filed by Safran with three named inventors, including me. French priority August 2024, PCT filing July 2025, published as WO2026032835A1 in February 2026. Unlike everything else here from Safran, this one you can read in full: a published patent is a public disclosure by definition, so the method, the modelling choice and the reasoning are all in the document.

Generative AI in production

  • Multi-agent chatbot built from scratch on an internal LLM-as-a-service layer, with tool use and MCP integration.
  • Evaluation framework with enforced service level objectives across factual accuracy, judged response quality, toxicity, PII exposure, latency and availability, wired to release gates that blocked a promotion whenever a target was missed.
  • Multi-layered observability: Langfuse traces, MLflow and Prometheus metrics, Grafana dashboards over the Kubernetes layer, with cost monitoring and budget alerting.
  • Release discipline built around weekly deployments, short lead time from commit to production, fast recovery, and a low change-failure rate, all tracked rather than asserted.
  • AWS data science platform on EKS, built for the team's scalability and security requirements.
AI-assisted consultant screening+Document intelligence for procurement and recruitment, African Development Bank. Reads a terms-of-reference document, reads a stack of CVs, produces defensible scores and a ranked shortlist.Azure OpenAI · Azure AI Search · Azure Translator · MySQL · SharePoint · webhooks · SSE
  • Split into an assessment service (business logic, consultations, criteria, scores, exports) and an intelligence service (extraction, analysis, scoring), communicating by webhook so a long LLM job never blocks a request.
  • Language normalization before scoring: text is extracted, language detected, then translated to a single working language. Without this step a French CV and an English CV are scored on different footings, which is the kind of bias nobody notices until an unsuccessful candidate asks why.
  • Retrieval-backed scoring against the terms of reference, not freeform prompting, so each score traces to specific evidence in the document.
  • Server-sent events for progress, Excel export, ranked shortlist output.

This one generalizes well. Any workflow of the form "score many documents against one rubric, and be able to justify each score" is the same system.

DS-backbone+A data science environment your team can stand up in one command. Public repository.Docker Compose · MLflow · PostgreSQL · MinIO · JupyterLab · Nginx

The platform work I do at Safran and the African Development Bank sits behind NDAs. This is the same architecture, open, so you can read it before hiring me: github.com/sawallesalfo/DS-backbone

One docker compose up gives a team the full loop: JupyterLab for exploration, MLflow for experiment tracking and the model registry, PostgreSQL as MLflow's backing store, MinIO as S3-compatible artifact and dataset storage, and Nginx routing it all behind clean hostnames instead of a spread of localhost ports.

The point is what it removes. Most teams assemble these five pieces by hand, differently on every laptop, then spend the first month of a project debugging why an experiment that ran locally will not reproduce. Configuration is environment variables, storage is S3-compatible from day one, so moving from this sandbox to real cloud storage is a URL change and not a rewrite.

If you are hiring someone to set up your data or ML environment, this repo is the deliverable, and you can inspect it before we talk.

Commercial analytics

Equatorial Coca-Cola Bottling Company, Morocco+Geospatial segmentation and demand modelling. Worst-case test MAPE of 14 percent across every model. Thesis and algorithm both public.Python · Azure Databricks · Spark · scikit-learn · statsmodels · geospatial · web scraping

The most complete piece of work I can show end to end, because the report is public and so is the core algorithm.

ECCBC knew its own points of sale but knew almost nothing about the neighbourhoods they sat in. Every HORECA outlet in the channel received the same assortment, because there was no basis for giving them different ones. Pilot zones Marrakech and Tizi Ouzou. The chain runs: enrich the customer base with external spatial data, segment on it, model demand per product within each segment, then use those models to decide what goes in each fridge.

  • Entity matching under noise. Internal records had no shared key with any external source. I built a composite similarity score over seven string metrics (Damerau-Levenshtein, Jaro-Winkler, n-gram overlap and others), weighted 75 percent on name, 15 percent on address, 10 percent on geodesic distance, searching a 2 km radius. Matched a 5,457-entry TripAdvisor corpus against internal records. Validated it the honest way: a stratified 400-record sample checked by hand to produce labelled ground truth, then treated as a supervised problem.
  • Spatial enrichment. Trade area analysis, spatial indices, geodesic distance over proper reference ellipsoids and projections, plus OpenStreetMap and Flickr signals for footfall and points of interest.
  • Segmentation. K-means with K-means++ initialization, benchmarked against hierarchical clustering, on standardized features. Eight interpretable segments for cafés and restaurants, three for hotels, each with a business-readable profile (Premium and Entertainment, Semi-Rural, Low Affluence and Mobility, and so on). Points of sale outside the clustering sample were assigned by Random Forest.
  • Demand models, one per SKU per segment. Weekly data, 2019 to 2021, log-transformed volumes with a fixed effect for baseline throughput, a cannibalization matrix across brands and flavours, and external regressors for weather and events. Variable selection was automated: drop near-zero variance, drop correlations above 0.8 unless they came from the cannibalization matrix, drop VIF above 10. The socio-economic variables fell out on their own, which was the right result: the clustering had already absorbed that variance, and a model that kept them would have been double-counting.
  • Constrained and unconstrained versions of each model. The constrained variant imposes sign constraints where the business meaning is unambiguous: cannibalization effects cannot be positive, fridge doors and merchandising quality cannot hurt volume. This narrows the standard errors and tightens the confidence intervals, which matters when the output drives a purchasing decision rather than a slide.
  • Validated properly, at scale. Shapiro-Wilk for normality, White for homoscedasticity, Durbin-Watson for autocorrelation, all above 0.05 across every modelled SKU. MAE and MAPE computed after back-transforming out of log space, because an error term in logs tells a commercial team nothing. Worst test MAPE across all regressions: 14 percent. Since there were far too many SKUs to inspect by hand, the pipeline auto-generated a quality report per model: fit statistics, coefficient distributions, constraint bounds, and hypothesis test results.
  • Cold start on new products. A SKU launched this year has no history, so it cannot be modelled. Rather than dropping it or guessing, I flagged it as limited-coverage and estimated it by proxy: find the three nearest SKUs by cosine distance over product attributes, then take a similarity-weighted average of their predictions, calibrated against their observed sales. New products are precisely the ones a category manager most wants an answer on.
  • The assortment optimizer. Greedy rank construction from an empty fictional fridge. Rank 1 is the best-performing SKU with cannibalization switched off, since nothing else is on the shelf yet. Rank 2 re-estimates cannibalization against that first product and picks the best addition. Rank j repeats, always conditioning on what is already in the fridge. The output is an ordered assortment per segment, benchmarked against the ranks actually observed in sales. The objective function is a parameter: maximize volume, or maximize margin.
Where it landed, precisely The constrained demand models went into use in the data science department for fridge assortment recommendation. The optimizer was validated by the department for implementation, but the internship ended before I finished programming it. I would rather say that than imply I shipped it.
AXA Direct+Insurance risk modelling under regulatory constraint. Processing time fell 40 percent, and a first-place competition win.Azure · Databricks · Python · R · scikit-learn · Spark · Power BI · CI/CD

Insurance pricing is one of the few places where a model has to satisfy a regulator as well as a business. I migrated the pricing stack from traditional GLMs to machine learning without losing that: separate frequency and severity risk models meeting financial regulatory requirements, a big data migration to Azure with CI/CD integration, GDPR-compliant handling throughout, and continuous performance monitoring after release. Processing time fell 40 percent.

The interesting constraint is explainability. An actuary can defend a GLM coefficient to a supervisor. Replacing it with a gradient-boosted model means you now owe an account of why the price moved, which shapes what you are allowed to build.

Before joining, I won first place in AXA Direct's internal data science competition. Code is public, written in R.

CDandLP+Semantic search for a vinyl marketplace. +29 percent user satisfaction, verified with causal inference.Python · BERT · Causal Forest · Double ML · propensity scores · NLP

Replaced keyword matching with BERT-based semantic embeddings, on top of NLP-based deduplication and normalization of a messy product catalogue.

Then measured it properly. Not a simultaneous A/B split: a gradual rollout over four weeks, which means randomization was imperfect and the naive before-and-after number could not be trusted. So the lift was estimated with causal inference. Causal Forest for heterogeneous treatment effects across user segments, Double Machine Learning to control for confounders, propensity score matching to correct the selection bias the rollout design introduced.

+29 percent user satisfaction, significant at p < 0.01, and defensible because the seasonal and behavioural drift was modelled out rather than assumed away. The number I would have reported without that layer was larger and partly fictional.

Retail-360+The full customer analytics stack, end to end. Public repository.Python · RFM · survival analysis · SARIMAX · XGBoost · LightGBM

Built around seven questions a retailer actually asks: who are my best customers, who is about to leave, who could be worth more than they are, who is already gone, where does retention effort pay off, who is loyal, and who will respond to this campaign. Public repository.

  • RFM segmentation as the foundation, because recency, frequency and monetary value are interpretable by the commercial team, and a segmentation nobody understands never gets used.
  • Customer lifetime value modelling on top of it.
  • Churn and attrition treated as survival analysis rather than a binary classifier, so the output is when a customer is likely to leave, not just whether.
  • Sales forecasting at daily and weekly granularity, SARIMAX for the seasonal structure, XGBoost and LightGBM where the relationships are not linear.
  • Supply chain movement monitoring on the same feature base.

It is organized as a pipeline (inputs, intermediates, then one folder per analysis) rather than a pile of notebooks, which is the difference between an analysis someone can rerun next quarter and one they cannot.

Products under constraint

BurkimbIA+Co-founder. Eleven open-source models for Mooré, a language with almost no digital corpus.PyTorch · Transformers · PEFT · Unsloth · RunPod · Hugging Face · Fly.io · S3 · WandB · FastAPI · Gradio

A non-profit in Ouagadougou building speech and translation models for a language with almost no digital corpus.

  • Translation: fine-tuned NLLB (600M and 1.3B) and Mistral-7B for French to Mooré.
  • Speech recognition: fine-tuned Whisper Large, three iterations.
  • Speech synthesis: SparkTTS (Qwen2 backbone, LoRA), XTTSv2, VITS, ParlerTTS.
  • Public leaderboards for translation (BLEU, METEOR, chrF), ASR (WER, CER) and TTS, against a 1,483-sample benchmark across five domains.
  • The interesting part: a synthetic data flywheel. Real speech trains the TTS model, the TTS model generates synthetic audio that augments the ASR corpus, the improved ASR transcribes more real audio, which yields more text pairs for the next TTS round. That is how you get past a 1,000-pair starting corpus without funding a large recording campaign.

Everything is public: huggingface.co/burkimbia and github.com/BurkimbIA

DOCFIRA+Digital health for chronic disease in Africa. Offline-first, multi-tenant, with the clinical assistant running entirely on the phone.Next.js 15 · Hono · Drizzle · PostgreSQL · Dexie.js · Auth0 · Terraform · LangGraph · whisper.rn

Multi-tenant platform connecting patients, clinicians and institutions, built for regions where specialist care means travelling and connectivity is not guaranteed.

  • Offline-first by design: patient and clinician apps work with no network. Cache-first reads, queued mutations, automatic replay on reconnect, AES-GCM encryption for health data at rest in the browser.
  • Two-level GDPR consent: storage consent, then per-clinician access consent with explicit scope and expiry.
  • Tenant isolation enforced at the database level, with users able to belong to multiple institutions.
  • Medical transcription service: streaming ASR to structured clinical notes.
  • Conversational health agent with hybrid vector and BM25 retrieval.

Running the whole clinical assistant on the phone. Cloud transcription is the easy answer and the wrong one here: it needs a network the clinic may not have, and it sends patient speech to a third party. So I built the offline path and measured it. Whisper via whisper.rn for speech, a small language model via cactus-react-native for the clinical note draft, benchmarked on the phones clinicians actually carry (Tecno, Infinix, Samsung A-series) rather than a flagship: Whisper tiny against small, Gemma 270M against Qwen3 0.6B, on latency and quality. Models download once, then nothing leaves the device.

That work became a step-by-step guide to deploying an LLM on mobile, written for backend and data engineers who have never opened Android Studio.

IMETRIX+Business intelligence for merchants who have never had any. Caught a neighbouring prototype reporting 0.16 days of inventory where the answer was 45.5.React Native · Expo · TypeScript · expo-sqlite · Supabase RLS · Nuxt 3 · EAS Build

Retail shops and wholesalers in Ouagadougou. The product is not a cash register, it is a decision assistant: margin, trend, what actually earns, what is sitting dead on the shelf. Analytics is the product.

Offline-first out of necessity: local SQLite is the source of truth, a sync engine watches connectivity and pushes queued sales in batches when the network returns. Multi-tenancy is enforced with Postgres row-level security rather than application code, so a query bug cannot leak one merchant's sales into another's.

The analytics layer is where the real work is, and three rules separate it from a dashboard:

  • Margin is only computed on lines where the purchase price was actually known, and every figure carries its coverage. A margin presented as complete while silently ignoring half the sales makes someone decide on a false number.
  • An unknown margin displays "not calculated", never zero. Zero margin and unknown margin call for opposite actions.
  • Cost is snapshotted at the moment of sale. Wholesalers change their prices without warning. Reading the current purchase price at calculation time would silently rewrite last month's margins.

While building it I audited a neighbouring prototype's inventory formulas and found the days-inventory-outstanding calculation was dividing a quantity by an amount in currency, using closing stock where its own comment specified average, and multiplying by the period after the division had already produced one. On a real case (350 F purchase price, 26 units average stock, 8 sold in 14 days) the prototype returned 0.16 days against a true 45.5. The error scaled with purchase price, so it was not even a constant offset. The dashboard had been showing plausible, meaningless numbers.

Testing is deliberately unfashionable here: 164 mobile tests run against a real SQLite engine, and 9 backend tests against a real Postgres. I refused jest-expo because its automatic mocks execute no SQL, so the suite would pass without proving anything.

Foundations

Econometric analysis of inflation in Burkina Faso+Applied research, EDESAT and INSEA, 2021. VAR, VECM, Johansen cointegration. Slides public.R · time series · cointegration · Granger causality · variance decomposition

Monthly series from 2004. Stationarity testing (Augmented Dickey-Fuller), Johansen cointegration, VAR and VECM specification with information-criterion lag selection, Granger causality, impulse response functions, and forecast error variance decomposition at a 12-month horizon. Full residual diagnostics: Jarque-Bera p = 0.38, White p = 0.45, Portmanteau p = 0.91. Included a COVID-19 shock analysis on the price level. Slides public.

I list this because time series and causal identification keep coming back. Forecasting, anomaly detection, and any question of the form "did our change cause this" are the same toolkit.

Method

How I work

Tooling

Stack

LanguagesPython (primary), R, SQL, SAS (certified), TypeScript
LLM and agentsLangChain, LangGraph, pydantic-ai, LiteLLM, MCP, Transformers, Unsloth, PEFT
Evaluation and observabilityLangfuse, MLflow, Prometheus, Grafana, custom eval harnesses, NLTK, spaCy
ML and statisticsPyTorch, scikit-learn, TensorFlow, Spark, causal inference (DML, Causal Forest, propensity scores), uncertainty quantification (conformal prediction, CQR, MAPIE, bootstrap intervals), cost-sensitive threshold tuning, time series (VAR, VECM, cointegration, SARIMAX), Bayesian statistics, geostatistics
Serving and infrastructureFastAPI, Docker, Kubernetes, AWS (EKS, SageMaker, Lambda, S3), Azure (Container Apps, AI Search, Databricks), Terraform, RunPod
On-devicewhisper.rn, cactus-react-native, GGUF and INT4 quantization, Expo EAS, benchmarking on mid-range Android
DataPostgreSQL, MySQL, pgvector, LanceDB, Azure AI Search, Redis, Airflow, SQLite
FrontendNext.js, React, React Native, Gradio, Streamlit

Public proof

Writing

I publish a technical article roughly every two weeks at blog.salifsawadogo.com, in French, since 2024. It is the closest thing to a code sample I can offer for NDA-bound work, because the patterns are the same ones I ship.

On evaluation

On RAG and agents

On architecture and delivery

Code and records

WO2026032835A1Safran patent, aircraft brake wear monitoring. Named inventor. Published February 2026
CredlySAS Certified Specialist, Base Programming Using SAS 9.4
Rapport-universitaireThe full 161-page Coca-Cola thesis and the inflation econometrics slides
Super-Matching-AlgorithmThe entity matching engine from the Coca-Cola project
Mini_Kaggle_AXAFirst-place solution, AXA Direct competition, in R
Machine_Learning_JourneyClustering, LDA, CART, bagging, boosting, random forest, in R with R Markdown
DS-backboneOne-command data science environment: MLflow, MinIO, PostgreSQL, JupyterLab, Nginx
Retail-360RFM, customer lifetime value, survival-analysis churn, SARIMAX and gradient-boosted forecasting
Deployment_Data_Science_ProjectThe same model deployed five ways: local, server, API, cloud, Docker
huggingface.co/burkimbiaEleven published models, three public leaderboards
claude-skillsReusable agent skills for architecture diagrams and technical documentation
RH-360 · Recommandation-EngineHR feature engineering, and visitor segmentation for e-commerce personalization
audio_processing_playground · Frame2Text4LLMSpeech and multimodal experiments feeding the BurkimbIA pipeline

Background

Where this comes from

If there is one thing I do across every project, it is asking whether a number is real before anyone acts on it. That looks like hand-verifying 400 matched records before trusting an entity resolution pipeline. It looks like running causal inference on a search improvement to find out how much of the lift was seasonality. It looks like refusing to display a margin computed from half the data, and catching an inventory formula that divided crates by currency and returned 0.16 days where the answer was 45.5. In LLM work it is the same instinct wearing different clothes: golden datasets, faithfulness scoring, and a release gate.

M2 MASERATI, Data Science, Université Paris-Est Créteil, 2022. Eiffel Excellence Scholarship.
State Engineer, Statistical Modelling, INSEA Rabat, 2021. Thesis at Equatorial Coca-Cola Bottling Company.
Preparatory cycle, Mathematics and Physics, Fès, 2018. CIOSPB Scholarship.
SAS Certified Specialist: Base Programming Using SAS 9.4

Burkina Faso to Morocco to France, on scholarship at each step. I mention it because it is also why I work the way I do: I have never had the luxury of assuming the infrastructure would be there.

Teaching and mentoring

I teach at 2iE in Ouagadougou, on the data science master's: Cloud, AI and Security, plus Big Data and Spark, sentiment analysis, and Python for data science. I also mentor career-changers into data science at DataScientest, and I ran the same mentoring programme internally at Safran for colleagues moving into data roles.

This is not a line I put here to look well-rounded. Teaching a topic four times to people who have never seen it is what forces you to actually understand it, and it is why I can explain a retrieval failure to a product owner without hiding behind vocabulary. If you need someone who will leave your team able to maintain what was built, that is the same skill.

I also teach sideways, to peers rather than students. I ran a session on conformal prediction and uncertainty quantification for fellow data scientists at DataScientest, and I spent a good part of the DOCFIRA on-device work explaining mobile deployment to colleagues who had never opened Android Studio.

I volunteer with Kodiko, which pairs refugees with professionals to help them re-enter the workforce in France.

Languages: French (native-level, C2), English (professional, B2), Mooré (native).

I work across Europe and West Africa and I am comfortable in both. For a client building for African markets, that is not a diversity note, it is domain knowledge: I know why offline-first is not optional, why a French-only interface excludes users, and why the phone in the field is a Tecno and not an iPhone.

Working together

Four shapes an engagement takes

I work as an independent consultant, remote, in French or English, and I am used to distributed teams across Europe and Africa. I already run a client engagement with a multilateral institution, so I know what it takes to hold a delivery commitment alongside existing work rather than promising availability I do not have.

Who this is for

  • You have a RAG or agent system in production and no way to tell whether last week's change helped. The most common one, and the reason evaluation is usually the first deliverable.
  • A model output drives a decision that costs something to get wrong: a price, a shelf, a margin, a maintenance call. The work is as much about the decision rule and the cost of error as about the model.
  • The environment fights back: a regulator who needs the price movement explained, health data that cannot leave the device, an air gap, a network that is not there half the time.
  • You have transaction data and a commercial question, and nothing analytical between the two.
Who it is not for
  • You want a working demo by Friday and will decide later whether the answers are right. Measurement is the first deliverable here, which is the slower route to a demo and the faster route to something you can ship twice.
  • You need a full-time employee. I am an independent consultant with an existing engagement, not a candidate.
  • You want the number to come out a particular way. I will tell you when a figure cannot be computed honestly, which is occasionally the opposite of useful in the short term.

Tell me what is not working.

A short description of your system and where it is stuck is enough to start. I will tell you whether I am the right person before we talk about scope.

contact@salifsawadogo.com