I build AI systems that read risk out of messy supplier data; frontier models paired with classical and deep learning.
Then I ship them to production: cloud pipelines, dashboards, and agentic workflows that quietly remove the redundant work.
On the side, I do content creation to help machine learning become more accessible to people trying to pivot their career, while also combatting the fear mongering around AI :>
AI systems that surface supply-chain risk hiding inside complex supplier-portfolio data. A deliberately mixed approach leveraging frontier LLMs reasoning over unstructured signals, alongside traditional statistical and deep-learning models where scale and explainability demand precision.
import statsmodels.api as sm import statsmodels.formula.api as smf model = smf.logit("disrupted ~ cfr_score + leverage_ratio", data=df) res = model.fit(disp=0) print(res.summary().tables[1]) ==================================================== coef std err z P>|z| ---------------------------------------------------- Intercept 1.4208 0.312 4.554 0.000 cfr_score -0.8942 0.141 -6.342 0.000 leverage 0.5137 0.183 2.807 0.005 ====================================================
Data-analysis pipelines deployed on Cloud Run and orchestrated by Cloud Scheduler, so they run reliably and on time. BigQuery is the analytical warehouse; results surface as living dashboards in Looker Studio (Data Studio).
$ gcloud builds submit --tag gcr.io/supply-risk/engine:v2.1 $ gcloud run deploy risk-pipeline-service \ --image gcr.io/supply-risk/engine:v2.1 \ --region europe-west2 --no-allow-unauthenticated Deploying container to Cloud Run service [risk-pipeline-service]... ✓ Service deployed successfully. URL: https://risk-pipeline-service-uk-an.a.run.app $ gcloud scheduler jobs create http daily-risk-evaluation \ --schedule="0 6 * * 1-5" --location=europe-west2 \ --uri="https://risk-pipeline-service-uk-an.a.run.app/run"
Agentic systems in LangGraph that automate the redundant, repetitive work spread across departments in supply-chain risk management; chaining tools and models into reliable workflows, so human attention is reserved for the judgement calls that need it.
from langgraph.graph import StateGraph, END workflow = StateGraph(SupplierState) workflow.add_node("fetch_news", scrape_unstructured_signals) workflow.add_node("assess_risk", model_reasoning_node) workflow.add_node("escalate", human_in_the_loop_approval) workflow.set_entry_point("fetch_news") workflow.add_edge("fetch_news", "assess_risk") workflow.add_conditional_edges( "assess_risk", lambda state: "escalate" if state["score"] > 0.75 else END ) app = workflow.compile()