Conversation Quality
Qualidade conversacional é moat — não decora. Findings NotebookLM (2026-06-03): alucinação, frustração e loop são os failure modes mais caros em agente financeiro. Régua oposta: detecta cedo, preempta com resposta determinística, mede continuamente.
Camada 1 — Anti-hallucination
Section titled “Camada 1 — Anti-hallucination”Cenário 021 — Agente admite limite.
Três camadas técnicas:
- Tools devolvem
{found:false}— shape uniforme quando dado não existe. Caller (LLM) distingue ausência de erro técnico via discriminador. - System prompt rule —
AgentChatinjeta fragmentoANTI_HALLUCINATION_RULE(PT-BR, hard-coded emagent/domain/). Instrui LLM a admitir + oferecer alternativa concreta. - Tool errors capturados —
AgentChatenvelopa throw em{error:true, friendly: "..."}. Stack trace não vaza pro LLM nem pro casal.
Resultado observável: agente nunca inventa saldo/prazo/regra. Falha admitindo é melhor que falha inventando.
Camada 2 — Eval harness
Section titled “Camada 2 — Eval harness”Cenário 022 — Eval harness conversacional.
Infraestrutura mínima pra regressão conversacional:
ConversationFixture— descreve N turns scriptados (LLM mock + expects observáveis) + setup do mundo.EvalRunner— Domain Service emplanning/domain/services/(capability-named igualFeasibilityCheck)..run(fixture) → EvalReport;.runAll(fixtures) → EvalSummary.MelToneGuard— helper regex-based que codifica regras do ADR 008 (sem juridiquês, ≤ 15 palavras/frase, ≤ 1 emoji/msg).
Tier strategy:
- Tier 1 (impl) — harness roda no tier
domaincomMockLanguageModelV1. Valida que tool calls esperadas acontecem na ordem certa, args batem, resposta final passa regex tolerante +MelToneGuard. - Tier 2 (deferido) — mesmo harness com LLM real, gated por
EVAL_REAL_LLM=1. Custa tokens, opt-in pra pré-launch + curadoria semanal.
Camada 3 — Edge cases preempt
Section titled “Camada 3 — Edge cases preempt”Cenário 023 — Edge cases conversacionais.
ConversationGuard em agent/domain/services/ detecta três failure modes antes do LLM:
frustrated— regex de xingamento ou caps abuse no último user message.human-request— regex/falar com (humano|pessoa|atendente|gente|alguém)/.loop—pastTurnsWithoutToolCall >= 2+ Jaccard > 0.7 entre últimas 3 user msgs.
Prioridade fixa: frustrated > human-request > loop. Emoção crua acalma primeiro.
Resposta canônica preempt (GUARD_RESPONSE_* constants, ADR 008-aligned) não passa pelo LLM — custo zero token, determinístico, tom controlado por code review.
Métricas (findings NotebookLM)
Section titled “Métricas (findings NotebookLM)”- 15 conversas canônicas pré-launch — fixture catalog. >20% erro = ajusta antes de ir ao ar.
- Curadoria semanal 30min — revisar conversas reais onde bot errou, ficou em loop, ou casal pediu humano. Transforma em fixtures novas.
- Benchmark 90% satisfaction — meta de manter sucesso em ≥ 9 de 10 turns avaliados.
- Abaixo de 70% alarme — sistema está degradando silenciosamente; ação imediata.