Программирование в GPT для чайников. Часть 1
Введение
В последние месяцы тема искусственного интеллекта активно обсуждается в профессиональных сообществах, и ChatGPT занимает в этом процессе ключевую роль. Однако не только разработчики могут воспользоваться его возможностями. В этой статье я расскажу, как люди без навыков программирования могут использовать ChatGPT для выполнения задач, связанных с кодированием, благодаря встроенным возможностям модели GPT-4o.
Что такое ChatGPT и как он работает
ChatGPT — это мощная нейросеть, способная обрабатывать естественный язык и выполнять различные задачи, включая генерацию кода. С помощью правильных запросов (промптов) даже начинающие пользователи могут автоматизировать процессы и решать задачи без необходимости писать код самостоятельно.
Использование ChatGPT для программирования без навыков кодирования
Одной из уникальных особенностей ChatGPT является возможность генерировать и выполнять код с помощью встроенных инструментов. Это позволяет пользователям выполнять программные задачи, такие как создание документации, обработка данных или разработка простых приложений, без глубоких знаний в программировании.
Как это работает
Когда вы отправляете запрос (промпт) в ChatGPT, нейросеть генерирует код на основе вашего описания задачи. Этот код затем выполняется виртуальной машиной, интегрированной в систему GPT-4. Таким образом, вы можете программировать прямо в среде ChatGPT, даже не имея навыков кодирования.
Фактически, правильно составляя промпт, вы создаёте техническое задание для ChatGPT, по которому он пишет нужный код и обрабатывает ваши данные.
Для эффективного выполнения сложных задач с помощью ChatGPT важно составлять детализированные и структурированные промпты. Это позволяет нейросети точно понимать ваши требования и выполнять задачи последовательно и без ошибок.
Дисклеймер
Данная статья предоставлена в образовательных целях. Несмотря на то, что описанный подход в целом рабочий, он не гарантирует стабильной выдачи качественного результата при каждом запуске.
В конечном итоге я отказался от этого метода и перешёл на взаимодействие с ChatGPT через API. Однако данные, полученные в рамках данной задачи, позволяют лучше понимать, как «общаться» с ChatGPT и получать более прогнозируемый результат.
Быстрый старт
В статье много информации, но если вам лень читать её всю, я сразу дам вам короткое «заклинание», которое значительно улучшит обработку больших данных или сложных задач. Просто после любого вашего задания добавьте следующий текст:
## Требования к процессу
- Разбиение работы: Разбей всю работу на логические этапы, которые можно выполнять по отдельности.
- Журналирование: Ведите журнал обработки, фиксируя ключевые этапы выполнения и возможные ошибки. Все записи в журнале должны быть на русском языке.
- Комментарии: Комментируйте свои действия и решения на русском языке, объясняя, какие шаги выполняются и почему.
Это превратит модель в программу которая будет чётко выполнять инструкции, разбивать работу на этапы и формировать лог действий для вас в чате.
Методология исследования
Я хотел решить задачу автоматической подготовки документации на основе архива.
Поскольку я не знаю, как именно работает ChatGPT изнутри, я использовал более продвинутую модель (GPT-1o-preview) для подготовки промпта и выявления особенностей работы чата, а вторую модель (GPT-4o) для выполнения инструкций. Результаты выполнения со своими комментариями я передавал первой модели, и она корректировала промпт.
Повторив этот процесс несколько сотен раз и отработав десятки сценариев, я разработал рабочий подход, позволяющий решать довольно сложные задачи.
Язык и оформление промта
Наиболее понятным языком для ChatGPT является Markdown. Он достаточно простой и позволяет передавать форматирование в текстовом виде.
Использование форматирования очень важно для расстановки правильных акцентов. Например, использование заголовков помогает структурировать промпт, а выделение текста жирным акцентирует внимание ChatGPT на важности данной инструкции.
Если требуется дополнительно усилить важность инструкции, можно начать её со слова «Важно».
Пример:
- **Важно:** Файлы должны быть указаны **перед** папками на каждом уровне вложенности.
Необходимо соблюдать баланс в форматировании, так как значимость возникает только по отношению к чему-либо. Если весь промпт выделен жирным, он будет восприниматься так же, как и обычный текст.
Структура промпта
Промпт должен содержать три основных блока:
1. Описание задачи
2. Требования к процессу
3. Этапы выполнения работ
Описание задачи
Этот блок устанавливает конечную цель, которую необходимо достичь с помощью ChatGPT. Описание должно быть ясным и содержать все основные условия выполнения задачи.
Пример:
## Описание задачи
Необходимо создать **полную и подробную документацию** по модулю из предоставленного архива в формате **Markdown** на **русском языке**. Документация должна повторять структуру файлов модуля и включать детальные описания каждого файла и папки.
Требования к процессу
Блок «Требования к процессу» содержит условия, которые должны соблюдаться при выполнении промпта. Здесь я приведу ряд примеров и объясню, для чего они могут понадобиться.
Точность действия
### 1. Точность действий
- Все шаги должны **строго следовать инструкциям**, данным ниже. Если шаг не описан или неясен, остановитесь и запросите уточнение у пользователя.
Это требование теоретически должно улучшить качество выдаваемого результата, но на практике оно лишь незначительно повышает эффективность. К сожалению, через промпт не получается снизить «температуру» генерации. При каждом запуске промпт обрабатывается по-разному и выдает немного отличающийся результат. Например, в 9 из 10 случаев он может корректно строить дерево файлов, а при 10-м запуске отобразить его неверно.
Разбиение работы на этапы
### 2. Разбиение работы
- Разбей всю работу на логические этапы, которые можно выполнять по отдельности.
- Продолжительность обработки одного этапа не должна превышать 30 секунд.
Данное требование очень важно. Оно позволяет выполнять большие задачи не за один шаг, а разбивать их на этапы и выполнять по частям. Это требование необходимо обязательно использовать при создании любых сложных или больших заданий.
Например, такое требование позволяет обрабатывать архив с данными в CSV-файле размером в несколько мегабайт.
Преимущество этого подхода в том, что модель сама определяет, на какие этапы разбивать работу, и при этом данные остаются связанными. Мы вводим только ограничение по времени — 30 секунд. Это время выбрано эмпирически. По моему опыту, запросы с выполнением более 1 минуты выдают ошибки.
Подпроцессы
### 3. Подпроцессы
- Подпроцессы нельзя объединять. Каждый подпроцесс нужно обработать отдельно, без параллельного выполнения других задач. Внутри подпроцесса можно разбивать работу на логические этапы, которые можно выполнять по отдельности.
- Запуск "подпроцесса”: при обработке особого этапа выполнение всех остальных процессов приостанавливается. Необходимо выполнить только данный этап, вывести результат его выполнения в чат, и дождаться подтверждения пользователя для продолжения.
Подпроцессы по сути являются циклами. Мне удалось получать стабильные результаты при использовании двойного цикла (когда один цикл запускается внутри другого). Однако одиночный цикл проще для реализации. Чтобы цикл работал корректно, необходимо нумеровать все действия в этапах выполнения работ и в нужных местах указывать условия проверки и перехода к соответствующим пунктам.
Журналирование
### 4. Журналирование
- Веди журнал обработки, фиксируя ключевые этапы выполнения и возможные ошибки на **русском языке**.
- Выводи всю необходимую информацию о полученных данных в чат.
Журналирование необходимо для того, чтобы вы понимали, что происходит в «голове» нейросети. Это позволяет видеть, что она делает, и выдавать промежуточные результаты. Обязательно укажите, на каком языке должна выводиться информация. По умолчанию журнал ведётся на английском языке.
Продолжение работы
### 5. Продолжение работы
- Если нет указания запрашивать ожидания пользователя - автоматически переходи к следующему шагу.
- Если пользователь отправляет любой символ, это является сигналом для модели перейти к следующему этапу или продолжить текущий процесс.
Так как модель разбивает работу на части, то на каждом этапе она выдаёт лишь часть результата. Поэтому при выдаче очередной порции данных необходимо написать «продолжай», чтобы нейросеть продолжила обработку данных. Чтобы этого избежать, я добавил это требование, которое позволяет просто нажимать любой символ и Enter.
С автоматической обработкой нужно быть осторожным. Модель стремится сделать как можно больше за один шаг, и поэтому, если сделать везде автоматическую обработку, она выполнит всё, что может за один шаг. И, скорее всего, результат вам не понравится.
Необходимо найти баланс между ручным управлением движением по шагам и автоматической обработкой. Чем больше шагов, тем точнее результат, но тем больше вам придётся сидеть перед экраном и нажимать кнопку, чтобы чат продолжил обработку.
Проверка и восстановление файлов
### 6. Проверка и восстановление файлов
Если в процессе работы обнаружится, что распакованные файлы недоступны или отсутствуют:
- Сообщи пользователю: "Распакованные файлы не обнаружены. Пожалуйста, загрузите архив снова, чтобы продолжить работу."
- Дождись загрузки архива от пользователя.
- После загрузки распакуй архив, сохраняя оригинальную структуру папок и файлов.
- Убедись, что пути в файле `progress.json` совпадают с распакованными файлами.
- Продолжи обработку с того места, где остановился, используя `progress.json` для определения текущего статуса выполнения.
Данное требование необходимо, если вы работаете с файлами. Файлы хранятся примерно 15–20 минут, после чего они удаляются. Поэтому, если ваша задача предполагает более длительную работу с файлами, нужно создать требование для их восстановления. Обычно это сводится к повторению определённых действий.
Также вы можете поэкспериментировать со временем хранения файлов, добавив требования проверки времени создания файла и его перезаписи. В этом случае можно увеличить время хранения, но данный метод работает нестабильно.
Продолжение следует?
Если вам интересна эта тема, дайте знать, и я подготовлю вторую часть, в которой расскажу, как с помощью промптов можно:
Выполнять операции с файлами
Создавать циклы и условия
Создавать JSON-массивы с определённой структурой и работать с ними
Сохранять промежуточные результаты и использовать их в последующих шагах
Проводить многоуровневую обработку данных
Также, если нужно, я подготовлю репозиторий со всеми удачными версиями промтов, с помощью которых можно подготовить документацию на основании архива с кодом.