# PAL (Program-Aided Language Models)
 
import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import PAL from '../../img/pal.png'

[Gao et al., (2022)](https://arxiv.org/abs/2211.10435) doğal dil problemlerini okumak ve ara akıl yürütme adımları olarak programlar oluşturmak için LLM'leri kullanan bir yöntem sunar. 
Türetilmiş, program destekli dil modelleri (PAL), çözüm elde etmek için serbest biçimli metin kullanmak yerine çözüm adımını Python yorumlayıcısı gibi programlı bir çalışma zamanına aktardığı için düşünce zinciri yönlendirmesinden farklıdır.

<Screenshot src={PAL} alt="PAL" />
Image Source: [Gao et al., (2022)](https://arxiv.org/abs/2211.10435)

LangChain ve OpenAI GPT-3 kullanan bir örneğe bakalım. Sorulan soruyu yorumlayabilen ve Python yorumlayıcısından yararlanarak yanıt sağlayabilen basit bir uygulama geliştirmekle ilgileniyoruz.

Spesifik olarak, tarihin anlaşılmasını gerektiren soruları yanıtlamak için LLM kullanımına izin veren bir işlev oluşturmakla ilgileniyoruz. LLM'ye [buradan](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py) benimsenen birkaç örneği içeren bir bilgi istemi sağlayacağız.

İhtiyacımız olan kütüphaneler:

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

Önce birkaç şeyi yapılandıralım:

```python
load_dotenv()

# API yapılandırma
openai.api_key = os.getenv("OPENAI_API_KEY")

# LangChain için
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
```

Kurulum modeli örneği:

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

Kurulum istemi + soru:

```python
question = "Today is 27 February 2023. I was born exactly 25 years ago. What is the date I was born in MM/DD/YYYY?"

DATE_UNDERSTANDING_PROMPT = """
# S: 36 saat sonra 2015 geliyor. AA/GG/YYYY olarak bugünden bir hafta sonraki tarih nedir?
# 2015 yılı 36 saat sonra geliyorsa, bugün 36 saat öncesidir.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# Bugünden bir hafta sonra,
one_week_from_today = today + relativedelta(weeks=1)
# %m/%d/%Y ile biçimlendirilen yanıt:
one_week_from_today.strftime('%m/%d/%Y')
# S: 2019'un ilk günü Salı ve bugün 2019'un ilk Pazartesi günü. Bugünün AA/GG/YYYY cinsinden tarihi nedir?
# 2019'un ilk günü Salı günü olup bugün de 2019'un ilk Pazartesi günüyse, bugün 6 gün sonradır.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# %m/%d/%Y ile biçimlendirilen yanıt:
today.strftime('%m/%d/%Y')
# S: Konserin 01/06/1943 tarihinde yapılması planlanmıştı, ancak bir gün ertelenmiştir. AA/GG/YYYY cinsinden 10 gün önceki tarih nedir?
# Konser 01/06/1943 tarihinde planlanmış, ancak bugüne bir gün ertelenmişse, bugün bir gün sonradır.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 gün önce,
ten_days_ago = today - relativedelta(days=10)
# %m/%d/%Y ile biçimlendirilen yanıt:
ten_days_ago.strftime('%m/%d/%Y')
# S: Bugün 19/4/1969. AA/GG/YYYY cinsinden 24 saat sonraki tarih nedir?
# Bugün 19/4/1969.
today = datetime(1969, 4, 19)
# 24 hours later,
later = today + relativedelta(hours=24)
# %m/%d/%Y ile biçimlendirilen yanıt:
today.strftime('%m/%d/%Y')
# S: Jane bugünün 11/3/2002 olduğunu düşündü, ama aslında bugün 12 Mart yani 1 gün sonra. AA/GG/YYYY cinsinden 24 saat sonraki tarih nedir?
# Jane bugünün 11/3/2002 olduğunu düşündüyse ama aslında bugün 12 Mart ise, o zaman bugün 1/3/2002'dir.
today = datetime(2002, 3, 12)
# 24 saat sonra,
later = today + relativedelta(hours=24)
# %m/%d/%Y ile biçimlendirilen yanıt:
later.strftime('%m/%d/%Y')
# S: Jane, 2001'de Şubat ayının son gününde doğdu. Bugün onun 16.yaş günü. AA/GG/YYYY cinsinden dünkü tarih nedir?
# Jane 2001'de Şubat ayının son gününde doğduysa ve bugün onun 16.yaş günü ise, o zaman bugün 16 yıl sonradır.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Dün,
yesterday = today - relativedelta(days=1)
# %m/%d/%Y ile biçimlendirilen yanıt:
yesterday.strftime('%m/%d/%Y')
# S: {question}
""".strip() + '\n'
```

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

```python
exec(llm_out)
print(born)
```

Aşağıdaki çıktıyı verecektir: `27/02/1998`