⚠️PAL (Program-Aided Language Models)
"Program-Aided Language Models" дословно на русский "программно-управляемые языковые модели"
Last updated
"Program-Aided Language Models" дословно на русский "программно-управляемые языковые модели"
Last updated
Gao и др., (2022) представили метод, который использует модели LLM для анализа проблем на естественном языке и генерации программ в качестве промежуточных шагов рассуждения. Эти методы называются "program-aided language models" (сокращенно PAL) и отличаются от цепочки мыслей тем, что они не просто используют текст для нахождения решения, а передают этот этап в программную среду, такую как интерпретатор Python.
Источник изображения: Gao и др., (2022)
Давайте рассмотрим пример с использованием LangChain и OpenAI GPT-3. Мы заинтересованы в разработке простого приложения, которое способно интерпретировать заданный вопрос и предоставлять ответ, используя интерпретатор Python.
онкретно, нас интересует создание функциональности, позволяющей использовать LLM для ответов на вопросы, требующие понимания даты. Мы предоставим 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)
Настройка подсказки + вопроса:
вопрос = "Сегодня 27 февраля 2023 года. Я родился ровно 25 лет назад. Какова дата моего рождения в формате ММ/ДД/ГГГГ?".
DATE_UNDERSTANDING_PROMPT = """
# вопрос: 2015 год наступит через 36 часов. Какой будет дата через неделю после сегодняшнего дня в формате ММ/ДД/ГГГГ?
# Если 2015 год наступает через 36 часов, то сегодняшний день наступает за 36 часов до него.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# Через неделю после сегодняшнего дня, one_week_from_today = today + relativedelta(weeks=1)
# Ответ, отформатированный в %m/%d/%Y, имеет вид one_week_from_today.strftime('%m/%d/%Y')
# Вопрос: Первый день 2019 года - вторник, а сегодня - первый понедельник 2019 года. Какой будет сегодняшняя дата в формате ММ/ДД/ГГГГ?
# Если первый день 2019 года - вторник, а сегодня - первый понедельник 2019 года, то сегодня будет на 6 дней позже. today = datetime(2019, 1, 1) + relativedelta(days=6)
# Ответ, отформатированный в %m/%d/%Y, имеет вид| today.strftime('%m/%d/%Y')
# вопрос: Концерт должен был состояться 06/01/1943, но был перенесен на один день на сегодня. Чему равна дата 10 дней назад в формате ММ/ДД/ГГГГ?
# Если концерт должен был состояться 06/01/1943, но был перенесен на один день на сегодня, то сегодня - это на один день позже. 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')
# вопрос: Сегодня 4/19/1969. Какой будет дата через 24 часа в формате ММ/ДД/ГГГГ?
# Сегодня 4/19/1969. today = datetime(1969, 4, 19)
# 24 часа спустя, later = today + relativedelta(hours=24)
# Ответ, отформатированный в %m/%d/%Y, имеет вид
today.strftime('%m/%d/%Y')
# Вопрос: Джейн думала, что сегодня 3/11/2002, но на самом деле сегодня 12 марта, то есть на 1 день позже. Какой будет дата через 24 часа в формате ММ/ДД/ГГГГ?
# Если Джейн думала, что сегодня 3/11/2002, а на самом деле сегодня 12 марта, то сегодня 3/12/2002. today = datetime(2002, 3, 12)
# 24 часа спустя, later = today + relativedelta(hours=24)
# Ответ, отформатированный в %m/%d/%Y, имеет вид later.strftime('%m/%d/%Y')
# Вопрос: Джейн родилась в последний день февраля 2001 года. Сегодня ей исполняется 16 лет. Какова дата вчерашнего дня в формате ММ/ДД/ГГГГ?
# Если Джейн родилась в последний день февраля 2001 года и сегодня ее 16-летний день рождения, то сегодня 16 лет спустя. today = datetime(2001, 2, 28) + relativedelta(years=16)
# Вчера, yesterday = today - relativedelta(days=1)
# Ответ, отформатированный в %m/%d/%Y, имеет вид yesterday.strftime('%m/%d/%Y')
# вопрос: {question}
""".strip() + '\n'
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
exec(llm_out) print(born)
Это выведет следующее: 02/27/1998