Skip to content

AI Innovation: Embedded, Not Bolted On

Five AI capabilities wired into Asurion's claims workflow — not a ChatGPT wrapper


What separates this from "just call an LLM"

Generic AI approach What we built
Data access Free-text NL-to-SQL against unknown schema Catalog-anchored SQL gen with data dictionary + safety layer
Decisions AI makes the call Rules decide — AI narrates the reasoning in plain language
Model strategy "Call Claude and hope" Two-tier model policy tuned per workload
User experience Generic chatbot: "what do you want?" LangGraph Clarifier resolves against Asurion's metric catalog
Data Prototype with synthetic data 3 live Databricks metrics querying real Asurion claim data

Five capabilities

Catalog-anchored SQL generation

Not free-text NL-to-SQL

SQL generation starts from a metrics_catalog row — not arbitrary user text. The data dictionary (52 tables, 1,663 columns, 138 joins) provides schema context. sqlglot enforces structural safety: SELECT-only, table allowlist, automatic LIMIT injection.

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1e293b', 'primaryTextColor': '#f8fafc', 'lineColor': '#64748b', 'fontSize': '13px'}} }%%
graph LR
    M["<b>Metric Catalog</b><br/>cost_avoided_mtd"]
    D["<b>Data Dictionary</b><br/>52 tables / 1,663 cols"]
    B["<b>Bedrock</b><br/>Sonnet 4.6"]
    S["<b>sqlglot Safety</b><br/>parse + validate"]
    DB["<b>Databricks</b><br/>execute query"]

    M --> B
    D --> B
    B --> S
    S -->|"safe SQL only"| DB

    classDef catalogNode fill:#3b82f6,stroke:#1d4ed8,color:#fff,stroke-width:2px,rx:8
    classDef dictNode fill:#8b5cf6,stroke:#6d28d9,color:#fff,stroke-width:2px,rx:8
    classDef bedrockNode fill:#6366f1,stroke:#4f46e5,color:#fff,stroke-width:2px,rx:8
    classDef safetyNode fill:#f59e0b,stroke:#d97706,color:#1e293b,stroke-width:2px,rx:8
    classDef dbNode fill:#22c55e,stroke:#15803d,color:#fff,stroke-width:2px,rx:8

    class M catalogNode
    class D dictNode
    class B bedrockNode
    class S safetyNode
    class DB dbNode

LangGraph Clarifier with metric matching

Not a blank text box

An 8-node state machine. The metricMatcher node auto-resolves "cost avoided" against the catalog before asking any questions. Operators see their actual metrics with definitions — not a generic prompt.

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1e293b', 'primaryTextColor': '#f8fafc', 'lineColor': '#64748b', 'fontSize': '13px'}} }%%
graph LR
    CL["<b>Context<br/>Loader</b>"]
    IE["<b>Intent<br/>Extractor</b>"]
    MM["<b>Metric<br/>Matcher</b>"]
    GD["<b>Gap<br/>Detector</b>"]
    HITL["<b>HITL<br/>Pause</b>"]
    QP["<b>Question<br/>Prioritizer</b>"]
    SS["<b>Spec<br/>Synthesizer</b>"]
    CR["<b>Critic</b>"]

    CL --> IE --> MM --> GD
    GD -->|"gaps found"| HITL
    GD -->|"no gaps"| QP
    HITL --> QP --> SS --> CR

    classDef startNode fill:#3b82f6,stroke:#1d4ed8,color:#fff,stroke-width:2px,rx:8
    classDef aiNode fill:#6366f1,stroke:#4f46e5,color:#fff,stroke-width:2px,rx:8
    classDef matchNode fill:#8b5cf6,stroke:#6d28d9,color:#fff,stroke-width:2px,rx:8
    classDef hitlNode fill:#f59e0b,stroke:#d97706,color:#1e293b,stroke-width:3px,rx:8
    classDef synthNode fill:#22c55e,stroke:#15803d,color:#fff,stroke-width:2px,rx:8

    class CL startNode
    class IE,GD,QP aiNode
    class MM matchNode
    class HITL hitlNode
    class SS,CR synthNode

Two-tier Bedrock model policy

Right model for the right job

Not one model for everything. Two tiers, tuned per workload (ADR-011).

Latency budget: <3s

  • Intent extraction
  • SQL generation
  • Safety layer catches errors — speed matters more than depth

Quality over speed

  • Spec synthesis (KPI / chart / table / custom)
  • Custom widget codegen
  • Complex reasoning where accuracy matters more than latency

AI narrates, never decides

Deterministic decisions, AI-powered explanations

Rules and weighted scoring pick the action (repair vs replace). Bedrock explains why — using Asurion's own reason codes.

Example reason codes

1
2
3
4
coverage_valid
battery_health_drop_detected
nearest_store_slot_available
repair_cost_below_threshold
These are Asurion's claims vocabulary — not generic labels. Template fallback guarantees the demo never breaks (ADR-003).


Custom widget codegen

Safe browser-side compilation

The LLM generates TSX for ops-specific views. @babel/standalone compiles it in a sealed scope — React + Icons only. No imports, no network access, no escape. Mock data derived from operator examples, not type signatures.


Eval harness — we test our AI

Automated LLM output evaluation

  • Reuses production LangGraph nodes (no separate eval copy)
  • 7 static checks + tsc --noEmit type validation
  • Captures full Bedrock request/response for audit
  • Artifacts archived at artifacts/clarifier-eval/

Judges look for evals. We have them.


Speaker notes (60-90s)
  • Start with the comparison table — it preempts the #1 judge objection: "isn't this just a ChatGPT wrapper?"
  • Speed through all 5 capabilities — hit the headlines, not the implementation details.
  • Land on: "Every capability is wired into Asurion's domain. The metric catalog has Asurion's KPIs. The dictionary has Asurion's EDW schema. The reason codes are Asurion's claims vocabulary."
  • Mention the eval harness briefly — judges specifically look for "evals" in technical implementation.
  • If asked about the two-tier policy: "Sonnet for speed, Opus for depth. Each call site picks the right tier."