Hongming Zhao

AI engineer in Singapore. Nine years building production systems in regulated banking (OCBC, Trust Bank, DBS), now building multi-agent LLM systems end to end.

I build evaluation in from the start: golden sets, multi-model comparison, and designing for failure modes instead of assuming model output is correct.

Contact

Selected Work

FinSentinel

Real-time transaction risk detection for banks: Flink rules raise alerts, and AI agents investigate each one and draft a case report for a compliance analyst.

JavaSpring AIFlink

Job Hunt Agent

LangGraph supervisor coordinating narrow LLM specialists over ~2,000 job listings a day.

output tokens−61%prompt cache hit (warm)95.8%prompt cache hit (real batches)~18%
LangGraphCode private.

AI Detective

RAG over an adversarial corpus where three of eight documents are topical decoys, so similarity search actively misleads.

distractor exclusion (n=5)0.92–1.00hardest query fails25–55%

AI Usage

macOS menu bar app for Claude subscription quota, reading the desktop app's own cookie store.

macOS

What to Eat

Weekend dinner decisions for two people. My first TypeScript project, built to learn Next.js.

Next.jsTypeScriptCode private.

Adversarial Robustness Harness

A red team and a blue team co-evolve against a frozen model, producing a measurable robustness curve.

ASR@3 (n=5)20% → 0%benign false refusal (n=10)10% → 30%
PythonLangGraph

Notes

One missing try-with-resources

LangGraph4j's database checkpoint savers borrowed a JDBC connection for every checkpoint read or write and never gave it back. How I found it with a connection pool and leak detection, proved it outside my own code, and got the fix released upstream in 1.9.4.

Where the bottleneck went

A 3G fibre plan that topped out at 940 Mbps, and where the bottleneck moved each time I removed one: the WAN port, the phones' radios, a crowded channel, a gigabit cable, an access point that wasn't configured the way its app said, and finally a wall socket I hadn't thought to use.

Two Kinds of LLM Caching, and When Each One Actually Fires

Prompt caching and response caching solve different problems, and both fire under narrower conditions than the marketing suggests. One of my own tests could only ever report zero, and after a move to gpt-6-luna the default setup cost more than no cache.

LangGraph Durable Execution

A ground-up explanation of how LangGraph persists state, resumes work, travels through time, handles parallel writes, and supports human-in-the-loop.

Experience

2026-03 – 2026-08

ST Engineering · AI Engineer Intern

Let non-technical users drive 6 existing AI microservices via natural language; LangGraph intent routing plus a versioned evaluation harness.

2024-10 – 2025-08

DBS Bank · Tech Lead

Led a team of 4 delivering a pre-trade check engine across 4 regional banking systems, end to end from requirements to production.

2023-04 – 2024-09

Trust Bank Singapore · Senior Backend Engineer

Decoupled services with an event-driven architecture; built a production log monitoring dashboard; mentored new hires and ran code reviews.

2019-03 – 2023-03

OCBC Bank · API Developer

Primary technical point of contact for the OCBC Enterprise API platform, onboarding dozens of enterprise partners across 4 regions.

2017-07 – 2019-02

Avanade · Software Engineer

Government project; built RESTful services with Spring / Spring Data JPA.

2016-10 – 2017-03

OCBC Bank · API Developer Intern

Open API platform; customized OAuth2 flows.

Education

National University of Singapore — MTech, Artificial Intelligence Systems (2025 – Present)

National University of Singapore — Graduate Diploma, Systems Analysis (2016 – 2017)

Zhejiang University of Technology — BEng, Computer Science / Digital Media Technology (2012 – 2016)