Atomic facts, not chunks
Chunking by token window splits a claim from its context. Indexing extracted facts gives the retriever units that stand on their own, so a generated report traces back to a source.
I work on RAG architecture, LangGraph agent orchestration, and the GCP infrastructure under both. My graduation project runs inside OCP Group. I am currently building a hybrid-RAG platform on GCP for a client.
What I do
Most of my work is retrieval design. How documents get decomposed, indexed, retrieved and reranked decides whether a model answers reliably over a corpus it never saw in training.
On top of that I build the agent orchestration in LangGraph, with error recovery and human validation checkpoints. Underneath, the GCP infrastructure that runs it: Terraform, Cloud Run, Cloud SQL, Vertex AI.
I work freelance and solo, so I also scope the engagement, price it, and renegotiate when the spec moves.
Flagship case study
Groupe OCP subsidiary. Graduation project, defended 22 June 2026.
Analysts wrote documentary-analysis reports by hand from large, mixed-format internal corpora. A naive RAG pass over that material returns plausible text with no traceable grounding, which is useless for a report someone has to sign.
LangGraph orchestration behind FastAPI, with a React supervision UI over WebSocket. Retrieval indexes extracted facts, questions and atomic facts rather than raw chunks, in Milvus with Qwen Embedding 4B, retrieved by bi-encoder and reranked with BAAI/bge-reranker-v2-m3.
Deployed on OCP servers and used internally by the group. Supervisors: Pr. Samih Lazaiz (ENSAM), M. Mohammed Zouai (OCP).
Multimodal internal documents
Facts, questions and atomic facts, not raw chunks
Milvus, Qwen Embedding 4B
Bi-encoder over the decomposed index
BAAI/bge-reranker-v2-m3
LangGraph agent graph with error recovery
Human checkpoints inside the graph
WebSocket updates to the React UI
Chunking by token window splits a claim from its context. Indexing extracted facts gives the retriever units that stand on their own, so a generated report traces back to a source.
The bi-encoder is fast and favours recall. The cross-encoder reranker is slow and favours precision. Two stages avoid compromising on a single similarity threshold.
Validation at the end of a pipeline only reports that a run was wrong. As nodes inside the graph, checkpoints stop a bad intermediate state before it reaches the rest of the report.
Currently building
fca-agentic-outlook
Cloud / AI Infrastructure Engineer, freelance
I own the GCP resource stack for an agentic RAG platform, plus part of the retrieval strategy. The engagement is active.
Vertex AI RAG Engine does strong semantic search over a large corpus, but its native filtering and metadata search are limited. pgvector handles the filtered queries. Combining both beats either alone.
Cloud Run, Vertex AI RAG Engine, Cloud SQL and storage buckets, defined as code and applied from GitLab CI. The environment is reproducible instead of clicked together in a console.
GitLab CI authenticates to GCP through Workload Identity Federation instead of a long-lived JSON key. Nothing secret sits in the repository or the CI variables.
The Auth Proxy reaches a private Cloud SQL instance by impersonating a service account, so no developer account gets direct database access.
Case studies
Four client engagements.
A pre-launch logistics startup had to know whether a two-hour slot could be honoured before promising it. Three systems each hold part of the answer and none agree by default.
An eligibility engine answering under 300ms at p95, with atomic stock reservation and weighted hourly capacity, on an append-only event journal with periodic cross-system reconciliation. Three production APIs: Shopify Admin/GraphQL over OAuth client credentials, Odoo XML-RPC, and Onfleet REST plus webhooks with HMAC verification.
I negotiated the two-phase proposal (36 days, €2,650) from a 15+ page spec, pricing the gaps between stated scope and actual requirements. Also set up VPS deployment, Git CI/CD and secrets management.
Freelance engineer, 36 days in two phases
Three organisation types share one lifecycle. Expert assessors record damage, insurers validate and release the dossier, approved scrap dealers bid. Each needs a different view, and the dossier must freeze the moment an auction opens.
A four-tier role system with a strict validation workflow, and a custom auction engine: per-bidder ceilings locked at 30% above each bidder's own opening bid, minimum increments that change in the final hour, and visibility limited to whether a bidder currently leads. All enforced server-side with row-level locking, with idempotent scheduled closure for shared hosting.
Delivered the spec, data model, API contract, design system and implementation across two releases, so the client could validate the core workflow before funding the rest. The ceiling rule and the increment rule turned out to conflict, which I found while writing the spec.
Freelance engineer: spec, data model, implementation
A craft brewery needed prospects across two motions, B2B distribution and events, with no sales team to research them.
A Python orchestrator runs cross-source web research, extracts name, city, website, email, phone, contact and source, deduplicates, then scores each prospect A+ to D on potential volume, seasonality and contact reliability before hand-off into two HubSpot pipelines.
Delivered with Lemlist sequences that auto-stop on reply, plus deliverability setup: SPF/DKIM/DMARC, progressive volume ramp-up and invalid-address cleanup. Won on a job-platform bid under €500.
Freelance, solo: scoping through hand-off
Companies needed to study metrics by instrument, axis and theme, benchmark against their sector, and get a report an expert would sign, starting from balance sheets that arrive as documents in any currency.
Three hard parts: a formula interpreter so each instrument carries its own computation instead of being hard-coded, currency detection and conversion to one unified currency, and value extraction from balance-sheet documents. On top, generated Word reports with computed KPIs.
I led the build as Technical Lead, client-facing, coordinating the dev team.
Technical Lead, freelance
Timeline
Some roles run concurrently: freelance work overlaps with employment.
2026, ongoingFreelance
Provisioning the GCP stack for an agentic RAG platform in Terraform: Cloud Run, Vertex AI RAG Engine, Cloud SQL, storage buckets, authenticated through Workload Identity Federation and wired into GitLab CI. I also own part of the retrieval strategy, a hybrid design pairing Vertex AI RAG Engine with pgvector for filtered queries.
March – August 2026Graduation project
Built a multi-agent platform that automates documentary-analysis report generation over a multimodal RAG architecture, deployed on OCP servers and used internally by the group. LangGraph orchestration behind FastAPI, React supervision UI over WebSocket, retrieval on atomic-fact decomposition indexed in Milvus.
July 2026Freelance, solo
Built a prospecting system for a craft brewery across HubSpot and Lemlist, on two pipelines. A Python orchestrator runs cross-source web research, deduplicates, and scores prospects A+ to D before hand-off. Also set up Lemlist sequences and email deliverability.
2026, 36 daysFreelance
Built a two-hour delivery test bench for a pre-launch logistics startup, orchestrating Shopify, Odoo and Onfleet around an eligibility engine under 300ms at p95 and an event-sourced journal. Negotiated the two-phase proposal from a 15+ page spec.
2026Freelance, in development
Rebuilding a B2B salvage-vehicle auction platform for Moroccan insurers, connecting expert assessors, insurers and scrap dealers. Four-tier roles, strict validation workflow, dossier frozen once an auction opens, and a custom auction engine enforced server-side with row-level locking.
February 2026Internship
Automated invoice extraction and analysis on a locally-deployed n8n instance, feeding a dashboard that supports board decisions and flags entities engaged in fraud.
September 2025 – June 2026Part-time
The broadest role here: software, automation, data engineering and infrastructure. Refactored and deployed 10+ client sites, configured Postfix and SMTP relay for an internal mailer, built FormaFastScraper for contact enrichment, and a daily marketplace scraping pipeline on Spark. Also Linux administration, SSL/TLS and incident response, including a ransomware incident on a test database.
June – September 2025Freelance
Financial analysis platform for studying financial health by instrument, axis and theme, with sector benchmarking and generated Word reports. The hard parts were a formula interpreter per instrument, currency detection and unification, and value extraction from balance sheets.
June – November 2025Internship → freelance
Full-stack recruitment platform covering applications, assessments and interviews. I led the technical vision, coordinated the dev team and bridged client and team. Role-based access, real-time analytics, CV building and interview prep. Deployed on a VPS with Nginx and Certbot.
June – August 2024Internship
Built KanBanPro, a Jira-style project management platform with Kanban boards, real-time collaboration and chat over WebSockets, and multi-user management per project.
Archive
Personal, academic and side work.
Generates, tests and deploys full-stack projects from a natural-language description, using Gemini and the Model Context Protocol. Two-stage test/production pipeline with manual validation.
Automated exam grading. Tesseract pulls text off scanned papers, an LLM generates the model answer, and sentence-transformer similarity scores the student. Presented at ENSAM Casablanca's AGIOS day.
Recruitment workflow from application to interview: automated assessments, role-based access for candidate, recruiter and admin, real-time KPIs, CV building and interview prep.
Per-instrument formula interpretation, currency unification, balance-sheet extraction and generated Word reports. Full case study above.
A Medium-style publishing platform built in two weeks with a classmate. Next.js front end, Laravel back end for auth, REST APIs and article management.
Builds a knowledge base from a whole website: recursive multi-page scraping with JS rendering, hybrid semantic and TF-IDF ranking, FAISS search, and an MCP server so an agent can query it.
A CNN-LSTM model on a ResNet50 backbone, built around the CTC-loss alignment problem on long sequences. Notebook published on Kaggle.
Classroom attendance by facial recognition, with Redis caching so it stays usable when a whole class arrives at once.
Auth, order, product, payment and file services, each with its own PostgreSQL, behind a JWT API gateway. Event-driven over RabbitMQ and Kafka, on Kubernetes after migrating off Docker Compose.
A CMS for rehabilitation agencies. Patients manage their own exercise routines, and an initial assessment tailors the programme by condition and age. Built after my own scoliosis rehab.
A daily Airflow pipeline that scrapes 1,000+ products, cleans and validates them, and loads PostgreSQL, with a Streamlit dashboard for price and discount tracking. CI/CD on GitHub Actions with pytest.
Resolves full identity and contact data from a name alone. Anti-bot work throughout: Selenium migrated to nodriver, human-like delays, automatic pause on captcha. spaCy NER for extraction, geocoding for location.
A daily Apache Spark pipeline that scrapes marketplace listings, then cleans and reorganises the data before loading a remote MySQL instance.
A locally-deployed n8n instance that automates invoice extraction and analysis, feeding a dashboard that supports board decisions and flags entities engaged in fraud.
Toolset
Tools with real project work behind them.
Background
École Nationale Supérieure d'Arts et Métiers
Engineering degree, Artificial Intelligence & Software Engineering
2021 – 2026
Ranked 1st in the graduating class. Graduation project defended 22 June 2026 at OCP Solutions.
Data Science & Data Analyst career tracks
Certified coursework: regression, classification, statistical inference
Certification
Listed as coursework, not applied production ML.