|
|
# 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" />
|
|
|
Resim Kaynağı: [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 12/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`
|