Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Few Shot com Chain of thought

Estou com um problema no trabalho, em que eu estou pedindo para a IA classificar dado "x" conforme algumas faixas informadas e exemplos dados:

Ex.: Vamos fingir que estamos lendo um cupom, do cupom temos a hora de emissão e o que foi consumido, o que eu pedi ao prompt:

"Do intervalo "a" até o "b", é café da manhã, caso o intervalo de tempo seja esse, escolha um dos tipos disponibilizados que tenha semântica referente a essa hora, do "c" até o "d" é almoço, etc...

Se no cupom tiver café, mas a data de emissão for x h (entre c e d), é almoço, apesar de se tratar de café.
etc...."

No fim, diversas regras e exemplos, e eu acabei registrando em um campo o raciocínio da IA, ela fala algo como: "O horário é 13h, está entre c e d, então é almoço, mas no cupom tem café e uma das opções que foram dadas é café da manhã, café da manha está diferente do horário, então é almoço"

Poréeem, no fim das contas, a resposta final é café da manhã. Tentei de tudo, estruturei o pensamento com chain of tought, dei vários exemplos, obriguei ele a repensar o passo a passo e até a justificar através desse campo, porém parece que ele continua "viajando". Estou usando o llama-maverick3.5 (nao lembro ao certo a version), com 0.1 de temperatura, o provedor é o openrouter.

Se puderem me ajudar, agradeço desde já.

2 respostas
solução!

Olá, Rodrigo. Como vai?

Esse é um problema clássico de engenharia de prompts e, olha, você já deu passos excelentes! Usar Chain of Thought (Cadeia de Pensamento), injetar exemplos (Few-Shot) e derrubar a temperatura para 0.1 (o que força o modelo a ser mais determinístico e menos criativo) são exatamente as técnicas corretas para o seu cenário.

O comportamento que você descreveu — onde a IA faz todo o raciocínio correto no campo de texto, mas na hora de entregar a variável final ela "muda de ideia" e escolhe a opção errada — é conhecido no mundo dos LLMs como "Perda de Atenção no Alinhamento de Saída" ou Vício Semântico.

O que está acontecendo é que a palavra "café" dentro do cupom tem uma carga semântica tão forte para o modelo que, na última camada de predição do token de saída, ela acaba "vencendo" a lógica matemática do horário, mesmo que o raciocínio textual tenha dito o contrário.

Como o Llama (especialmente em versões menores ou customizadas via OpenRouter) pode se perder se o prompt estiver puramente em linguagem natural corrida, a melhor forma de blindar isso é estruturar o Few-Shot rigorosamente em blocos lógicos rígidos (como tags XML ou JSON) e forçar o modelo a fechar a decisão dentro do loop de pensamento.

Abaixo, preparei uma estrutura de prompt reformulada para você testar. O segredo aqui é separar as regras por prioridade e fechar o prompt exigindo que ela use as suas variáveis de decisão.


Proposta de Prompt Estruturado

Substitua o formato atual por algo parecido com esta estrutura hierárquica:

Você é um classificador de cupons fiscais ultra preciso. Sua tarefa é categorizar o tipo de refeição com base estritamente na HORA DE EMISSÃO, ignorando os itens consumidos se houver conflito.

[REGRAS DE PRIORIDADE COMPORTAMENTAL]
1. A HORA DE EMISSÃO manda no veredito.
2. Se o horário for entre [06:00] e [10:59] -> Sempre classifique como: CAFÉ DA MANHÃ
3. Se o horário for entre [11:00] e [15:59] -> Sempre classifique como: ALMOÇO
4. Regra de Conflito: Mesmo que o cupom contenha palavras como "café", "pão" ou "leite", se a hora for entre 11:00 e 15:59, o veredito final DEVE SER "ALMOÇO".

[EXEMPLOS DE VALIDAÇÃO (FEW-SHOT + CHAIN OF THOUGHT)]

---
Dados do Cupom:
Hora: 08:30
Itens: Pão de queijo, Café expresso
<raciocínio>
O horário é 08:30, que está no intervalo entre 06:00 e 10:59. Os itens são café da manhã. Não há conflito.
</raciocínio>
Veredito Final: CAFÉ DA MANHÃ
---
Dados do Cupom:
Hora: 13:15
Itens: Café expresso, Cappuccino
<raciocínio>
O horário é 13:15, que está no intervalo entre 11:00 e 15:59. Embora os itens contenham a palavra 'Café', a Regra de Conflito diz que o horário manda. O intervalo de 13:15 pertence ao Almoço. Portanto, os itens devem ser ignorados na decisão.
</raciocínio>
Veredito Final: ALMOÇO
---

Agora, classifique o cupom abaixo seguindo estritamente o formato dos exemplos acima, preenchendo as tags de <raciocínio> e finalizando com "Veredito Final: [CATEGORIA]".

Dados do Cupom:
Hora: [Insira a Hora Aqui]
Itens: [Insira os Itens Aqui]

Por que essa abordagem tende a resolver o seu problema?

  1. Uso de Tags de Escopo (<raciocínio>): Modelos da família Llama respondem muito bem a tags estilo HTML/XML. Elas ajudam o modelo a entender onde termina o rascunho e onde começa a entrega do dado.
  2. Definição de Regra de Conflito Direta: Escrever explicitamente "Mesmo que o cupom contenha a palavra café..." desativa o viés estatístico que estava fazendo a IA travar na palavra.
  3. Inversão da Ordem de Leitura: Note que nos exemplos, a Hora vem antes dos Itens. Na arquitetura de atenção dos LLMs, o que ele lê primeiro ganha um peso ligeiramente maior no processamento do contexto inicial.

Uma dica extra sobre o Provedor (OpenRouter)

Como você mencionou que o modelo é o Llama-Maverick (geralmente um merge ou fine-tuning específico hospedado lá), se mesmo com o prompt estruturado ele continuar falhando, vale a pena fazer um teste rápido no OpenRouter trocando o modelo para o meta-llama/llama-3-8b-instruct ou meta-llama/llama-3-70b-instruct. Modelos oficiais de Instruct são muito mais obedientes a regras de restrição do que modelos customizados para conversação genérica.

Faça o teste com essa nova estrutura e me conte se o veredito final finalmente se alinhou com o raciocínio! Se precisar ajustar alguma regra específica, é só falar.

Espero que possa ter lhe ajudado!

Fala Evandro, bom dia, tudo bem?

Pior que eu tinha seguido uma estrutura praticamente igual a sua, porém mesmo assim não funcionou, a única coisa que não testei de fato foi a troca da LLM, que me pareceu ser bem promissora.

No fim das contas, eu meio que "fugi" do problema executando uma chamada com SÓ isso de prompt, assincronamente, acredito que com o exceço de contexto (cerca de 100 linhas de prompt) ou até o fato de que essas orientações foram colocadas num chat de System e os dados da request em um de User, estavam afetando o raciocínio da chamada.