GenAI & contact centre
Turning 40,000 support calls a month into a product backlog
Diarised transcription, an LLM extraction pipeline with a graded evaluation set, and a review console where quality leads correct the model in place.
- Calls reviewed
- a small sample → 100% analysed
- Extraction accuracy on the graded set
- a substantial improvement
- Time to a themed monthly report
- weeks → same day
- Sector
- Consumer services contact centre
- Volume
- ~40,000 calls/month, 3 languages
- Engagement
- Proof of value, then delivery pod
- Duration
- 6 months to production
Stack
- Whisper
- pyannote
- Claude
- GPT-4 class models
- pgvector
- Ragas
- FastAPI
- React
- Airflow
Practices involved
Discuss a similar problemThe situation
Quality analysts listened to about 2% of calls, scored them against a rubric, and wrote a monthly summary. Product and operations both suspected the summary reflected which calls got sampled more than what customers were experiencing, but nobody could argue with it because there was no alternative.
The constraint
Three languages, frequent code-switching mid-sentence, background noise, and audio quality that varied by channel. Recordings contain personal and payment information. And a prior vendor pilot had produced confident-sounding summaries that the quality team spot-checked, disagreed with, and abandoned — so the bar for trust was high and the memory was recent.
What we built
The graded set, first
Before any pipeline, we sat with two quality leads and built 180 calls with agreed expected outputs: the reason for contact, whether it was resolved, the products mentioned, the compliance flags, and the customer sentiment at open and close. That set became the acceptance criteria, the regression suite, and the thing that ended arguments about whether a change helped.
Transcription tuned for the actual audio
Speaker diarisation to separate agent from customer, language identification per segment, and a custom vocabulary of product names, plan names and local place names. Redaction of card numbers and identifiers happens before text leaves the processing boundary, and the redaction is checked against its own test set.
Extraction with structure, not summarisation
The model is asked for a defined schema with explicit "not stated" options, and it must cite the transcript span supporting each field. Output is validated against the schema; a failure is retried once and then queued for review. Free-text summarisation exists, but no downstream metric depends on it.
Evaluation in the pipeline
Every prompt, model or vocabulary change runs the graded set in CI and reports per-field F1 plus a citation-faithfulness check. Two model upgrades that looked better in demos were measurably worse on two fields, and we caught both before release.
A console where disagreement is data
Quality leads review flagged and sampled calls side by side with the transcript, correct fields inline, and every correction is versioned. Corrections feed the graded set, so the evaluation baseline gets stronger the more the tool is used.
What changed
Every call is now analysed rather than a small fraction sampled, and the monthly themes report is a query rather than a project. The output that mattered most was unglamorous: a ranked list of contact reasons that turned out to be dominated by two self-service gaps, both fixed within a quarter.
What we would do differently
We under-invested in the redaction test set early, treating it as a compliance checkbox rather than a model with its own failure modes. It needed the same graded-set discipline as the extraction, and we retrofitted that in month four.
Outcomes
- Calls reviewed
- a small sample → 100% analysed
- Extraction accuracy on the graded set
- a substantial improvement
- Time to a themed monthly report
- weeks → same day
Client identity withheld under a mutual NDA. Figures are illustrative — rounded and directional, meant to show the shape of the change rather than an audited result. We will walk through the real numbers, and how they were measured, under NDA on a call.
More work
Other engagements.
Case studiesCutting stockouts across 240 stores with a forecast the buyers trust
A hierarchical demand forecast, a promo-aware feature store and a replenishment workflow the category team can override — because a model nobody overrides is a model nobody uses.
Read the case studyShipping firmware to 6,000 imaging consoles without a truck roll
A signed, resumable, rollback-safe update channel for regulated ultrasound hardware sitting on hospital networks that block almost everything.
Read the case studyA reproducible pipeline for a diagnostics lab that had outgrown its scripts
Genomic and assay data moving from instruments to reportable results, with provenance for every derived value and a turnaround clock the lab director can see.
Read the case studyNext step
Tell us what you're trying to ship.
Send the brief, the RFP, or three messy sentences about the problem. You get a written point of view from an architect within two working days — not a sales deck.