Program-Aided Language Models

PAL(プログラム支援言語モデル)

Gao et al.,(2022) (opens in a new tab)は、自然言語の問題を読み取り、プログラムを中間推論ステップとして生成するためにLLMを使用する方法を示しています。プログラム支援言語モデル(PAL)と呼ばれ、解決策を取得するための自由形式テキストの代わりに、Pythonインタプリタのようなプログラム実行時に解決ステップをオフロードします。

PAL

Image Source: Gao et al., (2022) (opens in a new tab)

以下は、LangChainとOpenAI GPT-3を使用した例を見てみましょう。Pythonインタプリタを活用して、質問を解釈し、答えを提供する簡単なアプリケーションを開発したいと考えています。

具体的には、日付理解が必要な質問に答えるためにLLMを使用する機能を作成することに興味があります。ここ (opens in a new tab)から採用されたいくつかの例を含むプロンプトをLLMに提供します。

必要なインポートは以下のとおりです。

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

まず、いくつかの設定を行いましょう。

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

モデルインスタンスをセットアップします。

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

設定プロンプト+質問:

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 = """
# Q: 2015 is coming in 36 hours. What is the date one week from today in MM/DD/YYYY?
# 2015が36時間後に来る場合、今日は36時間前である。
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# 今日から1週間後、
one_week_from_today = today + relativedelta(weeks=1)
# %m/%d/%Yでフォーマットされた答えは
one_week_from_today.strftime('%m/%d/%Y')
# Q: 2019年の最初の日は火曜日で、今日は2019年の最初の月曜日です。今日の日付は何ですか?MM/DD/YYYYで答えてください。
# 2019年の最初の日が火曜日であり、今日が2019年の最初の月曜日である場合、今日は6日後である。
today = datetime(2019, 1, 1) + relativedelta(days=6)
# %m/%d/%Yでフォーマットされた答えは
today.strftime('%m/%d/%Y')
# Q: コンサートは06/01/1943に予定されていましたが、1日遅れて今日になりました。10日前の日付は何ですか?MM/DD/YYYYで答えてください。
# コンサートが06/01/1943に予定されていたが、1日遅れて今日になった場合、今日は1日後である。
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10日前、
ten_days_ago = today - relativedelta(days=10)
# %m/%d/%Yでフォーマットされた答えは
ten_days_ago.strftime('%m/%d/%Y')
# Q: 今日は1969年4月19日です。24時間後の日付は何ですか?MM/DD/YYYYで答えてください。
# 今日は1969年4月19日です。
today = datetime(1969, 4, 19)
# 24時間後、
later = today + relativedelta(hours=24)
# %m/%d/%Yでフォーマットされた答えは
today.strftime('%m/%d/%Y')
# Q: Janeは今日が2002年3月11日だと思っていましたが、実際は3月12日であり、1日後です。24時間後の日付は何ですか?MM/DD/YYYYで答えてください。
# Janeは今日が2002年3月11日だと思っていましたが、実際は3月12日である場合、今日は2002年3月12日です。
today = datetime(2002, 3, 12)
# 24時間後、
later = today + relativedelta(hours=24)
# %m/%d/%Yでフォーマットされた答えは
later.strftime('%m/%d/%Y')
# Q: Janeは2001年の2月の最後の日に生まれました。今日は彼女の16歳の誕生日です。昨日の日付は何ですか?MM/DD/YYYYで答えてください。
# Janeが2001年の2月の最後の日に生まれた場合、今日は16年後です。
today = datetime(2001, 2, 28) + relativedelta(years=16)
# 昨日、
yesterday = today - relativedelta(days=1)
# %m/%d/%Yでフォーマットされた答えは
yesterday.strftime('%m/%d/%Y')
# Q: {question}
""".strip() + '\n'
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
exec(llm_out)
print(born)

これにより、02/27/1998が出力されます。