Quase toda plataforma acaba com o mesmo desperdício: todo pedido que chega passa pelo componente mais caro que existe no sistema. Uma pergunta de “onde está meu pedido” — que é uma consulta a banco — atravessa o mesmo modelo de linguagem grande que responde a uma reclamação delicada.
O roteamento de intenção corrige isso com uma inversão simples: classifique primeiro, barato, e só depois acione o executor adequado. A documentação oficial descreve o Jev sentado na frente de todos os executores como um classificador rápido que decide qual deles é invocado.
O desenho do exemplo oficial
O cenário é atendimento ao cliente. Duas perguntas na mesma chamada:
- um Choice com quatro intenções:
order_status,product_question,return_exchange,complaint; - um Score com três níveis de complexidade: procedimento padrão, julgamento ou processo em várias etapas, e caso fora do comum.
O roteamento acontece no código, e a tabela de destinos é o coração do padrão:
| Intenção | Executor no exemplo |
|---|---|
| confiança abaixo de 0,5 | atendente humano |
order_status | código determinístico, sem LLM |
product_question | LLM especialista em produto |
return_exchange | LLM especialista em troca e devolução |
complaint | LLM de resolução, ou pessoa se a complexidade passar de 1 |
O ramo da reclamação é o mais instrutivo. Ele tem duas condições de escape: complexidade acima de 1 ou confiança da própria complexidade abaixo de 0,5. Ou seja: o caso vai para uma pessoa tanto quando é difícil quanto quando o modelo não tem certeza de que é difícil. A documentação chama atenção para isso — a leitura de uma confiança baixa depende do risco da decisão.
intencao = r.answers["intencao"]
complexidade = r.answers["complexidade"]
if intencao.confidence < 0.5:
return fila_humana(ticket_id)
if intencao.choice == "status_do_pedido":
return consultar_pedido(ticket_id) # código, sem LLM
if intencao.choice == "duvida_de_produto":
return responder_com_llm(ticket_id, ESPECIALISTA_PRODUTO)
if intencao.choice == "troca_ou_devolucao":
return responder_com_llm(ticket_id, ESPECIALISTA_TROCA)
if complexidade.score > 1 or complexidade.confidence < 0.5:
return fila_humana(ticket_id)
return responder_com_llm(ticket_id, RESOLUCAO)
O que o padrão decide de verdade
O mapa de executores é uma decisão de arquitetura, não de prompt. Escrever as opções do Choice é escrever a lista de componentes que o seu sistema tem. Se duas intenções levam ao mesmo lugar, elas não são duas intenções; se uma intenção não tem destino, ela não deveria estar na lista.
A responsabilidade de cada componente fica documentada. O criteria do
Choice acaba virando a descrição mais honesta que existe do que cada executor
faz. Vale escrevê-lo com esse cuidado — a página
critérios que separam trata disso.
O caro fica cercado. Depois do roteamento, você consegue medir quanto de cada componente foi usado e quanto custou. É o que torna a discussão de custo concreta, em vez de estimativa; a conta por decisão está em custo por decisão.
O escalonamento tem um lugar só. Como o piso de confiança fica no começo da função, existe um único ponto onde o sistema decide que não sabe. Isso é mais fácil de auditar do que uma dúvida espalhada por quatro executores.
O que ele obriga você a ter
Uma opção de escape. O exemplo de interface por voz da página de
roteamento por confiança tem uma opção other explícita, e por bom motivo:
sem ela, um pedido fora do escopo é empurrado para a opção mais parecida.
Um destino humano real. Roteamento para fila que ninguém atende é roteamento para o limbo.
Perguntas independentes, não uma corrente. Intenção e complexidade vão na mesma chamada e são avaliadas contra o mesmo state. Isso é o fan-out especulativo aplicado: a complexidade só é lida no ramo da reclamação, mas perguntar sempre é mais barato que uma segunda viagem.
Limiares por ramo. O piso de 0,5 do exemplo vale para escolher um atendimento. Um ramo que executa uma ação irreversível merece corte mais alto, como descrito em roteamento por confiança.
Quando não usar
Quando existe um executor só. Se todo caminho termina no mesmo lugar, o classificador é custo puro. Roteamento só compensa quando os executores têm preços ou capacidades diferentes.
Quando a classificação é determinística. Se um campo de formulário, um assunto de e-mail padronizado ou um código de erro já identificam o pedido, use o campo. O modelo entra onde existe julgamento, não onde existe chave primária.
Quando o pedido costuma ter várias intenções ao mesmo tempo. Choice é relativo: ele escolhe entre as opções. Para “quero devolver e também reclamar”, o desenho com um Noul por intenção responde melhor, porque cada Noul é absoluto. Essa diferença entre escolha e sim-ou-não está em qual primitiva usar.
Quando o custo do erro de roteamento é maior que o custo do executor caro. Em domínio sensível, mandar o caso errado para o componente errado pode custar mais que simplesmente pagar o executor forte para tudo. Aí o roteamento pode continuar, mas só para priorizar fila, não para escolher quem responde.
Por onde continuar
Para ver o classificador funcionando com dados reais em português, o playground roda seis perguntas sobre um texto de suporte. Para o caso em que a incerteza vira resposta mais ampla em vez de fila, leia classificar com confiança. O índice dos padrões está em padrões.
Perguntas frequentes
Roteamento de intenção substitui o LLM?
Não, ele decide quando o LLM entra. No exemplo oficial, uma das quatro intenções vai para código determinístico sem nenhum LLM, duas vão para LLMs especialistas com contextos diferentes e uma usa a complexidade para escolher entre LLM e pessoa. O Jev faz só a classificação.
Qual a diferença entre roteamento de intenção e roteamento por confiança?
O de intenção usa o valor da resposta para escolher o executor. O de confiança usa a forma da distribuição para decidir se pode agir. Eles quase sempre aparecem juntos: o exemplo oficial de intenção já traz um piso de confiança abaixo do qual o caso vai para uma pessoa.
Quantas intenções eu devo definir?
Tantas quantas forem os executores diferentes que você tem. Intenção que cai no mesmo executor de outra é a mesma intenção com dois nomes, e opções que se sobrepõem derrubam a confiança da classificação.
E quando o pedido tem duas intenções?
Choice escolhe uma. Se pedidos com duas intenções são comuns no seu domínio, o desenho certo é um Noul por intenção, que é uma pergunta absoluta por tema, em vez de uma escolha relativa entre temas.
Preciso de uma intenção de escape?
Sim. O exemplo oficial da interface por voz inclui uma opção 'outro', e sem ela o modelo é forçado a encaixar qualquer pedido em uma das opções que você escreveu. A opção de escape é o que transforma um pedido fora do escopo em roteamento correto.