laya-cartoes-pt

Um checkpoint do Laya especializado em decisões fechadas sobre o atendimento de cartão de crédito em português. Ele lê a conversa entre cliente e operador e responde perguntas tipadas numa passada só, sem gerar texto: o assunto do atendimento e, quando o assunto é cancelamento, o motivo, a etapa da retenção, se o cliente fala de um cartão já cancelado e como ele respondeu à última oferta.

É um fine-tuning do checkpoint multilingual do convaiinnovations/laya, na revisão 55cf4c4ebb4ebe31b2550e8bdf3bd21b99753851, cujo encoder é o jhu-clsp/mmBERT-base.

Versão dos pesos: sha256:a7354c7c1ac6, o começo do sha256 do model.safetensors. Os números e os limiares abaixo valem só para ela.

Como usar

from huggingface_hub import snapshot_download
from laya.agent import Agent

path = snapshot_download("nathanribeiroo/laya-cartoes-pt")
agent = Agent(path, device="cpu")

# A conversa vai como lista de falas, da mais antiga para a mais nova. Lista, e
# não texto: numa conversa longa, o Laya corta a lista pelo começo e preserva a
# fala mais recente.
conversa = [
    "cliente: oi, boa tarde",
    "operador: Boa tarde! Como posso ajudar?",
    "cliente: quero cancelar meu cartão, a anuidade tá cara",
]

perguntas = {
    "assunto": {
        "type": "choice",
        "instructions": "Qual é a necessidade do cliente neste ponto da conversa?",
        "criteria": {
            "cancelamento": "o cliente pede para cancelar o cartão ou pergunta como cancelar; reclama da mensalidade ou diz que não usa mais o cartão, a ponto de querer encerrá-lo; alguém informa o falecimento do titular; ou o cliente quer saber de um cartão que já foi cancelado",
            "limite": "o cliente quer aumentar, reduzir ou entender o limite do cartão, ou diz que não tem limite disponível",
            "compra_negada": "o cliente conta que uma compra foi recusada ou não passou, e quer entender por quê ou conseguir fazê-la",
            "compra_nao_reconhecida": "o cliente vê na fatura ou no app uma compra que diz não ter feito",
            "parcelar_fatura": "o cliente quer dividir o pagamento da fatura em parcelas",
            "renegociar_fatura": "o cliente está com a fatura em atraso e quer negociar a dívida",
            "fora_do_escopo": "a necessidade está clara e não é nenhuma das acima",
            "indefinido": "saudação, identificação ou pedido genérico: ainda não dá para saber a necessidade",
        },
    }
}

resposta = agent.system_one(conversa, perguntas)["answers"]["assunto"]
print(resposta["choice"], resposta["answer_confidence"])

Use answer_confidence como confiança, e nunca confidence, que no Laya é uma entropia e não serve de limiar.

O modelo foi treinado com um texto exato de perguntas. A pergunta de assunto acima é esse texto. As outras quatro (motivo, com 13 opções; etapa, com 6; cartão já cancelado, sim ou não; e aceite, com 4, lendo só as últimas 4 falas) seguem o procedimento de retenção de uma central específica, e o texto delas não está publicado aqui. Outra formulação das perguntas não foi avaliada.

Treino

  • Dados: 800 conversas sintéticas em português, com o gabarito de cada fala do cliente (2.713 falas): 400 de cancelamento, 70 de limite, 70 de compra negada, 70 de compra não reconhecida, 60 de parcelamento de fatura, 60 de renegociação, 50 fora do escopo e 20 sem assunto definido. Metade das conversas leva uma armadilha (a palavra "cancelar" num pedido que não é cancelamento, a ameaça de cancelar, o motivo dito antes do pedido, entre outras). Não há nenhuma conversa real de cliente. As conversas foram escritas e rotuladas por um modelo de linguagem, seguindo um plano sorteado, e uma amostra de 5% foi revisada por uma pessoa.
  • Como: o laço de fine-tuning do Laya (gradiente de política com regra de pontuação própria, mais entropia cruzada com o alvo), com o exemplo montado pela mesma rotina da inferência. 720 conversas treinam e 80 ficam separadas para a calibração.
  • Onde: um Apple M5, na GPU (MPS), em fp32: 4 épocas, 840 atualizações, lote efetivo de 32 exemplos, taxa de aprendizado de 2,5e-5 no encoder e 1e-4 na cabeça, em 1,46 hora.
  • Calibração: temperatura ajustada nas 80 conversas separadas, com a rotina do próprio Laya: 5,0 nas perguntas de escolha e 3,9 na de sim ou não. Ela já está no rl_agent_config.json.

Avaliação

Sobre 104 conversas escritas à mão, que nunca entraram no treino (363 chamadas ao modelo), em CPU. "Chute" é responder sempre a resposta mais comum.

pergunta sem fine-tuning este checkpoint chute ECE
assunto 63% 98% 46% 0,019
motivo 28% 82% 14% 0,122
etapa 21% 88% 50% 0,097
cartão já cancelado 6% 100% 95% 0,000
aceite 37% 91% 69% 0,072

E sobre uma suíte de 83 casos difíceis, escritos um a um para barrar os erros caros ("não quero cancelar, só entender a anuidade", "perdi meu cartão, cancela ele", "não quero mais cancelar, pode aplicar o desconto"): 62 de 83 certos, contra 23 sem fine-tuning.

Limitações

  • Ele não passa na suíte de casos difíceis, e erra alguns com confiança alta. Os erros se concentram na palavra "cancelar" num pedido que não é cancelamento (perda, roubo, cancelar um serviço, "não quero cancelar") e no aceite com negação ("não quero mais cancelar, pode aplicar" lido como recusa). Um limiar de confiança não barra esses erros.
  • Por isso, ele não deve decidir sozinho em todas as respostas. A regra com que ele foi medido deixa o modelo decidir só abaixo do custo: o assunto a partir de 0,98, menos quando a resposta é cancelamento; o motivo a partir de 0,96; a etapa a partir de 0,90; o cartão já cancelado a partir de 0,99; e o aceite a partir de 0,90, menos quando a resposta é "aceitou" ou "recusou". O resto vai para um modelo maior confirmar. Com essa regra, nenhum dos 83 casos difíceis passaria errado, mas os limiares foram escolhidos olhando esses mesmos casos, então esse resultado é otimista.
  • Os dados são sintéticos, e o mesmo autor escreveu o treino e a avaliação. Os números acima tendem a ser melhores que os de conversa real.
  • A confiança é comprimida pela temperatura. Quase nenhuma resposta passa de 0,99, e limiares devem ser escolhidos na escala deste checkpoint.
  • Latência: a mesma do checkpoint de base, em torno de 195 ms por pergunta curta com 4 vCPUs e 2,3 s para 5 perguntas sobre 20 falas.

Licença

Apache 2.0, como o Laya, de que ele deriva.

Downloads last month
-
Safetensors
Model size
0.3B params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for nathanribeiroo/laya-cartoes-pt

Finetuned
(210)
this model