added applications ru pages

pull/188/head
Ilya Gusev 1 year ago
parent 3d39808ef7
commit 819cb5274e

@ -0,0 +1,7 @@
{
"pal": "Program-Aided Language Models",
"generating": "Генерация данных",
"coding": "Генерация кода",
"workplace_casestudy": "Исследование по классификации",
"pf": "Функции в промпте"
}

@ -0,0 +1,201 @@
# Генерация кода
import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import CODE1 from '../../img/code-generation/chat-mode.png'
<Callout emoji="⚠️">
Этот раздел находится в разработке.
</Callout>
Языковые модели с программной помощью (Program-Aided Language Models), такие как ChatGPT, очень эффективны в генерации кода. В этом разделе мы рассмотрим множество примеров использования ChatGPT для генерации кода.
Все примеры ниже используют OpenAI Playground (режим чата) и модель `gpt-3.5-turbo`.
Как и все модели чатов от OpenAI, вы можете использовать «Системное сообщение» для определения поведения и формата ответов модели. Мы будем использовать следующее Системное сообщение для примеров промптов:
```
You are a helpful code assistant that can teach a junior developer how to code. Your language of choice is Python. Don't explain the code, just generate the code block itself.
```
## Основной пример
`User Message` будет являться самим промптом с инструкцией о конкретном коде, который вы хотите, чтобы модель сгенерировала. Ниже приведен снимок экрана первого базового промпта для генерации кода. Обратите внимание, что финальный код был сгенерирован помощником (Assistant).
<Screenshot src={CODE1} alt="CODE1" />
Вот промпт, если вы хотите попробовать его самостоятельно:
```
Write code that asks the user for their name and say "Hello"
```
## Преобразование комментариев в код
Вы также можете использовать возможности генерации кода этих моделей для создания кода только на основе комментариев. Рассмотрим еще один пример, в котором инструкции передаются в виде блока комментариев:
*Промпт:*
```
"""
1. Create a list of movies
2. Create a list of ratings for these movies
3. Combine them to make a json object of 10 movies with their ratings.
"""
```
*Результат:*
```python
movies = ["The Shawshank Redemption", "The Godfather", "The Dark Knight", "Schindler's List", "Pulp Fiction", "The Lord of the Rings: The Return of the King", "Forrest Gump", "Star Wars: Episode V - The Empire Strikes Back", "Inception", "The Silence of the Lambs"]
ratings = [9.3, 9.2, 9.0, 8.9, 8.9, 8.9, 8.8, 8.7, 8.7, 8.6]
movie_ratings = {}
for i in range(len(movies)):
movie_ratings[movies[i]] = ratings[i]
json_object = json.dumps(movie_ratings, indent=4)
print(json_object)
```
Сгенерированный код выглядит как работающий код. Однако в выводе отсутствует важное утверждение `import`, а именно `import json`. Несмотря на то, что эти модели генерируют работающий код, важно обратить внимание на такие мелкие детали и всегда тестировать свой код.
## Полные функции или следующая строка
Эти модели с программной помощью также внедрены в инструменты, такие как GitHub Copilot, что делает их полезными для разработчиков. Одна полезная функция - это возможность модели завершать функции.
*Промпт:*
```python
# function to multiply two numbers and add 75 to it
def multiply(
```
*Результат:*
```python
a, b):
result = a * b
result += 75
return result
```
## Генерация MySQL-запросов
Помимо базового примера генерации кода выше, вы можете использовать модель для генерации полезного кода, который может использоваться в других аспектах программирования, например, для создания и тестирования MySQL-запросов.
Предположим, у вас есть набор данных с некоторой информацией, которую вы можете включить в промпт, а затем указать модели сгенерировать конкретный запрос. Например:
```
"""
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
Create a MySQL query for all students in the Computer Science department
"""
```
*Результат:*
```
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';
```
Модель генерирует запрос! Однако в этом примере мы придумали базу данных, поэтому у нас нет базы данных для проверки сгенерированного запроса. Если вы тестируете этот пример, может быть полезно создать эту базу данных. К счастью, вы можете использовать ChatGPT для генерации е
е. Один из подходов - использовать модифицированную версию промпта выше с немного измененными инструкциями для генерации схемы базы данных:
```
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
Create a valid database schema with the above tables and columns
```
Модель сгенерировала следующую схему:
```
CREATE TABLE departments (
DepartmentId INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
CREATE TABLE students (
DepartmentId INT,
StudentId INT PRIMARY KEY,
StudentName VARCHAR(50),
FOREIGN KEY (DepartmentId) REFERENCES departments(DepartmentId)
);
```
Вы можете создать временную базу данных, используя, например, [sqliteonline.com](https://sqliteonline.com/).
Вам также понадобятся фиктивные данные, чтобы проверить, был ли сгенерированный исходный запрос действительным. Давайте также воспользуемся ChatGPT для этого! Промпт может выглядеть примерно следующим образом:
```
CREATE TABLE departments (
DepartmentId INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
CREATE TABLE students (
DepartmentId INT,
StudentId INT PRIMARY KEY,
StudentName VARCHAR(50),
FOREIGN KEY (DepartmentId) REFERENCES departments(DepartmentId)
);
Given the database schema above, generate valid insert statements include 4 rows for each table.
```
Вывод с операторами INSERT:
```
INSERT INTO departments (DepartmentId, DepartmentName)
VALUES (1, 'Computer Science'), (2, 'Mathematics'), (3, 'Physics'), (4, 'Biology');
INSERT INTO students (DepartmentId, StudentId, StudentName)
VALUES (1, 101, 'John Doe'), (1, 102, 'Jane Doe'), (2, 201, 'Alice Smith'), (2, 202, 'Bob Johnson');
```
Теперь, когда у вас есть база данных и фиктивные данные, вы можете проверить исходный запрос. На основе фиктивных данных результатом должно быть две строки с именами `Jane Doe` и `John Doe`.
## Объяснение кода
Если вы изучаете программирование на определенном языке, может быть полезно попросить модель объяснить определенные части кода. Давайте воспользуемся сгенерированным выше запросом и попросим модель объяснить его.
Если вы используете то же Системное сообщение, что и ранее, будьте осторожны с тем, как вы настраиваете модель. Например, если мы используем следующий пример, модель будет жаловаться, что она является помощником по код
у на Python, но все равно предоставит объяснение. Иногда модель отказывается генерировать то, что вы ей указываете, потому что она рассчитана на выполнение инструкций из Системного сообщения.
*Промпт:*
```
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';
Explain the above SQL statement.
```
*Результат:*
```
Sorry, as a code assistant in Python, I cannot generate SQL code. However, I can explain the purpose of the SQL statement provided.
This SQL statement selects the `StudentId` and `StudentName` columns from the `students` table, where the `DepartmentName` column in the `departments` table is equal to 'Computer Science'. To achieve this, the statement performs an inner join on the `DepartmentId` column between the `students` and `departments` tables.
In simpler terms, it is selecting the names and IDs of students who are enrolled in the Computer Science department.
```
## Редактирование кода
Пример скоро будет доступен!
## Отладка кода
Пример скоро будет доступен!
## Лучшие практики
Скоро будет доступно!

@ -0,0 +1,44 @@
# Генерация данных
LLM-модели обладают сильными возможностями по генерации связного текста. Использование эффективных стратегий подсказок позволяет направить модель на создание более качественных, последовательных и фактически точных ответов. LLM также могут быть особенно полезны для генерации данных, которые действительно полезны для проведения различных экспериментов и оценок. Например, мы можем использовать их для генерации быстрых образцов для классификатора настроений следующим образом:
*Промпт:*
```
Produce 10 exemplars for sentiment analysis. Examples are categorized as either positive or negative. Produce 2 negative examples and 8 positive examples. Use this format for the examples:
Q: <sentence>
A: <sentiment>
```
*Результат:*
Q: I just got the best news ever!
A: Positive
Q: We just got a raise at work!
A: Positive
Q: I'm so proud of what I accomplished today.
A: Positive
Q: I'm having the best day ever!
A: Positive
Q: I'm really looking forward to the weekend.
A: Positive
Q: I just got the best present ever!
A: Positive
Q: I'm so happy right now.
A: Positive
Q: I'm so blessed to have such an amazing family.
A: Positive
Q: The weather outside is so gloomy.
A: Negative
Q: I just got some terrible news.
A: Negative
```
Это очень полезно. Фактически, мы используем этот пример для другого теста в другом разделе руководства.

@ -0,0 +1,105 @@
# PAL (Program-Aided Language Models)
import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import PAL from '../../img/pal.png'
[Gao и др., (2022)](https://arxiv.org/abs/2211.10435) представляют метод, который использует LLM-модели для чтения проблем естественного языка и генерации программ в качестве промежуточных шагов рассуждения. Названные "program-aided language models" (PAL), они отличаются от цепочки мыслей в том, что вместо использования свободного текста для получения решения они передают этот шаг решения в программное окружение, такое как интерпретатор Python.
<Screenshot src={PAL} alt="PAL" />
Источник изображения: [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).
Вот импорты, которые нам понадобятся:
```python
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv
```
Давайте сначала настроим несколько вещей:
```python
load_dotenv()
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")
# for LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
```
Настройка экземпляра модели:
```python
llm = OpenAI(model_name='text-davinci-003', temperature=0)
```
Настройка подсказки + вопроса:
```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 = """
# Q: 2015 is coming in 36 hours. What is the date one week from today in MM/DD/YYYY?
# If 2015 is coming in 36 hours, then today is 36 hours before.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# One week from today,
one_week_from_today = today + relativedelta(weeks=1)
# The answer formatted with %m/%d/%Y is
one_week_from_today.strftime('%m/%d/%Y')
# Q: The first day of 2019 is a Tuesday, and today is the first Monday of 2019. What is the date today in MM/DD/YYYY?
# If the first day of 2019 is a Tuesday, and today is the first Monday of 2019, then today is 6 days later.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# The answer formatted with %m/%d/%Y is
today.strftime('%m/%d/%Y')
# Q: The concert was scheduled to be on 06/01/1943, but was delayed by one day to today. What is the date 10 days ago in MM/DD/YYYY?
# If the concert was scheduled to be on 06/01/1943, but was delayed by one day to today, then today is one day later.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 days ago,
ten_days_ago = today - relativedelta(days=10)
# The answer formatted with %m/%d/%Y is
ten_days_ago.strftime('%m/%d/%Y')
# Q: It is 4/19/1969 today. What is the date 24 hours later in MM/DD/YYYY?
# It is 4/19/1969 today.
today = datetime(1969, 4, 19)
# 24 hours later,
later = today + relativedelta(hours=24)
# The answer formatted with %m/%d/%Y is
today.strftime('%m/%d/%Y')
# Q: Jane thought today is 3/11/2002, but today is in fact Mar 12, which is 1 day later. What is the date 24 hours later in MM/DD/YYYY?
# If Jane thought today is 3/11/2002, but today is in fact Mar 12, then today is 3/1/2002.
today = datetime(2002, 3, 12)
# 24 hours later,
later = today + relativedelta(hours=24)
# The answer formatted with %m/%d/%Y is
later.strftime('%m/%d/%Y')
# Q: Jane was born on the last day of Feburary in 2001. Today is her 16-year-old birthday. What is the date yesterday in MM/DD/YYYY?
# If Jane was born on the last day of Feburary in 2001 and today is her 16-year-old birthday, then today is 16 years later.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Yesterday,
yesterday = today - relativedelta(days=1)
# The answer formatted with %m/%d/%Y is
yesterday.strftime('%m/%d/%Y')
# Q: {question}
""".strip() + '\n'
```
```python
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
```
```python
exec(llm_out)
print(born)
```
Это выведет следующее: `02/27/1998`

@ -0,0 +1,112 @@
# Функции в промпте
## Введение
Когда мы проводим параллель между диалоговым интерфейсом GPT и оболочкой языка программирования, можно считать, что инкапсулированный промпт формирует функцию. У этой функции есть уникальное имя, и когда мы вызываем это имя с текстом ввода, она производит результаты на основе заданных внутренних правил. Вкратце, мы создаем повторно используемый промпт с именем, которое облегчает взаимодействие с GPT. Это похоже на наличие удобного инструмента, который позволяет GPT выполнять определенные задачи за нас - мы просто предоставляем входные данные, и получаем желаемый результат.
Путем инкапсуляции промптов в функции вы можете создавать серию функций для установления рабочего процесса. Каждая функция представляет собой определенный шаг или задачу, и когда они объединяются в определенном порядке, они могут автоматизировать сложные процессы или эффективно решать проблемы. Такой подход позволяет более структурированно и эффективно взаимодействовать с GPT, в конечном итоге расширяя его возможности и делая его мощным инструментом для решения широкого спектра задач.
Поэтому, прежде чем использовать функцию, мы должны позволить GPT о ней узнать. Вот промпт, которая определяет функцию.
*Промпт:*
> Давайте назовем этот промпт **мета-промптом**.
Этот промпт была протестирована на GPT3.5 и работает еще лучше на GPT4.
```
Hello, ChatGPT! I hope you are doing well. I am reaching out to you for assistance with a specific function. I understand that you have the capability to process information and perform various tasks based on the instructions provided. In order to help you understand my request more easily, I will be using a template to describe the function, input, and instructions on what to do with the input. Please find the details below:
function_name: [Function Name]
input: [Input]
rule: [Instructions on how to process the input]
I kindly request you to provide the output for this function, based on the details I have provided. Your assistance is greatly appreciated. Thank you!
I will replace the text inside the brackets with the relevant information for the function I want you to perform. This detailed introduction should help you understand my request more efficiently and provide the desired output. The format is function_name(input) If you understand, just answer one word with ok.
```
## Примеры
### Ассистент для изучения английского языка
Например, предположим, что мы хотим использовать GPT для помощи в изучении английского языка. Мы можем упростить процесс, создав серию функций.
Этот пример был протестирован на GPT3.5 и работает еще лучше на GPT4.
#### Описание функции
Мы должны вставить **мета-промпт**, которая была определена выше раздела, в GPT
Затем мы создадим функцию `trans_word`.
Эта функция подсказывает GPT перевести китайский текст на английский.
*Промпт:*
```
function_name: [trans_word]
input: ["text"]
rule: [I want you to act as an English translator, spelling corrector and improver. I will provide you with input forms including "text" in any language and you will detect the language, translate it and answer in the corrected of my text, in English.]
```
Напишите функцию, которая расширяет текст.
*Промпт:*
```
function_name: [expand_word]
input: ["text"]
rule: [Please serve as a Chatterbox, spelling corrector, and language enhancer. I will provide you with input forms including "text" in any language, and output the original language.I want you to Keep the meaning same, but make them more literary.]
```
Напишите функцию, которая исправляет текст.
*Промпт:*
```
function_name: [fix_english]
input: ["text"]
rule: [Please serve as an English master, spelling corrector, and language enhancer. I will provide you with input forms including "text", I want you to improve the text's vocabulary and sentences with more natural and elegent. Keep the meaning same.]
```
Наконец, вы можете запускать функцию независимо или объединять их в цепочку.
*Промпт:*
```
trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')
fix_english('Finally, you can run the function independently or chain them together.')
fix_english(expand_word(trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')))
```
Представляя функции в таком формате, вы можете ясно видеть имя каждой функции, входные данные и правило для обработки входных данных. Это обеспечивает организованный способ понимания функциональности и цели каждого шага в рабочем процессе.
_советы:_
Если вы не хотите, чтобы ChatGPT выдавал лишнюю информацию, вы можете просто добавить предложение после определения правил функции.
```
DO NOT SAY THINGS ELSE OK, UNLESS YOU DONT UNDERSTAND THE FUNCTION
```
### Функция с несколькими параметрами
Давайте создадим функцию, которая генерирует пароль, используя пять входных параметров, и выводит сгенерированный пароль.
*Промпт:*
```
function_name: [pg]
input: ["length", "capitalized", "lowercase", "numbers", "special"]
rule: [I want you to act as a password generator for individuals in need of a secure password. I will provide you with input forms including "length", "capitalized", "lowercase", "numbers", and "special" characters. Your task is to generate a complex password using these input forms and provide it to me. Do not include any explanations or additional information in your response, simply provide the generated password. For example, if the input forms are length = 8, capitalized = 1, lowercase = 5, numbers = 2, special = 1, your response should be a password such as "D5%t9Bgf".]
```
```
pg(length = 10, capitalized = 1, lowercase = 5, numbers = 2, special = 1)
pg(10,1,5,2,1)
```
### Мысли
На данный момент уже существует множество проектов, работающих над программированием GPT, таких как:
- [GitHub Copilot](https://github.com/features/copilot)
- [Microsoft AI](https://www.microsoft.com/en-us/ai)
- [chatgpt-plugins](https://openai.com/blog/chatgpt-plugins)
- [LangChain](https://github.com/hwchase17/langchain)
- [marvin](https://github.com/PrefectHQ/marvin)
Но эти проекты разрабатываются либо для клиентов продукта, либо для пользователей, способных программировать на Python или других языках программирования.
Для обычного пользователя используйте этот простой шаблон для повседневной работы и несколько раз повторите итерацию. Используйте приложение для заметок для документирования функции, и оно даже может быть обновлено до библиотеки.
В качестве альтернативы, можно использовать некоторые инструменты с открытым исходным кодом для ChatGPT, такие как ChatGPT-Next-Web, chatbox и ChatGPT-Desktop. В настоящее время ChatGPT-Next-Web позволяет добавлять несколько подсказок перед инициализацией нового чата.
Мы можем использовать эту функцию, чтобы добавить нашу функцию, которую можно будет использовать.

@ -0,0 +1,58 @@
# Исследование по классификации
[Clavié и др., 2023](https://arxiv.org/abs/2303.07142) представляют исследование по инженерии промптов, примененное к среднемасштабному случаю классификации текста в системе производства. Используя задачу классификации работы на настоящую "рабочую позицию для выпускников", подходящую для недавно выпустившихся выпускников, они оценили ряд техник инженерии промптов и сообщают о своих результатах с использованием GPT-3.5 (`gpt-3.5-turbo`).
Работа показывает, что LLM превосходит все другие протестированные модели, включая крайне сильный базовый уровень в DeBERTa-V3. `gpt-3.5-turbo` также заметно превосходит более старые варианты GPT3 по всем основным метрикам, но требует дополнительного анализа вывода, так как его способность следовать шаблону кажется хуже, чем у других вариантов.
Основные результаты их подхода к инженерии промптов:
- Для задач, в которых не требуется специалистические знания, метод CoT с малым количеством примеров показывал худшие результаты по сравнению с методом Zero-shot во всех экспериментах.
- Влияние промпта на правильное рассуждение огромно. Простое задание модели классифицировать данную работу дает значение F1-меры 65,6, тогда как модель с инженерией промпта достигает значения F1-меры 91,7.
- Попытка заставить модель следовать шаблону снижает производительность во всех случаях (это поведение исчезает в ранних тестах с GPT-4, которые являются последующими по отношению к статье).
- Множество небольших модификаций имеют значительное влияние на производительность.
- Таблицы ниже показывают все протестированные модификации.
- Правильное формулирование инструкций и повторение ключевых моментов, кажется, являются наиболее важными факторами успеха.
- Даже такая простая вещь, как дать модели (человеческое) имя и обращаться к ней таким образом, повысила значение F1-меры на 0,6 пункта.
### Протестированные модификации промпта
| Краткое название | Описание |
|-----------------|--------------------------------------------------------------------------|
| Базовый | Предоставить объявление о работе и спросить, подходит ли оно выпускнику. |
| CoT | Дать несколько примеров точной классификации перед запросом. |
| Zero-CoT | Попросить модель рассуждать пошагово перед предоставлением ответа. |
| rawinst | Дать инструкции о роли и задаче, добавив их к пользовательскому сообщению.|
| sysinst | Дать инструкции о роли и задаче в системном сообщении. |
| bothinst | Разделить инструкции с указанием роли в системном сообщении и задачи в пользовательском сообщении.|
| mock | Дать задание с помощью имитации дискуссии, где оно их учитывает. |
| reit | Укрепить ключевые элементы в инструкциях путем их повторения. |
| strict | Попросить модель ответить, строго следуя заданному шаблону. |
| loose | Попросить только предоставить окончательный ответ, следуя заданному шаблону.|
| right | Попросить модель прийти к правильному выводу. |
| info | Предоставить дополнительную информацию, чтобы устранить типичные ошибки рассуждения.|
| name | Дать модели имя, которым мы обращаемся к ней в разговоре. |
| pos | Предоставить модели положительную обратную связь перед запросом. |
### Влияние всех модификаций промпта на производительность
| | Точность | Полнота | F1 | Соответствие шаблону |
|----------------------------------------|---------------|---------------|---------------|------------------------|
| _Базовый_ | _61.2_ | _70.6_ | _65.6_ | _79%_ |
| _CoT_ | _72.6_ | _85.1_ | _78.4_ | _87%_ |
| _Zero-CoT_ | _75.5_ | _88.3_ | _81.4_ | _65%_ |
| _+rawinst_ | _80_ | _92.4_ | _85.8_ | _68%_ |
| _+sysinst_ | _77.7_ | _90.9_ | _83.8_ | _69%_ |
| _+bothinst_ | _81.9_ | _
93.9_ | _87.5_ | _71%_ |
| +bothinst+mock | 83.3 | 95.1 | 88.8 | 74% |
| +bothinst+mock+reit | 83.8 | 95.5 | 89.3 | 75% |
| _+bothinst+mock+reit+strict_ | _79.9_ | _93.7_ | _86.3_ | _**98%**_ |
| _+bothinst+mock+reit+loose_ | _80.5_ | _94.8_ | _87.1_ | _95%_ |
| +bothinst+mock+reit+right | 84 | 95.9 | 89.6 | 77% |
| +bothinst+mock+reit+right+info | 84.9 | 96.5 | 90.3 | 77% |
| +bothinst+mock+reit+right+info+name | 85.7 | 96.8 | 90.9 | 79% |
| +bothinst+mock+reit+right+info+name+pos| **86.9** | **97** | **91.7** | 81% |
Соответствие шаблону относится к тому, насколько часто модель отвечает в желаемом формате.
Loading…
Cancel
Save