Skip to content

PAL (Modelele de limbaj asistate de programe)

Prezentare generală

Gao et al., (2022) prezintă o metodă care folosește LLM-urile pentru a citi probleme în limbaj natural și genera programe ca pași intermediari de raționament. Denumit, modelele de limbaj asistate de programe (PAL), diferă de promptarea chain-of-thought prin faptul că în loc să folosească text liber pentru a obține soluția, transferă pasul de soluție către un runtime programatic precum un interpretor Python.

PAL

Sursa imaginii: Gao et al., (2022)

Cum funcționează

Să ne uităm la un exemplu folosind LangChain și OpenAI GPT-3. Suntem interesați să dezvoltăm o aplicație simplă care să poată interpreta întrebarea care este pusă și să furnizeze un răspuns prin valorificarea interpretorului Python.

Specific, suntem interesați să creăm o funcționalitate care permite folosirea LLM-ului pentru a răspunde la întrebări care necesită înțelegerea datelor. Vom furniza LLM-ului un prompt care include câteva exemplare care sunt adoptate de aici.

Implementarea

Importurile necesare

python
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv

Configurarea setup-ului

python
load_dotenv()
 
# configurația API
openai.api_key = os.getenv("OPENAI_API_KEY")
 
# pentru LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")

Configurarea modelului

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

Promptul și întrebarea

python
question = "Astăzi este 27 februarie 2023. M-am născut exact acum 25 de ani. Care este data când m-am născut în MM/DD/YYYY?"
 
DATE_UNDERSTANDING_PROMPT = """
# Î: 2015 vine în 36 de ore. Care este data de o săptămână de astăzi în MM/DD/YYYY?
# Dacă 2015 vine în 36 de ore, atunci astăzi este cu 36 de ore înainte.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# O săptămână de astăzi,
one_week_from_today = today + relativedelta(weeks=1)
# Răspunsul formatat cu %m/%d/%Y este
one_week_from_today.strftime('%m/%d/%Y')
# Î: Prima zi din 2019 este o marți, și astăzi este prima luni din 2019. Care este data de astăzi în MM/DD/YYYY?
# Dacă prima zi din 2019 este o marți, și astăzi este prima luni din 2019, atunci astăzi este cu 6 zile mai târziu.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# Răspunsul formatat cu %m/%d/%Y este
today.strftime('%m/%d/%Y')
# Î: Concertul era programat să fie pe 06/01/1943, dar a fost amânat cu o zi pentru astăzi. Care este data de acum 10 zile în MM/DD/YYYY?
# Dacă concertul era programat să fie pe 06/01/1943, dar a fost amânat cu o zi pentru astăzi, atunci astăzi este cu o zi mai târziu.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# Acum 10 zile,
ten_days_ago = today - relativedelta(days=10)
# Răspunsul formatat cu %m/%d/%Y este
ten_days_ago.strftime('%m/%d/%Y')
# Î: Este 4/19/1969 astăzi. Care este data cu 24 de ore mai târziu în MM/DD/YYYY?
# Este 4/19/1969 astăzi.
today = datetime(1969, 4, 19)
# Cu 24 de ore mai târziu,
later = today + relativedelta(hours=24)
# Răspunsul formatat cu %m/%d/%Y este
today.strftime('%m/%d/%Y')
# Î: Jane credea că astăzi este 3/11/2002, dar astăzi este de fapt 12 martie, care este cu 1 zi mai târziu. Care este data cu 24 de ore mai târziu în MM/DD/YYYY?
# Dacă Jane credea că astăzi este 3/11/2002, dar astăzi este de fapt 12 martie, atunci astăzi este 3/12/2002.
today = datetime(2002, 3, 12)
# Cu 24 de ore mai târziu,
later = today + relativedelta(hours=24)
# Răspunsul formatat cu %m/%d/%Y este
later.strftime('%m/%d/%Y')
# Î: Jane s-a născut în ultima zi din februarie în 2001. Astăzi este ziua ei de naștere de 16 ani. Care este data de ieri în MM/DD/YYYY?
# Dacă Jane s-a născut în ultima zi din februarie în 2001 și astăzi este ziua ei de naștere de 16 ani, atunci astăzi este cu 16 ani mai târziu.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Ieri,
yesterday = today - relativedelta(days=1)
# Răspunsul formatat cu %m/%d/%Y este
yesterday.strftime('%m/%d/%Y')
# Î: {question}
""".strip() + '\n'

Generează răspunsul

python
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)

Aceasta va produce următoarea ieșire:

python
# Dacă astăzi este 27 februarie 2023 și m-am născut exact acum 25 de ani, atunci m-am născut cu 25 de ani înainte.
today = datetime(2023, 2, 27)
# M-am născut cu 25 de ani înainte,
born = today - relativedelta(years=25)
# Răspunsul formatat cu %m/%d/%Y este
born.strftime('%m/%d/%Y')

Execută codul generat

Conținutul din llm_out este un fragment de cod Python. Mai jos, comanda exec este folosită pentru a executa acest fragment de cod Python.

python
exec(llm_out)
print(born)

Aceasta va produce următoarea ieșire: 02/27/1998

Beneficii cheie

  • Raționamentul programatic: Folosește execuția reală de cod pentru calcule precise
  • Acuratețea matematică: Elimină erorile aritmetice prin execuția programului
  • Ieșirea structurată: Generează cod executabil ca pași intermediari
  • Integrarea runtime: Valorifică interpretoare externe pentru operații complexe

Aplicații

  • Rezolvarea problemelor matematice: Calcule complexe și aritmetică a datelor
  • Procesarea datelor: Sarcini care necesită operații computaționale
  • Implementarea algoritmilor: Conversia problemelor în cod executabil
  • Instrumentele educaționale: Predarea conceptelor de programare prin limbaj natural

Subiecte conexe

Referințe

  • Gao et al., (2022) - PAL: Program-aided Language Models