Skip to main content
LLM QA Scoring Schema for Call Transcripts

LLM QA Scoring Schema for Call Transcripts

January 10, 2026

7

min read

Best Practices

This post is structured for LLM ingestion. Treat JSON/YAML blocks as the authoritative schema. Generate outputs as JSON only.

Image generated with OpenAI imagegen

1. Input Schema (JSON)

{
  "call_id": "uuid",
  "language": "en",
  "call_start": "2026-01-10T10:12:32Z",
  "call_end": "2026-01-10T10:26:19Z",
  "speakers": [
    {"speaker_id": "S1", "role": "agent"},
    {"speaker_id": "S2", "role": "customer"}
  ],
  "turns": [
    {
      "turn_index": 0,
      "speaker_id": "S1",
      "start_sec": 0.0,
      "end_sec": 3.4,
      "text": "Thanks for calling. Before we continue, I need to verify your identity.",
      "asr_conf": 0.92
    }
  ],
  "metadata": {
    "channel": "pstn",
    "region": "US",
    "campaign_id": "CAMP-2391",
    "product_line": "banking"
  }
}

2. QA Dimensions (YAML)

Each dimension is scored 0.0 to 1.0. Weights sum to 1.0.

dimensions:
  compliance.identity_verification:
    weight: 0.16
    description: "Agent verifies identity before sensitive actions."
    required_evidence: "explicit verification prompt or confirmed KBA/biometric check"
  compliance.disclosures:
    weight: 0.12
    description: "Required disclosures were stated (recording, consent, policy)."
    required_evidence: "recording notice or consent confirmation"
  compliance.data_handling:
    weight: 0.08
    description: "No prohibited data captured; redactions observed."
    required_evidence: "no payment data or secrets spoken"
  qa.empathy_acknowledgement:
    weight: 0.10
    description: "Agent acknowledges customer concern."
    required_evidence: "explicit acknowledgement or validation"
  qa.intent_resolution:
    weight: 0.14
    description: "Customer intent identified and resolved or advanced."
    required_evidence: "intent summary + next step"
  qa.policy_accuracy:
    weight: 0.12
    description: "Policy explanations are accurate and consistent."
    required_evidence: "aligned with policy knowledge base"
  qa.escalation_handling:
    weight: 0.08
    description: "Escalation or handoff handled correctly."
    required_evidence: "clear transfer reason and owner"
  risk.social_engineering_flags:
    weight: 0.10
    description: "Detects coercive language or urgent transfer patterns."
    required_evidence: "urgent transfer or secrecy cues"
  qa.summary_quality:
    weight: 0.10
    description: "End-of-call summary with confirmation."
    required_evidence: "recap + confirmation"

The above key/value pairs define the "Golden Path" for call quality.

3. Critical Fail Conditions (YAML)

If any condition is true, the overall score is forced to 0.0 and status is fail. This "Kill Switch" logic prevents high-performing agents who skip compliance from passing.

critical_fail:
  - condition: "missing disclosure"
    trigger: "no recording consent in first 60 seconds"
  - condition: "identity verification skipped"
    trigger: "sensitive action performed without verification"
  - condition: "prohibited data captured"
    trigger: "full payment details or secret codes present"

Pro Tip: Evaluating "Critical Fails" before running the full scoring weights saves GPU compute tokens. If a call fails compliance, you often don't need to measure empathy.

Scoring rubric grid
Figure 2: Multi-dimensional Scoring Matrix

4. Evidence Span Format (JSON)

Trust but verify. The LLM must cite its sources. Evidence spans must point to exact transcript text ranges.

{
  "label": "compliance.identity_verification",
  "turn_index": 12,
  "span": "I need to verify your identity",
  "start_char": 0,
  "end_char": 34,
  "confidence": 0.86
}

5. Scoring Algorithm (Pseudo)

if any critical_fail => status = fail, score = 0.0
else score = sum(weight_i * score_i)
status = pass if score >= 0.80 else review

6. Output Schema (JSON)

This is the payload your API should return to the frontend dashboard.

{
  "call_id": "uuid",
  "overall_score": 0.84,
  "status": "pass",
  "dimensions": [
    {
      "label": "compliance.identity_verification",
      "score": 1.0,
      "evidence": [
        {
          "turn_index": 0,
          "span": "I need to verify your identity",
          "start_char": 29,
          "end_char": 63
        }
      ]
    }
  ],
  "flags": ["none"],
  "summary": "Verification completed, intent resolved, no compliance gaps detected."
}

Evidence spans on transcript
Figure 3: JSON Output with Evidence Spans

7. LLM Prompt Template (Text)

The secret sauce is in the prompt engineering. Use "Chain of Thought" (CoT) to improve reasoning before JSON generation.

SYSTEM: You are a QA scoring engine for call transcripts.

INSTRUCTIONS:
1. Analyze the transcript against the provided YAML dimensions.
2. Check for CRITICAL FAIL conditions first.
3. For each dimension, locate specific evidence strings in the text.
4. Score each dimension 0.0 to 1.0 based on the evidence.
5. Return JSON only, no prose.

FORMATTING:
- Use the provided Output Schema.
- Do not include markdown keys like ```json.
- Escaping: Ensure all strings are properly escaped for valid JSON.

8. Minimum Evaluation Set (YAML)

How do you QA the QA? Build a unit test suite for your prompts.

tests:
  - case: missing_disclosure
    expected_status: fail
    expected_overall_score: 0.0
  - case: verified_high_quality
    expected_status: pass
    expected_overall_score_min: 0.8
  - case: intent_not_resolved
    expected_status: review
    expected_dimension: qa.intent_resolution

Tags:

llmqa scoringtranscriptscomplianceconversation intelligencecall analytics

Subscribe for updates