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.

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
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenvConfigurarea setup-ului
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
llm = OpenAI(model_name='text-davinci-003', temperature=0)Promptul și întrebarea
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
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)Aceasta va produce următoarea ieșire:
# 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.
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
- Promptarea Chain-of-Thought - Înțelegerea tehnicilor de raționament
- Promptarea cu câteva exemple - Învățarea din exemple
- Ghidul de inginerie a prompturilor - Tehnici generale de inginerie a prompturilor
Referințe
- Gao et al., (2022) - PAL: Program-aided Language Models
