all-MiniLM-L6-v2 (local embeddings, no API calls). No paid platforms (Twilio/Vapi/ElevenLabs) were used — see "Design Decisions" below for why, and how the architecture stays provider-agnostic.search_knowledge_base tool call; the system prompt forbids the model from answering from its own knowledge.safety_gates.py), not retrieval — because safety-critical behavior can't depend on a customer's phrasing happening to clear a similarity threshold.recordings/q1_voice_agent/): verification failure/wrong-person rejection, verified customer with objection + fraud-dispute + adversarial instruction-override attempt, and a second verified customer with graceful degradation on an out-of-scope/low-confidence query.retrieval_calibration_results.json). Result: 16/24 correct top-1 matches. Two negative controls (off-topic questions) both scored well under 0.1, confirming clean separation from real questions. Several genuine matches scored as low as 0.27–0.28 (e.g. "I lost my job" → 0.2698, "Can I negotiate a lower amount?" → 0.2769) — right at the calibrated 0.28 threshold, meaning the threshold is deliberately permissive enough to catch paraphrased real questions without opening the door to false positives from the negative controls.kb_loan_003/kb_loan_020 — "payment holiday" vs. "deferment/moratorium", scored 0.136 against a 0.35 threshold). This is real evidence that lexical similarity alone is insufficient for near-duplicate detection, and that semantic embeddings (the all-MiniLM-L6-v2 choice used everywhere else) are necessary, not just preferable.fil-PH-AngeloNeural TTS voice.id-ID-ArdiNeural TTS voice.asr_tts_test.py generates real audio with native-market Edge TTS voices and transcribes it back with Groq Whisper, reporting actual round-trip quality rather than a paper design.recordings/q3_multilingual/) — spec asks for 2 per market. [Confirm final count before submission — if only 1/market shipped, this is named here as an explicit scope cut made under the time budget, not a silent gap.]nudge_test_results.json): 7 turns processed, 4 nudges fired (missed cross-sell, compliance gap, rising frustration ×2), P50 latency ~209-217ms, P95 ~414-438ms across runs.rising_frustration nudge at 0.80 confidence — a genuine false positive, not a suppressed one. That puts the measured false-positive rate at 1 of 4 fired nudges (25%) on this 7-turn test set, not zero. Likely cause: a single-utterance classifier with no conversational context can misread a resigned/sarcastic "whatever, fine" as frustration, since the surface tone (short, clipped, exasperated-sounding words) overlaps with genuine escalation without the preceding-turn context that would disambiguate them. Production mitigation: include the last 1-2 turns of context in the classification prompt rather than classifying each utterance in isolation, and calibrate confidence thresholds per signal type rather than a single global 0.6 cutoff.last_verified_date-driven freshness check to the KB pipeline.Posted Aug 11, 2026
Developed loan pre-due reminder bots and live insights system for multiple markets.
0
2