V
All projects
Case study

Conversational Intelligence

225,000+ conversations · five source systems · live org-wide

Architecture of the conversational intelligence platform: five upstream systems consolidating into a canonical interactions layer, batch LLM enrichment, structure-aware chunking, hybrid retrieval, and a ReAct router serving a chat and filter interface

What it does

An internal chat-and-filter interface over the company's call and chat transcripts in BigQuery. You either apply structured filters -- rep, date, channel, disposition -- or ask a question in plain language, and get an answer grounded in what customers actually said, with citations back to the specific interaction. It is live in production and used across the organization.

The corpus, and where my work starts

The corpus is over 225,000 conversations, roughly 4 GB, consolidated from five upstream systems: Intercom chat and email plus four phone and video sources. The transcripts themselves are generated by the platforms the calls run on; everything downstream of them is mine.

Resolving an append-only replica

The source is an append-only Datastream CDC replica, so the same conversation exists in several row versions. A canonical view layer resolves to the latest version per id and drops tombstones once, so nothing downstream ever touches the raw replica -- which is also why the headline number is a distinct-conversation count rather than an inflated row count.

Enrichment, chunking, and retrieval

Enrichment runs in batch at ingest rather than per query: pain point, intent, sentiment, competitor mention, and upsell or churn signal are classified once, which is what makes the structured filters trustworthy. Chunking is structure-aware, splitting on speaker turns and message boundaries rather than fixed windows, with parent-child retrieval -- search the small chunk for precision, return the parent for context. Retrieval is hybrid: BM25 lexical fused with dense vectors and then reranked, so exact terms like product and competitor names are not blurred away by embeddings. A ReAct router decides per query between SQL over the structured columns, vector search over the transcripts, or both.

Serving and the read-only boundary

Serving runs on Cloud Run behind IAP, with an original MCP server built on GCP. The read-only boundary is enforced in IAM rather than in application code: the serving service account holds only viewer and job-user roles on the analytics dataset, so a write is rejected regardless of what any tool emits.

Key results

  • 225,000+ conversations, ~4 GB
  • Five source systems consolidated
  • 12 analytics objects, daily pipeline
  • Live in production, used org-wide

Stack

BigQueryVertex AIVector SearchCloud RunMCPHybrid RetrievalDatastream CDCIAP