Assemble the support-triage assistant from the pieces you built — grounding it in a knowledge base and adding a confidence-based escalation path.
A primeira ferramenta interna que entreguei foi um painel de suporte: um lugar onde eu podia ver as perguntas recebidas em que meus colegas estavam se afogando. Ele me dizia o que estava acontecendo, mas ainda deixava um humano para responder cada mensagem. O trabalho interessante começou quando fiz uma pergunta mais difícil — o sistema poderia rascunhar a resposta sozinho e só trazer uma pessoa quando não tivesse certeza? Essa pergunta transformou um painel no assistente de automação de suporte de-identificado que continuei refinando depois.
Nos módulos 06 a 08 você construiu as partes desse assistente uma de cada vez: uma primeira chamada real à Anthropic, uma superfície de conhecimento da qual ele podia ler e um agente que decide o que fazer. Por conta própria, cada parte é uma demonstração. Este módulo é onde elas deixam de ser demonstrações e começam a ser um sistema — um pequeno assistente de triagem de suporte, escopado e executável, que lê uma mensagem de cliente, responde a partir do que sabe e escala quando está além de sua capacidade.
Pense nisso como uma enfermeira de triagem. Uma enfermeira não trata todo mundo do mesmo jeito: ela recebe a queixa, a compara com o que já sabe e decide em segundos se trata ela mesma ou chama o médico. Nosso assistente faz as mesmas três coisas — ler, comparar, decidir — e o ponto inteiro deste projeto final é conectar esses três movimentos em um fluxo honesto.
Ideia-chave: um assistente de suporte útil não é o que responde a tudo. É o que conhece a fronteira do que pode responder, e cruza essa fronteira de propósito.
Ao final você terá um único arquivo que pode rodar que recebe uma mensagem e retorna ou uma resposta ancorada ou uma passagem limpa a um humano — nenhum café, nenhum negócio de desenho animado, apenas o formato real do assistente para o qual esta trilha vem construindo.
Antes de qualquer código, vamos nomear as três responsabilidades e como os módulos anteriores as alimentam. Manter a construção tão pequena é deliberado: cada linha tem que justificar seu lugar, porque um assistente de suporte difícil de raciocinar é um assistente de suporte em que você não pode confiar.
Os dados fluem em uma direção: uma mensagem chega, retrieve a ancora, triage raciocina
sobre ela, e escalate decide quem responde. Não há orquestração paralela nem estado
oculto — apenas um pipeline curto que você consegue guardar na cabeça.
Armadilha comum: é tentador tornar o projeto final "impressionante" adicionando filas, bancos de dados e uma dúzia de agentes. Resista. A confiabilidade vem de um fluxo que você consegue explicar totalmente, não de área de superfície.
Antes de escrever uma linha: dos três movimentos — recuperar, triar, escalar — qual é o único que deveria sempre falar com o modelo de linguagem, e por que manter os outros dois como Python comum torna o sistema mais fácil de confiar?
Um assistente de suporte é só tão honesto quanto os fatos que você lhe dá. Em vez de esperar que o modelo lembre do seu produto, entregamos a ele uma pequena base de conhecimento e uma função que encontra a entrada mais próxima. Este é o mesmo instinto por trás do sistema de recuperação no meu trabalho de automação de suporte: ancore o modelo na sua verdade para que ele não possa inventar política com confiança.
Note a última linha. Quando nada corresponde, retrieve retorna uma string vazia de propósito —
ele não adivinha. Esse resultado vazio é um sinal que usaremos em um momento para empurrar o modelo
para baixa confiança em vez de uma alucinação confiante.
Bom padrão: um recuperador que pode retornar "não encontrei nada" é mais valioso do que um que sempre retorna seu melhor palpite. Conhecer a lacuna é a primeira metade de lidar com ela.
Aqui está o único lugar onde o sistema fala com o modelo. Damos a ele o contexto recuperado, pedimos
que classifique a mensagem, rascunhe uma resposta curta usando apenas esse contexto e — crucialmente —
reporte uma confiança na primeira linha para que o resto do nosso fluxo em Python puro possa agir sobre ela. Usamos
claude-haiku-4-5: é rápido e barato, que é exatamente o que você quer para triagem de
alto volume onde a maioria das mensagens é rotineira.
Duas escolhas de design fazem o trabalho pesado. Primeiro, "use ONLY the provided context"
transforma o sinal de string vazia do retrieve em baixa confiança em vez de um palpite. Segundo,
forçar a confiança para a primeira linha significa que o próximo passo não precisa reanalisar texto
livre — ele lê um número e decide.
Armadilha comum: pedir ao modelo para "ser honesto sobre a incerteza" sem dar à confiança um formato fixo, legível por máquina. Se você não consegue analisá-la de forma confiável, não consegue agir sobre ela de forma confiável.
O escalonamento é onde a maioria das demonstrações de "suporte com IA" silenciosamente trapaceia — elas enviam cada resposta e torcem. A nossa torna a fronteira explícita. Lemos a confiança que o modelo reportou e, se estiver abaixo do nosso limiar (ou se não conseguirmos lê-la), encaminhamos o rascunho a uma pessoa.
O ramo except é o herói silencioso. Se o modelo um dia ignorar nosso formato, nós não travamos
e não enviamos uma mensagem misteriosa — falhamos de forma segura, em direção a um humano. No suporte em produção,
o custo de uma resposta confiante errada é muito mais alto do que o custo de uma passagem extra, então o
padrão na dúvida é sempre "pergunte a uma pessoa."
Preveja o comportamento: um cliente pergunta "why was I double-charged this month?" — uma pergunta de
cobrança que sua KB cobre apenas parcialmente. Percorra retrieve, triage e needs_human.
Onde nesse caminho o sistema tem sua chance de escalar em vez de blefar?
Agora os três movimentos viram uma função. Este é o assistente inteiro: ancore a mensagem, raciocine sobre ela, decida quem responde. É curto o bastante para ler num fôlego — e essa é a feature, não uma limitação.
Rode-o na pergunta de exportação e você terá uma resposta ancorada e confiante. Rode-o em algo de que a KB nunca ouviu falar — "can I get a refund in EUR?" — e veja-o escalar em vez de inventar uma política. Esse contraste é a lição inteira desta trilha tornada concreta: o sistema é confiável precisamente porque conhece a própria borda.
Limites honestos: esta é uma construção didática, não um serviço endurecido. Implantações reais adicionam retentativas, registro, limites de taxa e um recuperador muito mais rico. Deixamos essas de fora de propósito para que o fluxo central permaneça legível — adicioná-las é o próximo passo natural, não um pré-requisito.
Seu limiar é 0.4. Se a liderança de suporte lhe dissesse "preferimos escalar demais do que algum dia
enviar uma resposta errada", você o elevaria ou abaixaria — e o que a escolha oposta custa
em carga de trabalho humano? Não há um único número certo aqui; o ponto é que o limiar é uma
decisão de negócio sobre a qual você agora pode raciocinar, porque você construiu a alavanca você mesmo.
Application-level questions about the assembled support-triage assistant.
1. When retrieve() finds no matching topic it returns an empty string. Why is that the right behavior for this system?
Correct Answer: B
An empty context, combined with the system prompt's 'use ONLY the provided context', steers the model to report low confidence — which is exactly the signal the escalation step needs.
2. If the model ignores the format and needs_human() can't parse a confidence value, what happens — and why was it designed that way?
Correct Answer: C
The except branch returns True so an unreadable response routes to a human. In support, an extra hand-off costs far less than sending a confidently wrong answer.
3. A customer asks 'Can I get a refund in EUR?' — a topic absent from the KB. What is the most likely outcome?
Correct Answer: A
No KB topic matches, so context is empty, confidence should fall below the threshold, and the message is escalated rather than answered from invention.
4. Why pass the retrieved context into the prompt instead of relying on the model's own training to answer product questions?
Correct Answer: B
Grounding the call in your own knowledge base keeps the assistant from confidently stating a policy that sounds right but isn't yours.
5. Why is claude-haiku-4-5 a reasonable model choice for this triage assistant?
Correct Answer: B
Triage handles many routine messages, so a fast, cheap model is a sensible default; harder cases are caught by the escalation path, not by reaching for a bigger model everywhere.
6. Leadership says 'never send a wrong answer, even if it means more hand-offs.' How should you change the threshold, and what's the cost?
Correct Answer: B
Raising the threshold makes the bar for auto-answering stricter, so more messages route to humans — safer replies at the price of more human time. The threshold is a business lever.