Código como Raciocínio
Os Modelos de Linguagem Auxiliados por Programa (Program-aided Language Models - PALs) 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.
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 aqui.
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.
Sander Schulhoff
Sander Schulhoff is the CEO of HackAPrompt and Learn Prompting. He created the first Prompt Engineering guide on the internet, two months before ChatGPT was released, which has taught 3 million people how to prompt ChatGPT. He also partnered with OpenAI to run the first AI Red Teaming competition, HackAPrompt, which was 2x larger than the White House's subsequent AI Red Teaming competition. Today, HackAPrompt partners with the Frontier AI labs to produce research that makes their models more secure. Sander's background is in Natural Language Processing and deep reinforcement learning. He recently led the team behind The Prompt Report, the most comprehensive study of prompt engineering ever done. This 76-page survey, co-authored with OpenAI, Microsoft, Google, Princeton, Stanford, and other leading institutions, analyzed 1,500+ academic papers and covered 200+ prompting techniques.