1
resposta

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

1 resposta

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!