Программирование с ChatGPT: личный опыт

Автоматизация помогает SEO оптимизировать сайты быстрее и эффективнее. Я не программист — знаю только синтаксис Python на базовом уровне, практического опыта нет. Поэтому, когда нужно что-то автоматизировать, обычно ищу готовые решения или обращаюсь к разработчикам. Но так как ChatGPT давно помогает мне с SEO-задачами, на этот раз попробовал самостоятельно написать скрипт с его помощью.

Спойлер: потратил около 150 часов, чтобы заставить ChatGPT нормально писать и отладить код, но рабочий скрипт всё-таки получил.

Обо мне

Занимаюсь продвижением сайтов с 2011 года. Руковожу командами, консультирую в области практического SEO, помогаю бизнесам выстраивать SEO-процессы. Работал со стартапами и крупным бизнесом. Сейчас в основном занимаюсь SEO под бурж, в том числе продвигаю сайты российских компаний за рубежом.

Мой Телеграм: @alexkrads

Для чего и какой конкретно скрипт создавал?

Дано. Одному из наших клиентов в Великобритании нужно было сделать контекстную перелинковку для нескольких тысяч страниц сайта (примерно 5000 страниц) . В основном это новости, где надо было разместить ссылки на продвигаемые страницы. Чтобы определить в текстах слова, которые можно преобразовать в ссылку, использовали ключевые фразы из семантического ядра. У нас оно содержало около 3000 фраз.

Проблема. Очевидно, что искать и размещать такое огромное количество ссылок вручную слишком затратно по времени, а текстов с сайта было бы задействовано в разы меньше, чем с автоматизацией. Сложности добавляло то, что для CMS подобных плагинов не существует.

Решение. Написать скрипт с помощью ChatGPT, имея нулевой опыт в программировании. Давно известно, что нейросеть может найти баги в коде или написать что-то простое, но справится ли с чем-то более-менее сложным? Оказалось, что может.

Скрипт, который я написал, работает следующим образом:

1. На вход подаются (в моём случае – загружаются в Google Colab) два excel-файла. Первый содержит два столбца: в одном URL страницы, внутри которой нужно добавить ссылку, а в другом её контент. Из контента предварительно удалены все HTML теги, кроме тегов. Во втором файле тоже два столбца – URL продвигаемой страницы и ключевое слово. URL могут повторяться, если для одной страницы предусмотрено больше одного ключа.

2. Скрипт очищает контент от двойных пробелов и некоторых непечатных символов, находит в нём имеющиеся ссылки, индексирует текст (псевдоиндексация, на самом деле записывает начальную и конечную позицию каждого слова) и лемматизирует каждое слово в индексе.

3. Индексируются все ключевые фразы, разбиваются на слова и тоже лемматизируются.

4. Скрипт ищет лемматизированную последовательность слов в контенте, причём сначала должен найти самые длинные последовательности для каждого URL. Более того, скрипт не ищет ключевые слова в текстах ссылок, которые уже есть в исходной статье, и не использует для поиска ключевые слова с URL, который уже есть хотя бы у одной ссылки в контенте.

5. Когда лемматизированная последовательность слов найдена, скрипт сохраняет номера начальной и конечной позиции всей найденной в контенте последовательности слов и соответствующий URL ключевой фразы.

6. На выходе создаётся Word файл, содержащий URL страницы с контентом, сам контент со старыми и новыми ссылками + список добавленных ссылок. Цвета существовавших ранее и новых ссылок отличаются.

Индексирование использовали для того, чтобы добавлять ссылки на ключевые фразы в тех словоформах, в которых они существуют в исходном тексте, а не в лемматизированном. Кроме этого, такой подход решил проблемы с поиском существующих ссылок (просто не ищем ключевое слово на тех позициях, где есть ссылка) .

Из дополнительных опций в скрипте есть:

  • возможность не добавлять текст в Word файл, если в нём нет ни одной новой ссылки;
  • возможность не искать ссылки с тем же URL, что и URL страницы с контентом;
  • использование нескольких лемматизаторов;
  • обработка текста на русском и английском языках.

На мой взгляд, подход с Word файлом на выходе не самый удобный – я бы использовал решение, позволяющее копировать и вставлять HTML код в CMS сайта, либо вообще импортировать контент в БД.

В целом ничего не мешает изменить формат вывода, но в нашем случае клиенту было удобнее работать именно так, копируя из Word. И, честно говоря, при таком выводе было проще отлавливать ошибки, пока код был совсем сырой.

Как написать скрипт: пошаговый алгоритм

Если нужно заставить чат обработать много информации, как в нашем случае, стоит подключить Data Analysis – плагин от OpenAI. Он работает так: загружаем в ChatGPT файл (или несколько) с исходными данными, нейросеть анализирует их на своих серверах и получает информацию, с которой может работать дальше.

Такой подход особенно удобен, когда мы просим разработать алгоритм. К тому же, через Data Analysis можно предоставить чату вручную созданный файл с результатом в качестве примера.

Плагин доступен только на тарифе Plus за 20$ в месяц, подключается в личном кабинете. После активации прямо в стандартном интерфейсе ChatGPT появится кнопка для загрузки файлов объёмом до 512 Мб.

Шаг 1: подготовка и анализ данных

Итак, сначала собираем данные в файлы для загрузки в нейросеть. У меня было два файла в xlsx. Согласно официальной документации также поддерживаются форматы PDF, текст (.txt), PowerPoint (.ppt), Word (.doc), Excel (.xlx), Comma-separated values (.csv), однако в реальности поддерживается еще и xlsx, docx и zip архивы. «Скармливаем» готовые документы чату через Data Analysis и просим проанализировать их прямым текстом: «Проанализируй эти файлы».

В этом же или следующем промте описываем результат, который хотим получить. В нашем случае это код на Python, так как нейросеть поддерживает только этот язык программирования.

Шаг 2: разработка структуры и логики скрипта

Предполагаем, что данные должны обрабатываться в несколько действий. Поэтому просим нейросеть сначала составить план, содержащий логику работы скрипта.

Вот такой план мне предложила нейросеть:

<p>Альтернативный вариант: вы можете предложить свою логику. Каждый шаг надо продумать самому и поэтапно описать, что конкретно должен делать скрипт. Рекомендую пронумеровать шаги, чтобы в дальнейшем во время правок ссылаться на порядковый номер.</p>

Альтернативный вариант: вы можете предложить свою логику. Каждый шаг надо продумать самому и поэтапно описать, что конкретно должен делать скрипт. Рекомендую пронумеровать шаги, чтобы в дальнейшем во время правок ссылаться на порядковый номер.

Шаг 3: проверка логики

Получив логику, проверяем её корректность. Если любой из предложенных шагов нас не устраивает, пишем:

«Используй следующий вариант»

После чего копируем понравившиеся решения и исправляем неудачные, оставив нумерацию.

Структуре и логике скрипта важно уделить как можно больше внимания. Убедиться, нет ли каких-то слишком общих шагов, продумать, какие исключения могут возникнуть и т.п. Чем детальнее логика, тем выше шансы получить работающий скрипт и минимум багов в дальнейшем.

Шаг 4: запуск кода

Когда логика проверена и при необходимости исправлена, просим ChatGPT предоставить нам код. В промте стоит указать, чтобы нейросеть по возможности прописывала отдельные функции для каждого шага, если она так не делает.

Это нужно, чтобы:

  • упростить отладку – в дальнейшем можно будет фрагментарно править код;
  • сделать структуру скрипта понятнее.

ChatGPT всегда стремится запустить готовый код в окне чата. Если он более-менее сложный, заранее пропишите в промте, что не нужно пытаться его запускать. Встроенных библиотек в любом случае будет недостаточно, а внешние нейросеть загрузить не сможет. В итоге получается примерно такое:

Я предпочитаю сразу указывать, что код предназначен для запуска в Google Colab.
Я предпочитаю сразу указывать, что код предназначен для запуска в Google Colab.

Шаг 5: правки

Без правок вообще никак, поэтому готовьтесь к тому, что их будет много. Задать промт и сразу получить готовый рабочий скрипт, особенно для задачи со сложной логикой – это что-то на грани фантастики.

Как я уже говорил, в совокупности у меня ушло около 150 часов, чтобы заставить код делать то, что мне нужно. Больше всего времени (95%) потратил именно на правки. Дальше расскажу, какие проблемы возникали.

Проблемы, с которыми столкнулся в процессе

В работе с нейросетью-программистом есть целый спектр проблем, с которыми вы, скорее всего, столкнетесь.

Забывчивость ChatGPT

Каким бы хорошим ни был промт, при работе с большим количеством правок ChatGPT всё равно может забыть важные детали. Например, в своём скрипте я просил ChatGPT лемматизировать слова для дальнейшего поиска, что было едва ли не ключевым требованием. Но после очередного исправления багов ChatGPT упростил код и удалил всё, что было связано с лемматизацией.

Единственный способ решить проблему – постоянно контролировать, что именно вам предлагает нейросеть. Проверяйте, не изменился ли существенно объём кода. Читайте код (да, придётся разобраться в синтаксисе – поверьте, так будет быстрее). Обращайте внимание на комментарии в коде.

Если столкнулись с забывчивостью ChatGPT, просто напомните об этом в промте, скопируйте и пришлите ему ту часть кода, которую нужно отредактировать.

Попытки выполнить код в окне чата

Если создаёте код, для которого у ChatGPT есть все необходимые библиотеки, эта проблема для вас не актуальна. Но если требуется загрузка внешних библиотек, ChatGPT не сможет выполнить код. Проблема в том, что нейронка «осознаёт» это только после того, как код уже написан, а попытка запустить его оказалась неудачной.

Чтобы этого избежать, сразу пишите в промтах, что будете запускать код во внешней библиотеке – например, в Google Colab. Дополнительно это позволит сразу получать код с правильными путями к загружаемым файлам, возможностью их загрузки при выполнении кода и т.п.

Поэтому добавляем промт:

«Не запускай код самостоятельно, у тебя нет возможности загрузить внешние библиотеки. Я буду запускать и проверять код в Google Colab.»

Низкая скорость работы

Спустя несколько десятков сообщений от ChatGPT, содержащих много кода, окно чата начитает подвисать и в целом работать медленно. Надо учитывать, что в какой-то момент загрузка файлов с данными, с кодом скрипта или результатом его работы становится невозможной. То есть сама возможность в окне чата сохраняется, но загрузка всегда начинает приводить к ошибке.

Очень много банальных правок

Приходится постоянно вносить правки, чаще всего банальные. Они могут быть связаны:

1. С потерей контекста

ChatGPT может забывать, что вы работаете с определенной библиотекой. В моём случае использовался Spacy вместо NLTK. Я постоянно сталкивался с тем, что GPT переписывал куски кода под неправильную библиотеку.

2. С «невнимательностью»

Нейросеть забывает передавать параметры в функции, если мы таковые внедряем. Например, добавляем переменную, которая отвечает за то, чтобы в итоговый файл не выводились пустые строки. Переменная принимает значения True и False. ChatGPT, скорее всего, добавит значения переменной в вызов функции, но не добавит их в принимаемые аргументы в самой функции.

Более сложный пример – в логике могут пропускаться целые блоки каких-либо проверок.

3. С особенностями обучения модели (возможно)

ChatGPT обучен на открытых данных, которые включают в себя как официальную документацию к языку Python, так и источники по типу Stack Overflow с контентом, созданным пользователями (UGC). Когда я проверял куски кода от ChatGPT, поиск часто приводил меня именно туда (допускаю, что это совпадение, и одинаковые задачи могут решаться типовым способом). К сожалению, такой код далеко не всегда рабочий.

Также бывают случаи, когда код изначально был работоспособен, но не совместим с используемыми версиями библиотек.

4. Со стремлением решать следствия, а не причины проблемы

Я столкнулся с тем, что при составлении текста из списка слов между словами появлялись двойные пробелы. ChatGPT добавлял их, поскольку ранее после запуска других функций слова вообще не разделялись пробелами, но с этим мы разобрались. На просьбу убрать лишние пробелы нейронка сгенерировала код, который убирает двойные пробелы вместо того, чтобы просто их не создавать.

5. С отсутствием очевидной оптимизации

Код крайне медленно работает на больших объёмах данных. Обработка файла на 2000 страниц (100 000 знаков) занимала до 45 минут. Оказалось, что некоторые функции, которые достаточно было применить всего один раз во время выполнения кода, применялись для каждого слова в тексте.

Решение лежало на поверхности – надо изменить логику в этой части исправлением пары строк кода. Но на моё предложение просто оптимизировать код ChatGPT предложил проверить время исполнения каждой функции. Такое решение, конечно, помогло оптимизировать код, но без прямой просьбы ChatGPT «не замечал» эту проблему.

6. Со стремлением переименовывать функции

Предположим, вы решили изменить логику работы какой-то функции и создали соответствующий промт, либо указали чату на ошибки в уже имеющейся. В таком случае ChatCPT может создать похожую функцию с новым названием, при этом в вызове функции в коде останется старое название. Вместо функции alfa создаётся функция alfa_updated.

Для борьбы с этим важно обязательно читать названия ВСЕХ функций, предлагаемых в новых версиях кода, и при необходимости требовать использовать старые названия.

7. С зацикливанием

Представим, что нашли ошибку в результатах, вызванную некорректной логикой или отсутствием проверки исключений. Кроме этого, ошибка может быть в синтаксисе, вызове определенных функций, передаче аргументов и т.п.

Обычно помогает копирование текста ошибки, отображаемой интерпретатором кода (Colab) или, в случае с неправильной логикой – описание проблемы. После этого ChatGPT должен предоставить правильный, корректно работающий код.

Но иногда при исправлении одной ошибки создаётся новая, при решении которой нейросеть возвращается к исходной. Цепочка может состоять из нескольких действий, а иногда вообще становится бесконечной, когда новые правки приводят к новым или аналогичным ошибкам. Проблема может лежать на поверхности, но ChatGPT её не «увидит».

Чтобы разорвать этот порочный круг, приходится читать код, разбираться с логикой и указывать на ошибки, которые могут приводить к проблеме.

Мой опыт показал, что надо не требовать устранить ошибку, а задавать промт мягче и детальнее. Если просьба исправить ошибку сама по себе ошибочная (например, с кодом всё хорошо, а ошибка в исходных данных) или предлагаемый вами вариант тоже ошибочный, ChatGPT внесёт правки без какого-либо анализа, что может сделать только хуже.

Поэтому вместо:

«Исправь в <кусок кода> логику так, чтобы…»

Стоит формулировать промт так:

«Возможно, в этом коде <кусок кода> происходит <описать проблему>, проверь, так ли это и, если необходимо, исправь <описать логику как именно исправить>»

8. С ошибочной логикой

Может оказаться, что с изначальной логикой или последовательностью обработки невозможно получить нужный результат. Скорее всего, нейросеть, как и в предыдущем случае, будет бесконечно предлагать исправленный код, не решая проблему в корне. Здесь поможет только новый промт, где надо описать проблему и напрямую потребовать изменить логику.

Пример:

«Данный код не позволяет <описание проблемы>. Давай изменим логику и подход следующим образом <последовательное описание того, как всё должно работать>.»

Вместо описания можно попросить сгенерировать новую логику в соответствии с тем, что вам требуется.

Ещё хороший вариант – сослаться на функции, работу которых нужно скорректировать. Если изначально скрипт сразу обрабатывает данные, не сохранив промежуточный результат в отдельную переменную, то ChatGPT может так и не «додуматься» до того, что какие-то действия надо проводить именно над промежуточным результатом, а не над конечным.

9. С нелогичным распылением функционала между функциями

В относительно сложных проектах ChatGPT может создавать функции так, что одна из них выполняет свою основную задачу и часть задач какой-то другой функции. При этом вторая потенциально может решить обе задачи полностью или с минимальными изменениями.

Если упустить из виду этот нюанс, особенно при наличии нескольких таких функций, устранять ошибки на этапе отладки станет гораздо сложнее. Решается проблема с помощью промтов с требованием исправить функцию.

Решение проблем

Эксперименты показали, что ChatGPT довольно хорошо понимает, что именно от него хотят. Но рано или поздно вы всё равно столкнетесь с тем, что без опыта программировать с Data Analysis практически невозможно. Допускаю, что это не особо важно при написании кода с минимумом логики, но сложную задачу совсем без знаний решить не получится.

Для решения проблем вам потребуется:

Знать базовую терминологию Python. Без этого вы просто не сможете составлять правильные промты для исправления ошибок. Нейросеть просто не поймёт, чего вы хотите. Как минимум, понадобятся такие понятия, как функция, принт, кортеж, словарь, датасет, цикл и т.п.

Понимать синтаксис на базовом уровне. Вам придётся прочитать сгенерированный код, чтобы найти и если и не исправить баги, то хотя бы сослаться в промте на нужный фрагмент кода. Не обязательно знать состав тех или иных библиотек, но надо понимать, какие условия проверяются, для чего используются те или иные циклы и т.п. Без этого вы будете получать код, но не сможете довести его до ума или вообще заставить работать.

Предлагать свои варианты решения. Опять же, вы должны понимать логику работы скрипта на каждом шаге. Если изначально заложенная логика на каком-то этапе ошибочна, придётся либо просить ChatGPT предоставить новую, описав проблему и варианты решения, либо дать промт со своим видением.

Добавлять промежуточные принты (выводы) для отладки. Иногда ChatGPT сам предлагает добавить print или отображение первых строк датасета для отладки, но не всегда. В таком случае надо самостоятельно требовать их добавления (или добавлять сразу в код), чтобы получить больше вводных для отладки.

Более того, при работе с большими объемами (тысячи строк) может оказаться проще выводить данные в csv или в файл в любом другом удобном формате, поскольку в первых строках могут вообще не содержаться некорректно обработанные данные.

Просить полный код функций. При отладке кода ChatGPT часто присылает не функции или код целиком, а лишь строки, которые надо исправить. Лично мне часто непонятно, в какой именно части функции надо добавить эти правки. Кроме того, иногда не ясно, требуется ли заменить какие-то строки или просто добавить их.

Отправлять в Chat GPT последнюю рабочую версию кода или отдельных функций. Это помогает решить проблему с забывчивостью нейросети. Отправлять нужно с комментарием «Вот текущая работающая версия кода». То же самое делаем, если Chat GPT начал присылать большое количество правок, которые слабо относятся к ранее созданному коду.

Самое важное

Всегда сохраняйте рабочий код целиком и нумеруйте версии. Да, у вас будут десятки версий, но оно того стоит. Не жалейте времени на подробное описание того, что именно работает, а что нет, прямо в коде. И будьте готовы к тому, что ChatGPT в любой момент может внести правки, которые сделают ранее функционировавший, пусть и с ошибками, код полностью неработоспособным.

Искать же предыдущие версии кода в среди десяток или сотен сообщений в окне чата крайне долго и в принципе демотивирует. Если не сохранили код, придётся идти едва ли не с самых первых сообщений, последовательно меняя его.

Выводы

Время, которое я потратил на создание кода, обусловлено исключительно любопытством. Да, мы сэкономили время на ручной работе и повысили её качество, но времени потратили неадекватное количество. В моём случае было бы быстрее и проще обратиться к программисту.

Тем не менее, разработчики с опытом могут успешно внедрять кодинг такого плана и сокращать время на разработку. Подход вполне действенный, если надо быстро создать отдельную функцию под какую-то задачу или разобраться в чужом коде.

Ещё понравилось то, что чат даёт пошаговую логику работы скрипта, для которой обычно не нужны дополнения и исправления. А если вы банально не готовы никому платить и хотите самостоятельно создать какой-то инструмент, то Chat GPT – это отличный выбор.

На мой субъективный взгляд (напоминаю, что не я программист), код от ChatGPT вполне читаемый, хорошо структурирован и снабжён всеми необходимыми комментариями. Сам по себе код генерируется быстро, 95% времени уходит на его отладку.

22
6 комментариев

Link Whisper - дарю

1
Ответить

Link Whisper – отличное решение, однако он поддерживает WP и Shopify. Проект, для которого создавался скрипт - интернет-магазин одежды и использует фреймворк. Кроме этого, Link Whisper, на сколько мне известно (могу ошибаться, дайте знать, если это не так), находит точные вхождения ключевых слов. Если это так, то он не найдет, например, ключевую фразу “red dress” (единственное число) тексте, если в тексте присутствует только “red dresses” (множественное число). Это было основной причиной того, почему пришлось заморачиваться с лемматизацией и текста и анкоров.

Ответить

150 часов - это месяц полных рабдней , а в реальности все 2. Не стоило оно того

Ответить

Да, однако данный проект был в первую очередь экспериментом, целью которого было получение представления о возможностях создания кода от Chat GPT с нуля. Эксперимент было решено продолжить на этапе, когда скрипт смог находить точные вхождения и размечать их ссылками в тексте, что заняло на более 2-3 часов, а основное время ушло на псевдо индексацию, лемматизацию, учет пунктуации, игнорирование имеющихся в тексте ссылок и HTML разметки и т.п. Больше скажу: клиенту не выставляли счет за полный объем часов (потому что эта разработка и полученный результат столько не стоит) и, можно сказать, сделали просто инструмент для своих задач.

Ответить