Пример использования ChatGPT для написания кода

ChatGPT стал предметом обсуждения уже весьма давно и материалов на эту тему в Интернете есть бесконечное множество. Однако он так прекрасен и многогранен, что всегда можно написать по меньшей мере еще один материал и инициировать еще одно обсуждение, чем мы сейчас и займемся.
Я занимаюсь анализом данных и разработкой ПО, и с начала этого года ChatGPT стал моим верным помощником. Раньше как-то руки не доходили протестировать гениальную нейросеть на предмет способности решать повседневные программерские задачи, но как дошли, так жизнь сразу стала веселее.
Цель этого поста – показать часть возможностей ChatGPT в области работы с кодом и поделиться своими удачными промптами (и узнать про ваши удачные промпты и опыт, конечно же). Здесь описан небольшой и скорее «игрушечный» проект, который не должен был быть очень масштабным и сложным, но позволил охватить следующие важные задачи:
• дебаггинг (исправление ошибок в коде);
• написание кода по инструкции;
• создание текстового резюме к выполненной работе (в меньшей степени).
Полный чат можно прочитать здесь, а блокнот с кодом можно найти здесь (Crocodiles.ipynb).

<i>(Иллюстрация, выполненная с использованием DALL-E 3 от OpenAI)</i>
(Иллюстрация, выполненная с использованием DALL-E 3 от OpenAI)

Ищем крокодилов

Итак, у нас есть цель: найти в Википедии всю информацию о крокодилах, какая только там есть (от среды обитания до способов приготовления). Это задача в широком смысле относится к области обработки естественного языка. Она будет включать в себя следующие задачи:
• сбор данных (переход по ссылкам в Википедии, чтение и обработка статей);
• определение релевантности (соответствия текста статьи заявленной теме);
• сохранение статей, относящихся к теме поиска.
И еще важное ограничение: я не пишу ни единой строчки кода самостоятельно, только инструктирую GhatGPT. Поехали.

Шаг 1. Постановка задачи

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

<i>(Вводные данные)</i>
(Вводные данные)

Роль GhatGPT – специалист по обработке естественного языка (по специальности работает). Формальное описание задачи: мы начинаем со страницы «Крокодилы» и последовательно проходим по всем ссылкам, содержащимся на ней. Если статья по ссылке релевантная (про крокодилов), мы ее сохраняем и собираем ссылки с этой страницы. Если статья нерелевантная, пропускаем страницу и идем дальше. И так пока не выгребем всю Википедию (или не достигнем заранее установленного лимита, но об этом попозже).

Шаг 2. Определение релевантности

Релевантность – это степень соответствия текста статьи поисковому запросу. Она измеряется разными способами, но в нашем случае будет бинарной: статья либо соответствует запросу, либо нет, без полутонов.
Кроме того, во имя упрощения нашей работы (и непревращения этого поста в трехтомное собрание сочинений) мы будем определять релевантность с помощью наличия или отсутствия в статье некоторого набора терминов, относящегося к крокодилам. Набор терминов попросим сгенерировать GhatGPT.
Первый подход к генерации списка слов получился так себе: ассистент слишком буквально понял озвученную ранее постановку и наряду с терминами «Crocodile», «Alligator» и «Gharial» («крокодил», «аллигатор», «гавиал») предложил «Rivers» и «Poaching» («реки», «браконьерство»), то есть, термины, запрос по которым мог бы вернуть статьи про любых других животных, что нам не нужно. Кроме того, он предложил множество дублирующих терминов, например, «Crocodile leather» и «Crocodile anatomy» – «крокодиловая кожа» и «анатомия крокодилов». Несложно понять, что выдача по обоим словосочетаниям полностью входит в выдачу по слову «крокодил».

<i>(Запрос на исключение дублирующих и слишком широких терминов)</i>
(Запрос на исключение дублирующих и слишком широких терминов)

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

<i>(Запрос)</i>
(Запрос)
(<i>Ответ)</i>
(Ответ)

И еще проще.

<i>(Вообще простой запрос)</i>
(Вообще простой запрос)

В конце концов мы остановились на следующем списке:
• "Crocodile",
• "Crocodylidae",
• "Crocodylus",
• "Alligator",
• "Caiman",
• "Gharial",
• "Crocodilian".
В целом, пойдет, можно двигаться дальше.

<i>(«Как бы ты измерил релевантность?»)</i>
(«Как бы ты измерил релевантность?»)

В качестве метрики релевантности GhatGPT предлагает TF-IDF. Это не самый новый и не самый эффективный инструмент из всех доступных, но нам вполне подходит. Не дожидаясь просьб, старательный ассистент сразу предлагает код:

Пример использования ChatGPT для написания кода
Пример использования ChatGPT для написания кода
<i>(Неплохо, но маловато.)</i>
(Неплохо, но маловато.)

Шаг 3. Пишем код (объясняем ChatGPT, как писать код)

На первом шаге (подготовка текста) предлагается только убрать знаки пунктуации и разбить текст пословно. Поскольку мы имеем дело со статьями из Википедии, то есть, веб-страницами, нам нужно будет удалить html-теги. Затем необходимо убрать стоп-слова (те, которые встречаются часто, но не несут особого смысла, например, предлоги) и привести все слова к единой форме (например, слова «крокодилы» и «крокодиловый» к форме «крокодил») – для англоязычного текста достаточно будет стемминга. Тот же набор преобразований надо применить к нашему списку ключевых слов (в данном случае – только стемминг и перевод всех слов в нижний регистр). Все эти преобразования описываем текстом и получаем усовершенствованную функцию:

<i>(Улучшенная обработка текста)</i>
(Улучшенная обработка текста)

Следующий этап – все-таки реализовать TF-IDF, потому что предложить он предложил, а считать потом решил число вхождений терминов, что совсем примитивно.
Запрос в данном случае простой: «Замени свою метрику релевантности на TF-IDF».

<i>(Реализация)</i>
(Реализация)

Помимо функций ChatGPT любезно предлагает пример для проверки их работы:

Пример использования ChatGPT для написания кода

Воспользуемся им и получим результат «Статья нерелевантна», что очевидно не так. Ну и отлично, мы же хотим разобрать дебаггинг!

Исправление происходит в несколько этапов (все как у людей). На каждом этапе ChatGPT предполагает, что могло пойти не так, и дополняет код командами для вывода результатов (print). Приведение скриншотов нашей переписки, в которой все работает правильно по отдельности, но в совокупности не работает, сделает этот пост слишком длинным, поэтому опустим их. Вы можете обратиться к чату и прочитать часть, посвященную дебаггингу, самостоятельно. Она начинается вот отсюда:

<i>(Выясняем, что пошло не так, с этого момента)</i>
(Выясняем, что пошло не так, с этого момента)

Если коротко, решением стало добавление параметра «token_pattern» в функцию расчета TF-IDF. Это позволило совместить, наконец, текст статьи с ключевыми словами из списка и получить ожидаемый результат (сгенерированная статья релевантна запросу).
Последний шаг – написание функции для обхода Википедии.

<i>(Инструкция для веб-краулера: начинаем со статьи о крокодилах и чешем по всей Вики до обеда – или пока не наберем 10 статей)</i>
(Инструкция для веб-краулера: начинаем со статьи о крокодилах и чешем по всей Вики до обеда – или пока не наберем 10 статей)

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

Пример использования ChatGPT для написания кода
<i>(Целиком они приведены в чате и на гитхабе)</i>
(Целиком они приведены в чате и на гитхабе)

В результате получился вот такой список из десяти статей:
• 'https://en.wikipedia.org/wiki/Crocodile';
• 'https://en.wikipedia.org/wiki/Crocodile_(disambiguation)';
• 'https://en.wikipedia.org/wiki/Eocene';
• 'https://en.wikipedia.org/wiki/Holocene';
• 'https://en.wikipedia.org/wiki/Triassic';
• 'https://en.wikipedia.org/wiki/Jurassic';
• 'https://en.wikipedia.org/wiki/Cretaceous';
• 'https://en.wikipedia.org/wiki/Neogene';
• 'https://en.wikipedia.org/wiki/Nile_crocodile';
• 'https://en.wikipedia.org/wiki/Saltwater_crocodile'.
Совсем недурно для пары часов работы, как по мне. Если вам захочется поэкспериментировать с чем-то кроме крокодилов, вы знаете, что делать.

Шаг 4. Саммари

В конце ChatGPT продемонстрировал свои способности к описанию проделанной работы.

<i>(Отрывок из описания)</i>
(Отрывок из описания)

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

Заключение

Современные проблемы требуют современных решений. ChatGPT – это только один из инструментов, который может программистам (и не только) работать быстрее; описание всех доступных инструментов потребовало бы написать целую книгу. Опережая вопрос «А что вы будете делать, когда ИИ заберет у вас вашу работу?» – писать блог, конечно же!
Поделитесь в комментариях своим опытом использования ChatGPT для рабочих задач. Есть ли у вас особенно удачные промпты или наблюдения относительно того, как их лучше всего писать? (Кстати, про рекомендации относительно того, как писать хороший промпт, я тоже пишу пост, и если кто поделится своим опытом, мне это поможет).

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

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

1

Если не пропихнут в существуюшую систему - будет создана новая, на ИИ, более конкурентная, и там будет еще меньше юристов, чем если бы интегрировали в существующую)

Я раньше к программисту обращался знакомому по мелким вопросам, теперь мне GPT пишет и исправляет как js так и php. А ещё он в Access на VBA пишет...))
Я малость в акуе даже!

1

Только я не понимаю, при чём тут ЧатГПТ. Тестирую бота бесплатного к VSC - отлично пока. То же, что пишут общие LLM типа ЧатГПТ и Claude - это треш и угар.
Да и в принципе надо понимать, в чём разница между реальным проектом и куском скрипта. Посмотрел бы я на реальное приложение, для создания которого хватит контекстного окна любой нынешней модели, доступной в паблике.
Фантазии это всё.

А кому будет писать QA во время проверки такого продукта? )
Сколько времени потратим, чтоб получить следующий результат лучше предыдущего и опять проверить?