# PAL (Program-Aided Language Models)

[Gao и др., (2022)](https://arxiv.org/abs/2211.10435) представили метод, который использует модели LLM для анализа проблем на естественном языке и генерации программ в качестве промежуточных шагов рассуждения. Эти методы называются "program-aided language models" (сокращенно PAL) и отличаются от цепочки мыслей тем, что они не просто используют текст для нахождения решения, а передают этот этап в программную среду, такую как интерпретатор Python.

<figure><img src="https://3840355729-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgFPj8AgoQsj90ueaMFr7%2Fuploads%2FS4wt0GAjFsTGA7LF7EEa%2F%D1%81%D0%BA%D1%80%D0%B8%D0%BD%203.translated.jpg?alt=media&#x26;token=3acd5cda-fcdd-4bd7-9acf-dae01da52de7" alt=""><figcaption></figcaption></figure>

Источник изображения: [Gao и др., (2022)](https://arxiv.org/abs/2211.10435)

Давайте рассмотрим пример с использованием LangChain и OpenAI GPT-3. Мы заинтересованы в разработке простого приложения, которое способно интерпретировать заданный вопрос и предоставлять ответ, используя интерпретатор Python.

онкретно, нас интересует создание функциональности, позволяющей использовать LLM для ответов на вопросы, требующие понимания даты. Мы предоставим LLM подсказку, которая включает несколько образцов, взятых [отсюда](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py).

Вот перечень импортов, которые нам понадобятся:

{% hint style="info" %} <mark style="color:red;">import</mark> openai

<mark style="color:red;">from</mark> datetime <mark style="color:red;">import</mark> datetime

<mark style="color:red;">from</mark> dateutil.relativedelta <mark style="color:red;">import</mark> relativedelta

<mark style="color:red;">import</mark> os

<mark style="color:red;">from</mark> langchain.llms <mark style="color:red;">import</mark> OpenAI

<mark style="color:red;">from</mark> dotenv <mark style="color:red;">import</mark> load\_dotenv
{% endhint %}

Давайте начнем с настройки нескольких вещей:

{% hint style="info" %} <mark style="color:purple;">load\_dotenv</mark>()

&#x20;\# API configuration

openai.api\_key <mark style="color:red;">=</mark> os.<mark style="color:purple;">getenv</mark>(<mark style="color:green;">"OPENAI\_API\_KEY"</mark>)

&#x20;\# for LangChain

os.environ\[<mark style="color:green;">"OPENAI\_API\_KEY"</mark>] <mark style="color:red;">=</mark> os.<mark style="color:purple;">getenv</mark>(<mark style="color:green;">"OPENAI\_API\_KEY"</mark>)
{% endhint %}

Настройка экземпляра модели:

{% hint style="info" %}
llm <mark style="color:red;">=</mark> <mark style="color:purple;">OpenAI</mark>(model\_name<mark style="color:red;">=</mark><mark style="color:green;">'text-davinci-003'</mark>, temperature<mark style="color:red;">=</mark><mark style="color:blue;">0</mark>)
{% endhint %}

Настройка подсказки + вопроса:

{% hint style="info" %} <mark style="color:green;">вопрос = "Сегодня 27 февраля 2023 года. Я родился ровно 25 лет назад. Какова дата моего рождения в формате ММ/ДД/ГГГГ?".</mark>

<mark style="color:green;">DATE\_UNDERSTANDING\_PROMPT = """</mark>

<mark style="color:green;"># вопрос: 2015 год наступит через 36 часов. Какой будет дата через неделю после сегодняшнего дня в формате ММ/ДД/ГГГГ?</mark>

<mark style="color:green;"># Если 2015 год наступает через 36 часов, то сегодняшний день наступает за 36 часов до него.</mark>

<mark style="color:green;">today = datetime(2015, 1, 1) - relativedelta(hours=36)</mark>

<mark style="color:green;"># Через неделю после сегодняшнего дня, one\_week\_from\_today = today + relativedelta(weeks=1)</mark>

<mark style="color:green;"># Ответ, отформатированный в %m/%d/%Y, имеет вид one\_week\_from\_today.strftime('%m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y')</mark>

<mark style="color:green;"># Вопрос: Первый день 2019 года - вторник, а сегодня - первый понедельник 2019 года. Какой будет сегодняшняя дата в формате ММ/ДД/ГГГГ?</mark>

<mark style="color:green;"># Если первый день 2019 года - вторник, а сегодня - первый понедельник 2019 года, то сегодня будет на 6 дней позже.</mark>\ <mark style="color:green;">today = datetime(2019, 1, 1) + relativedelta(days=6)</mark>

<mark style="color:green;"># Ответ, отформатированный в %m/</mark><mark style="color:blue;">%d</mark>/<mark style="color:green;">%Y, имеет вид|</mark>\ <mark style="color:green;">today.strftime('%m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y')</mark>

<mark style="color:green;"># вопрос: Концерт должен был состояться 06/01/1943, но был перенесен на один день на сегодня. Чему равна дата 10 дней назад в формате ММ/ДД/ГГГГ?</mark>

<mark style="color:green;"># Если концерт должен был состояться 06/01/1943, но был перенесен на один день на сегодня, то сегодня - это на один день позже.</mark>\ <mark style="color:green;">today = datetime(1943, 6, 1) + relativedelta(days=1)</mark>

<mark style="color:green;"># 10 дней назад,</mark>\ <mark style="color:green;">ten\_days\_ago = today - relativedelta(days=10)</mark>

<mark style="color:green;"># Ответ, отформатированный в %m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y, имеет вид</mark>

<mark style="color:green;">ten\_days\_ago.strftime('%m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y')</mark>

<mark style="color:green;"># вопрос: Сегодня 4/19/1969. Какой будет дата через 24 часа в формате ММ/ДД/ГГГГ?</mark>

<mark style="color:green;"># Сегодня 4/19/1969.</mark>\ <mark style="color:green;">today = datetime(1969, 4, 19)</mark>

<mark style="color:green;"># 24 часа спустя,</mark>\ <mark style="color:green;">later = today + relativedelta(hours=24)</mark>

<mark style="color:green;"># Ответ, отформатированный в %m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y, имеет вид</mark>

<mark style="color:green;">today.strftime('%m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y')</mark>

<mark style="color:green;"># Вопрос: Джейн думала, что сегодня 3/11/2002, но на самом деле сегодня 12 марта, то есть на 1 день позже. Какой будет дата через 24 часа в формате ММ/ДД/ГГГГ?</mark>

<mark style="color:green;"># Если Джейн думала, что сегодня 3/11/2002, а на самом деле сегодня 12 марта, то сегодня 3/12/2002.</mark>\ <mark style="color:green;">today = datetime(2002, 3, 12)</mark>

<mark style="color:green;"># 24 часа спустя,</mark>\ <mark style="color:green;">later = today + relativedelta(hours=24)</mark>

<mark style="color:green;"># Ответ, отформатированный в %m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y, имеет вид</mark>\ <mark style="color:green;">later.strftime('%m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y')</mark>

<mark style="color:green;"># Вопрос: Джейн родилась в последний день февраля 2001 года. Сегодня ей исполняется 16 лет. Какова дата вчерашнего дня в формате ММ/ДД/ГГГГ?</mark>

<mark style="color:green;"># Если Джейн родилась в последний день февраля 2001 года и сегодня ее 16-летний день рождения, то сегодня 16 лет спустя.</mark>\ <mark style="color:green;">today = datetime(2001, 2, 28) + relativedelta(years=16)</mark>

<mark style="color:green;"># Вчера,</mark>\ <mark style="color:green;">yesterday = today - relativedelta(days=1)</mark>

<mark style="color:green;"># Ответ, отформатированный в %m/</mark><mark style="color:blue;">%d</mark><mark style="color:green;">/%Y, имеет вид</mark>\ <mark style="color:green;">yesterday.strftime('%m/</mark><mark style="color:blue;">%d/</mark><mark style="color:green;">%Y')</mark>

<mark style="color:green;"># вопрос:</mark> <mark style="color:blue;">{question}</mark>

""".<mark style="color:purple;">strip</mark>() <mark style="color:red;">+</mark> <mark style="color:green;">'\n'</mark>
{% endhint %}

{% hint style="info" %}
llm\_out <mark style="color:red;">=</mark> <mark style="color:purple;">llm</mark>(DATE\_UNDERSTANDING\_PROMPT.<mark style="color:purple;">format</mark>(question<mark style="color:red;">=</mark>question))

<mark style="color:purple;">print</mark>(llm\_out)
{% endhint %}

{% hint style="info" %} <mark style="color:purple;">exec</mark>(llm\_out) \ <mark style="color:purple;">print</mark>(born)
{% endhint %}

Это выведет следующее: `02/27/1998`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bithoventech.gitbook.io/prompt-inzhiniring-ot-bithoven-ai/primenenie-promptov/pal-program-aided-language-models.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
