Pular para o conteúdo principal

🟡 Código como Raciocínio

Os Modelos de Linguagem Auxiliados por Programa (Program-aided Language Models - PALs)1 são outro exemplo de um sistema de MRKL. Quando uma pergunta é feita, os PALs são capazes de escrever código que resolve essa pergunta. Eles enviam o código para uma execução programática para obter o resultado. O PAL funciona em contraste com a Cadeia de Pensamento; o raciocínio intermediário do PAL é código, enquanto o do CdP é linguagem natural.

PAL Example (Gao et al.)

Uma coisa importante a notar é que o PAL, na verdade, intercala linguagem natural (NL) e código. Na imagem acima, em azul, estão os raciocínios em linguagem natural que o PAL gera. Embora isso não seja mostrado na imagem, o PAL, na verdade, gera um '#' antes de cada linha de raciocínio em NL, para que sejam interpretados como comentários pela execução programática.

Exemplo​

Vamos ver um exemplo de PAL resolvendo uma questão de matemática. Eu uso um prompt de 3 disparos, que é uma versão simplificada deste aqui1.

Usarei o LangChain, um pacote Python para encadear a funcionalidade do LLM. Primeiro, são necessárias algumas instalações:

!pip install langchain==0.0.26
!pip install openai
from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = "sk-SUA_CHAVE_AQUI"

Então, podemos criar uma instância do GPT-3 davinci-002 (uma chamada de API acontece quando usamos esse objeto)

llm = OpenAI(model_name='text-davinci-002', temperature=0)

Aqui está o prompt de poucos disparos:

MATH_PROMPT = '''
Q: Havia nove computadores na sala do servidor. Cinco computadores foram instalados a cada dia, de segunda a quinta-feira. Quantos computadores há agora na sala do servidor?

# solução em Python:
"""Havia nove computadores na sala do servidor. Cinco computadores foram instalados a cada dia, de segunda a quinta-feira. Quantos computadores há agora na sala do servidor?"""
computador_inicio = 9
computador_por_dia = 5
num_dias = 4 # 4 dias entre segunda e quinta
computadores_adicionados = computador_por_dia * num_dias
computadores_total = computador_inicio + computadores_adicionados
resultado = computadores_total
return resultado


Q: Dani tem cinco brinquedos. Para o Natal, ela ganhou dois brinquedos de seu pai e dois da sua mãe. Quantos brinquedos ela tem agora?

# solução em Python:
"""Dani tem cinco brinquedos. Para o Natal, ela ganhou dois brinquedos de seu pai e dois da sua mãe. Quantos brinquedos ela tem agora?"""
brinquedos_inicio = 5
mae_brinquedos = 2
pai_brinquedos = 2
brinquedos_recebidos= mae_brinquedos + pai_brinquedos
total_brinquedos= brinquedos_inicio + brinquedos_recebidos
resultado = total_brinquedos
return resultado


Q: Jason tinha 20 pirulitos. Ele deu alguns para o Denny. Agora Jason tem 12 pirulitos. Quantos pirulitos ele deu para o Denny?

# solução em Python:
"""Jason tinha 20 pirulitos. Ele deu alguns para o Denny. Agora Jason tem 12 pirulitos. Quantos pirulitos ele deu para o Denny?"""
jason_pirulitos_inicio = 20
jason_pirulitos_fim = 12
denny_pirulitos = jason_pirulitos_inicio - jason_pirulitos_fim
resultado = denny_pirulitos
return resultado


Q: {pergunta}

# solução em Python:
'''

Agora podemos passar esse prompt combinado para o GPT-3.

llm_out = llm(MATH_PROMPT.format(question=question))
print(llm_out)

A saída é:

Emma levou uma viagem de avião de 60 minutos para Minas Gerais. Ela então pegou um trem de 2 horas para Ouro Preto, e então um ônibus de 30 minutos para Ouro Branco. Quanto tempo ela levou para chegar a Ouro Branco?

viagem_aviao = 60
viagem_trem = 2 * 60 # 2 horas em minutos
viagem_onibus = 30
total_tempo = viagem_aviao + viagem_trem + viagem_onibus
resultado = total_time

Finalmente, podemos passar esse código para um runtime no Python e obter a resposta:

exec(llm_out)
print(result)

A saída é 210, o que é correta.

Veja o notebook Jupyter para esse exemplo here.

More​

Confira também esse exemplo.


  1. Gao, L., Madaan, A., Zhou, S., Alon, U., Liu, P., Yang, Y., Callan, J., & Neubig, G. (2022). ↩