Program-Aided Language Models

PAL (Program Destekli Dil Modelleri)

Gao ve ekibi, (2022) (opens in a new tab), doğal dil problemlerini okumak ve ara adım olarak önermeleri oluşturmak için LLM'leri kullanan bir metod sunmuştur. Program destekli dil modelleri (PAL) olarak adlandırılan bu yöntem, çözümü Python yorumlayıcısı gibi programlamaya dayalı bir çalışma zamanına devrederek, düşünce zinciri isteminin serbest formatta çözüm elde etme yönteminden farklıdır.

PAL

Resim Kaynağı: Gao ve ekibi, (2022) (opens in a new tab)

Bir örneği, LangChain ve OpenAI GPT-3 kullanarak inceleyelim. Python yorumlayıcısını kullanarak sorulan soruyu yorumlayabilen ve bir cevap sağlayabilen basit bir uygulama geliştirmek istiyoruz.

Özellikle, LLM'yi tarih anlama gerektiren soruları yanıtlamak için kullanabilen bir işlevsellik oluşturma ilgisi duyuyoruz. LLM'ye, buradan (opens in a new tab) alınan birkaç örnek içeren bir istem sunacağız.

İhtiyacımız olan importlar şunlardır:

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

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

load_dotenv()
 
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")
 
# for LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")

Model örneğini kurulmuş hali:

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

İstem ve sorunun kurulumu:

question = "Bugün 27 Şubat 2023. Tam 25 yıl önce doğmuştum. Doğduğum tarih MM/DD/YYYY formatında neydi?"
 
DATE_UNDERSTANDING_PROMPT = """
# S: 2015 yılına 36 saat kaldı. Bir hafta sonra günün tarihi MM/DD/YYYY formatında ne olacak?
# Eğer 2015 yılına 36 saat kaldıysa, bugün 36 saat öncesidir.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# Bir hafta sonrası,
one_week_from_today = today + relativedelta(weeks=1)
# Cevap %m/%d/%Y formatında
one_week_from_today.strftime('%m/%d/%Y')
# S: 2019'un ilk günü bir Salı’dır ve bugün 2019'un ilk Pazartesi'si. Bugünün tarihi MM/DD/YYYY formatında ne?
# Eğer 2019’un ilk günü bir Salı ve bugün 2019’un ilk Pazartesi’si ise, bu, bugünün 6 gün sonrası olduğu anlamına gelir.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# Cevap %m/%d/%Y formatında
today.strftime('%m/%d/%Y')
# S: Konser 06/01/1943'te olması planlanıyordu, ancak bugüne bir gün ertelendi. 10 gün önceki tarih MM/DD/YYYY formatında neydi?
# Eğer konser 06/01/1943’te olması planlanıyor ama bir günlük gecikmeyle bugüne denk geldiyse, o zaman bugün bir gün sonrasıdır.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 gün önce,
ten_days_ago = today - relativedelta(days=10)
# Cevap %m/%d/%Y formatında
ten_days_ago.strftime('%m/%d/%Y')
# S: Bugün 4/19/1969. 24 saat sonra tarih MM/DD/YYYY formatında ne olacak?
# Bugün 4/19/1969.
today = datetime(1969, 4, 19)
# 24 saat sonra,
later = today + relativedelta(hours=24)
# Cevap %m/%d/%Y formatında
today.strftime('%m/%d/%Y')
# S: Jane bugünün 3/11/2002 olduğunu düşündü, ancak bugün aslında 12 Mart, yani 1 gün sonrası. 24 saat sonrası tarih MM/DD/YYYY formatında ne olacak?
# Eğer Jane bugünün 3/11/2002 olduğunu düşündü, ancak bugün aslında 12 Mart ise, o zaman bugün 3/12/2002’dir.
today = datetime(2002, 3, 12)
# 24 saat sonra,
later = today + relativedelta(hours=24)
# Cevap %m/%d/%Y formatında
later.strftime('%m/%d/%Y')
# S: Jane, 2001'in Şubat ayının son gününde doğdu. Bugün onun 16. yaş günü. Dünkünün tarihi MM/DD/YYYY formatında neydi?
# Eğer Jane 2001'in Şubat ayının son gününde doğdu ve bugün onun 16. yaşı ise, o zaman bugün 16 yıl sonrasıdır.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Dün,
yesterday = today - relativedelta(days=1)
# Cevap %m/%d/%Y formatında
yesterday.strftime('%m/%d/%Y')
# S: {question}
""".strip() + '\n'
llm_out = llm.execute(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)

Bu, aşağıdakini çıktı olarak verecektir:

# Eğer bugün 27 Şubat 2023 ve tam 25 yıl önce doğduysam, o zaman doğum tarihim 25 yıl öncesidir.
today = datetime(2023, 2, 27)
# Doğum tarihim 25 yıl öncesidir,
born = today - relativedelta(years=25)
# Cevap %m/%d/%Y formatında
born.strftime('%m/%d/%Y')

llm_out'un içeriği bir Python kodu parçacığıdır. Aşağıda, bu Python kod parçacığını çalıştırmak için exec komutu kullanılmaktadır.

exec(llm_out)
print(born)

Bu, aşağıdakini çıktı olarak verecektir: 02/27/1998