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

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

Как Чип Хьюен заявила в своем блоге, с помощью LLM относительно легко добиться чего-то впечатляющего, но довольно сложно создать что-то готовое к производству, учитывая ограничения и потенциальные проблемы, с которыми в настоящее время сталкиваются LLM. иметь". Однако, несмотря на то, что исследовательское и инженерное сообщество активно работает над решением этих проблем, стоит признать тот факт, что отдельные лица уже могут извлечь большую пользу из LLM, по крайней мере, используя их в качестве личных помощников для повседневных некритических задач. задания или в качестве соавторов для мозгового штурма.

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

Эта статья в первую очередь ориентирована на новичков, поэтому я постарался привести наглядные примеры и пояснения. Я надеюсь, что эти методы помогут вам более эффективно понимать код и устранять неполадки.

Общая структура отладки кода

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

Чтобы найти ошибку в вашем коде, вам нужно всего два основных шага (на самом деле их три):

  1. Изолируйте ошибку и продемонстрируйте ее с минимальным объемом кода;
  2. Сделайте предположение о своей ошибке и проверьте ее;
  3. Повторяйте дополнительные предположения, пока не найдете решение.

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

Кстати, в этом посте я использую ванильную версию ChatGPT (GPT-3.5), но для задач кодирования GPT-4 обычно более эффективен.

Шаг 1. Изолируйте и воспроизведите проблему с минимальным объемом кода

Первый шаг — воспроизвести проблему. Как мы знаем, большинство проблем все еще можно решить с помощью классического «выключить и снова включить». Возможно, вы запутались в порядке выполнения кода в Jupyter Notebook.

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

Давайте рассмотрим пример TypeError: ‘int' object is not iterable, который возникает, когда вы пытаетесь перебрать some_integer вместо использования конструкции range(some_integer).

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

Лучший пример: избавиться от класса, переместив функциональность функции do_some_work() (которая вызывает ошибку) непосредственно в функцию, которую мы вызываем.

Помимо того факта, что мы по-прежнему ужасно работаем с соглашениями об именах переменных (помните, что имена переменных должны быть описательными и осмысленными!), этот код еще легче отлаживать и понимать.

Еще лучший пример: мы можем избавиться и от some_function().

В целом мы сократили код более чем вдвое. Сравните, насколько проще в нем найти ошибку.

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

Во-первых, мы не можем быть уверены, что фрейм данных содержит данные, представленные в комментариях. Действительно, нам нужно от него всего два столбца, и если мы создадим подобную мини-версию, будет намного проще понять, что мы просто неправильно написали столбец зарплаты (Salary vs salary).

Кстати, ChatGPT неплохо генерирует фиктивные данные, так что и здесь он может быть полезен!

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

Благодаря так называемой отладке резиновой уточки этот шаг часто помогает понять причину проблемы самостоятельно, без обращения к сторонней помощи. Например, если ваш мини-код не генерирует ту же ошибку, вы уже на полпути к поиску решения. Однако, даже если это произойдет, это все равно положительный результат. :)

Шаг 2. Сделайте предположение, проверьте его и повторите

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

Найдите точную линию

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

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

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

Если ошибка вызвана сложным выражением, таким как df.groupby(‘Occupation’)[‘Address’].apply(lambda x: ‘, ‘.join(x)), вы можете сначала разбить его на части и изучить вывод шаг за шагом, например. сначала запустите df.groupby(‘Occupation’), затем df.groupby(‘Occupation’)[‘Address’] и так далее.

Подумайте об общих причинах

После этого рассмотрим некоторые распространенные причины ошибки:

  • Может ли быть так, что нужная библиотека не установлена или установлена ​​не той версии?
  • Может быть, где-то есть простая опечатка или синтаксическая ошибка?
  • Возможно, ошибка связана с типами данных, например. Вы суммируете строку и число?
  • И так далее.

Спросите ChatGPT

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

Ситуации могут сильно различаться, поэтому давайте перейдем к некоторым примерам. Во-первых, давайте взглянем на панд KeyError, с которыми мы столкнулись ранее.

Пример подсказки:

This Python code results in <error> in <this line>.

```
Insert your code here
```

Tell me how to debug the code to solve the given error.

Пример:

This Python code results in KeyError: 'Column not found: salary' 
in the last line.

```
import pandas as pd

df = pd.DataFrame({
    'Occupation': ['Engineer', 'Doctor', 'Engineer'],
    'Salary': [56056, 61304, 86850],
})

average_salary_per_occupation = df.groupby('Occupation')['salary'].mean()
```

Tell me how to debug the code to solve the given error.

Выглядит неплохо! Давайте рассмотрим более сложный пример с логической ошибкой.

Пример подсказки:

This Python code <does this, but I want it to do this>.

```
Insert your code here
```

Tell me how to fix the code to solve the problem.

Пример:

This Python code trains a random forest classifier on the Iris dataset.
As far as I know, the dataset is relatively simple and I expect 
the classifier to make the perfect predictions,
however, I am getting about 95% accuracy even with 100 trees in the forest.
Are these results reasonable for this situation?

```
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split, GridSearchCV

# load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# split the data
X_test, X_train, y_test, y_train = train_test_split(
    X, y, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.2, random_state=42)

param_grid = {
    'n_estimators': [3, 7, 15, 25, 50, 100]
}

# create a random forest classifier and 
# use grid search to find the best number of trees
rf_classifier = RandomForestClassifier()
grid_search = GridSearchCV(estimator=rf_classifier, 
                           param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)

# get the best estimator from grid search and test it
best_rf = grid_search.best_estimator_
y_pred = best_rf.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
print("Test accuracy:", test_accuracy)

# get the best number of trees from the grid search
best_n_estimators = grid_search.best_params_['n_estimators']
print("Best number of trees:", best_n_estimators)
```

Tell me how to fix the code to solve the problem if there is a problem.

Модель смогла найти скрытую проблему и исправить ее. Большой!

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

Более того, поскольку ChatGPT может понимать код, он также может его и писать.

Используйте ChatGPT для написания и объяснения кода

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

И я думаю, что по разным причинам важно не забывать, как пользоваться Google. В конце концов, с Google вы, вероятно, можете делать все то же, что и с ChatGPT (в настройках кодирования), просто это может быть медленнее. Хотя, когда речь идет о конкретных задачах, таких как создание диагональной матрицы с помощью numpy, я бы, скорее всего, сделал это быстрее с помощью Google.

Я думаю, что подходящей аналогией является процесс изучения иностранного языка (хотя можно сказать, что вы делаете именно это, изучая язык программирования :). Использование Google означает перевод отдельных слов с помощью словаря, а использование ChatGPT похоже на перевод целых предложений и абзацев текста с помощью онлайн-переводчиков. Хотя ChatGPT может быть невероятно мощным, вы можете столкнуться с трудностями при выявлении скрытых ошибок или понимании определенных блоков кода, особенно если вы новичок.

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

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

Писать

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

Пример подсказки:

Act like a junior Python developer.
Write code with comments explaining what is going on.
When providing the solution, ensure the output is well-formatted
and the code is well-documented.
Include example usage and explanations.

<Describe your problem here>

Пример:

Act like a junior Python developer.
Write code with comments explaining what is going on.
When providing the solution, ensure the output is well-formatted
and the code is well-documented.
Include example usage and explanations.

Write a program to find common values between two numpy arrays.
It is a function that takes two numpy arrays as inputs and
output a numpy array.

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

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

В общем, помните, что LLM не имеют предварительных знаний о вас или конкретной проблеме, с которой вы столкнулись, поэтому чем больше информации вы предоставите, тем лучший результат вы получите:

  • Опишите свою задачу;
  • Определить структуру кода: например. это полный сценарий, класс или функция;
  • Укажите входы и выходы: например. функция принимает два целочисленных аргумента и возвращает число с плавающей запятой;
  • Упомяните инструменты/библиотеки, которые вы хотите использовать, например numpy или pandas, а также язык программирования;
  • Если возможно, добавьте свои предложения о том, как может выглядеть решение: например. Предлагаю использовать функцию pandas.DataFrame.groupby для расчета средней зарплаты по должности.

Оптимизировать

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

Кстати, вы можете использовать тот же трюк с подсказками ролей и для отладки.

Пример подсказки:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. Use Python best practices and write docstrings.

Rewrite the above Python code and optimize it.

```
Insert your code here
```

Пример:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. Use Python best practices and write docstrings.

Rewrite the above Python code and optimize it.

```
def unique_list(l):
    # Get a list of distinct elements from the given list

    x = []
    for a in l:
        if a not in x:
            x.append(a)
    return x
```

Здесь, чтобы извлечь уникальные элементы из списка, ChatGPT предлагает использовать тип данных set (который по определению не допускает дублирования значений) вместо цикла for. Хороший выбор, так как это в основном однострочное решение.

Объяснять

Мы можем использовать ту же нотацию, запрашивая комментарии и пояснения к коду. Часто это приводит к избыточным комментариям, например import numpy as np # importing numpy library. Тем не менее, это все еще может быть полезно в начале вашего путешествия и помочь модели выразить свои внутренние мысли, как обсуждалось в разделе Рассуждения по цепочке мыслей в моей предыдущей статье.

Пример подсказки:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. 

Explain and comment the following code.

```
Insert your code here
```

Пример:

Act like an experienced Python developer mentoring a junior developer.
Provide explanations and comments about the concepts that can be
hard for beginners. 

Explain and comment the following code.

```
def func(n):
    trow = [1]
    y = [0]
    for x in range(max(n, 0)):
        print(trow)
        trow = [l + r for l, r in zip(trow + y, y + trow)]
    return n >= 1

func(6)
```

Здесь модель смогла определить задачу, стоящую за этим кодом: сгенерировать строки треугольника Паскаля. Хорошая работа!

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

Несколько заметок о потенциальных ловушках

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

Как авторегрессивный LLM, ChatGPT не является детерминированным…

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

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

Последовательность ввода: Меня зовут, а ChatGPT завершает ее словами ChatGPT, рад помочь вам!. Это пример из моей предыдущей статьи, где я рассказываю об основах LLM.

… и вот почему ChatGPT может ошибаться

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

Кроме того, важно подчеркнуть, что современные языковые модели, особенно GPT-4, обладают впечатляющими возможностями самоисправления. Если сгенерированный код содержит ошибки, вы можете просто вернуть его и указать, что он работает некорректно. GPT-4 отлично справляется с отладкой собственного кода и предлагает соответствующие предложения. Часто вы сможете получить правильный код после пары итераций.

Самоуверенность

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

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

Заключение

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

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

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

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

Желаем вам удачи на вашем пути обучения!

Ресурсы

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

Вот другие мои статьи о LLM, которые могут быть вам полезны. Я уже рассмотрел:

Вас также может заинтересовать:

  • Бесплатный курс Learn Prompting для более глубокого понимания подсказок и различных техник, связанных с ними;
  • Недавно выпущенные короткие курсы от DeepLearning.AI по созданию приложений с OpenAI API.

Спасибо за чтение!

  • Надеюсь, эти материалы были вам полезны. Следуйте за мной на Medium, чтобы получать больше подобных статей.
  • Если у вас есть какие-либо вопросы или комментарии, я буду рад получить любую обратную связь. Спрашивайте меня в комментариях или подключайтесь через LinkedIn или Twitter.
  • Чтобы поддержать меня как автора и получить доступ к тысячам других статей на Medium, оформите членство в Medium, используя мою реферальную ссылку (без дополнительной платы для вас).