Open to AI Engineer roles · Remote, worldwide

Majed Saliou Azar · AI Engineer

I build AI systems that show their work.

LLM applications, retrieval-augmented generation, and fine-tuned models, shipped as live products. My answers cite their sources, my agents trace every number to the query that produced it, and every project ships with a held-out eval and a CI gate that fails when quality drops.

  • 4+ yearsshipping production software
  • 3 liveAI apps with public evals
  • MSITInformation Technology, 2026
  • 5th in AfricaDev Champion 2022

Selected work

Three AI products, built end to end

Data pipeline, retrieval or training, evaluation, security, UI, and deployment: I built each one myself. All three are live and free to try, and each README documents what didn't work as carefully as what did.

FilingLens answering how NVIDIA's R&D expense changed between fiscal 2024 and 2025. The answer cites passage 2 and carries a Verified badge; the AI judge confirms 1 of 1 cited sentences is supported.

01 RAG · Retrieval & grounding

FilingLens

Citation-verified Q&A over SEC 10-K filings. Every answer sentence cites the passage it came from, sentences the sources don't support are flagged, and questions the filings can't answer are declined.

Recall@10
85.5%

held-out test split, 74 items

Answer accuracy
82.9%

35-question test sample

Search latency
33 ms

median, in the browser

What I built

  • Python ingestion of 24 filings from 12 companies with structure-aware chunking, then hybrid search: BM25 and dense embeddings fused with Reciprocal Rank Fusion, plus company and fiscal-year filters.
  • A deterministic verifier that runs in the browser: a sentence is verified only if it cites a passage and every number in it appears there. An optional AI judge agrees with reference labels 95.5% of the time (κ 0.86).
  • A Cloudflare Worker gateway with a provider fallback chain (Workers AI → Groq → Gemini), a KV answer cache, a Turnstile bot check, and rate limits. It runs for $0, with no vector database.
  • A 211-question eval set, split dev/test before tuning. CI fails any push that drops recall@10 by more than 2 points.
  • Python
  • TypeScript
  • BM25
  • bge-small (ONNX, q8)
  • RRF
  • Cloudflare Workers
  • Playwright
  • GitHub Actions
Every retrieval choice was measured Recall@10 on the held-out test split, by setup. Higher is better.
Retrieval setupRecall@10
Hybrid + filters shipped85.5%
+ cross-encoder rerank80.1%
Dense only79.7%
BM25 only73.3%
No metadata filters72.6%
Fixed 350-token chunks69.9%

What didn't work: a cross-encoder reranker lowered recall@10 by 5 points on test and took about 7 s per query in WASM, so it stayed out of production.

Browser Analyst answering how flipper length relates to body mass for penguin species. Each agent step shows the SQL it ran and the result table; a trace panel lists every model and tool call with latency and token counts.

02 Agents · Tool calling & security

Browser Analyst

A data-analyst agent that writes and runs SQL and Python in your browser, repairs its own errors, draws charts, and links every number in its answer to the result cell that produced it. Your file never leaves the tab.

Task success
94%

100 questions, 10 categories

Data exfiltrated
0

24 prompt-injection attacks, CSP on

Numbers traced
99%

of answers match their cited cells

What I built

  • An agent loop that runs SQL in DuckDB-WASM and Python in Pyodide, both in Web Workers. Results stay in the tab; the model sees only schemas, profiles, and 20-row previews.
  • Layered defenses: a read-only SQL guard (65 unit cases), engine lockdown, approval before any Python runs, spotlighting plus an injection detector, and a Content-Security-Policy as egress control.
  • A reproducible benchmark with cached model calls, full traces, and token accounting. The CI gate blocked a prompt change that passed every unit test but dropped the smoke split to 8/15.
  • A tier-0 cascade test with my own fine-tuned model (PocketSQL): 30% fewer LLM calls but 8 points lower success, so the live app doesn't use it.
  • TypeScript
  • React
  • DuckDB-WASM
  • Pyodide
  • Vega-Lite
  • Gemini · Groq APIs
  • Cloudflare Workers
  • Playwright
Benchmarked across free models Task success on 100 questions, same agent code and settings.
ModelTask success
gemini-3.5-flash-lite live94%
gemini-3.1-flash-lite94%
gemma-4-26b-a4b-it88%

What didn't work: knowing when to ask. On 8 deliberately ambiguous questions, models asked for clarification at most 3 times. It's the weakest category, and the README reports it rather than hiding it.

PocketSQL answering which five billing countries have the most revenue: the model's DuckDB SQL query, an editable Run SQL button, and a bar chart of the result with the USA first.

03 Fine-tuning · On-device inference

PocketSQL

A 0.5B text-to-SQL model I fine-tuned with LoRA and shipped to the browser. It writes DuckDB SQL on your GPU through WebGPU, costs $0 per query, and keeps working with Wi-Fi off.

SQL accuracy
30.9→49.3%

execution match, 981 Spider-dev questions

Model size
276 MiB

4-bit ONNX, WebGPU with WASM fallback

Training compute
61 min

one free Kaggle T4 GPU

What I built

  • The dataset: 7,376 Spider pairs converted to DuckDB and kept only when results match SQLite, plus 591 synthetic pairs kept only when independent models' queries agree.
  • A LoRA fine-tune of Qwen2.5-Coder-0.5B with PyTorch, TRL, and PEFT, merged and exported to 4-bit ONNX (q4f16 for WebGPU, q4 for WASM). The fp32 export matches PyTorch on 20/20 parity prompts.
  • A release gate: a model ships only if the exact file the browser downloads beats the base model and the previous release. A weekly job re-checks it, and an offline end-to-end test loads the real model, cuts the network, and answers.
  • A local-first cascade: on Spider dev it beats a 120B API model alone (75% vs 73%) with 59% fewer API calls.
  • PyTorch
  • Transformers
  • PEFT
  • TRL
  • ONNX
  • Transformers.js
  • WebGPU
  • DuckDB-WASM
Fine-tuning, measured on the shipped artifact Execution accuracy of the 4-bit browser model, before and after.
Test set and modelExecution accuracy
Spider dev · 981 questions
Base model30.9%
PocketSQL49.3%
Demo databases · 100 questions
Base model29%
PocketSQL45%

What didn't work: training on Spider alone (v1) raised Spider-dev accuracy but dropped the demo-database test from 29% to 20%. The release gate refused it; 591 targeted synthetic pairs fixed it in v2.

How I work

Engineering habits that transfer to your team

A demo that works once is easy. These are the habits that keep AI features correct after launch, each backed by a project above.

  1. Measure on held-out data

    I split eval sets before tuning and keep test data out of training; PocketSQL checks for leakage in CI. FilingLens' test split ran exactly once, for the release numbers.

  2. Gate quality in CI

    Retrieval recall, agent success, and model accuracy all have regression gates. One caught a prompt edit that passed every unit test but cut agent success nearly in half.

  3. Design for untrusted input

    Prompt injection is a given. I layer SQL guards, execution approval, spotlighting, and CSP egress control, then red-team each defense on its own.

  4. Ship it, then keep it running

    All three apps are live, with daily smoke tests that open an issue on failure. Browser Analyst's build fails if first-load JavaScript passes 300 KB, and two of the apps score 99 on Lighthouse's mobile performance audit.

  5. Keep costs honest

    In-browser retrieval and inference, provider fallback chains, and answer caching mean all three run for $0/month, and degrade gracefully when free quotas run out.

  6. Report what didn't work

    A reranker that hurt recall, a training run the gate rejected, a model that wouldn't ask for clarification: I write down failures so the next decision is better.

Experience

4+ years shipping production software

Software Engineer (Unity, C#)

Terahard Ltd · London, UK · Remote

– Present

  • Develop and maintain C# systems for commercial PC and mobile games, including Monster Mop Up (published by Yogscast Games), Dunebound Tactics, and the upcoming RuneSmith.
  • Deliver features from requirements through testing, optimization, and release, and resolve performance and integration issues in production code, working remotely with design, art, and QA.
  • Use Claude Code and OpenAI Codex daily, verifying AI-generated code through review and testing.

Education

Master of Science in Information Technology

University of the People (WSCUC-accredited) · 2026 · GPA 3.56/4.0

Bachelor of Computer Science · ESGIS, Togo · 2018–2021 · Average 15.85/20

Competitive programming

Dev Champion 2022

5th in Africa · 2nd in Togo

Languages & availability

English & French

Native or bilingual · UTC+0, flexible time-zone coverage

Skills

Toolbox, used in production-style projects

AI & ML

  • PyTorch
  • Hugging Face Transformers
  • PEFT
  • TRL
  • LoRA
  • LLM APIs
  • Prompt engineering
  • Embeddings
  • Vector databases
  • Hybrid search
  • Tool calling
  • Model evaluation
  • ONNX
  • Quantization

Languages

  • Python
  • TypeScript
  • SQL
  • C#

Engineering

  • FastAPI
  • Docker
  • GCP
  • DuckDB
  • React
  • Cloudflare Workers
  • WebGPU
  • WebAssembly
  • Git
  • GitHub Actions
  • pytest
  • Playwright
  • CI/CD

Contact

Hiring for an AI engineer? Let's talk.

I'm looking for full-time AI Engineer roles, remote from Lomé (UTC+0). Email is the fastest way to reach me.