Skip to content

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.

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 ruleAgentChat injeta fragmento ANTI_HALLUCINATION_RULE (PT-BR, hard-coded em agent/domain/). Instrui LLM a admitir + oferecer alternativa concreta.
  • Tool errors capturadosAgentChat envelopa 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.

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 em planning/domain/services/ (capability-named igual FeasibilityCheck). .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 domain com MockLanguageModelV1. 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.

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)/.
  • looppastTurnsWithoutToolCall >= 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.

  • 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.