Создание строк документации Python с использованием искусственного интеллекта

GPT-3, новейшая языковая модель, разработанная OpenAI, способна генерировать человекоподобный текст, что делает его мощным инструментом для различных задач обработки естественного языка.

Модель также была обучена языкам программирования. Одним из вариантов использования этого является создание строк документации для функций Python.

Что такое строки документации?

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

# A docstring example
def square(n):
    """Takes in a number n and returns the square of n"""
    return n**2

GPT-3 можно использовать для создания строк документации, предоставив исходный код функции Python внутри полезной подсказки.

Пример: вычисление среднего значения списка чисел

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

Вот что может быть подсказкой:

# Python 3.7

def mean_of_arr(arr):
    return sum(arr)/len(arr)

# An elaborate, high quality docstring for the above function:
"""

Создание правильной подсказки очень важно.

Обратите внимание, как мы помогаем GPT-3:

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

GPT-3 сгенерировал следующий ответ

    This function takes an array of numbers and returns the mean of the array.
    The mean is the sum of the numbers divided by the length of the array.

GPT-3 даже умеет делать отступ блока текста.

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

Автоматизация создания строки документации с помощью генератора строки документации

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

Мы уже наблюдаем появление инструментов искусственного интеллекта, которые встраиваются непосредственно в наши среды разработки, как, например, GitHub Copilot или Amazon CodeWhisperer.

Программист будущего будет гибридом человека и ИИ. Давайте сами поиграем с этой возможностью.

Предположим, вы работаете в блокноте Jupyter, например, в Colab, и хотите быстро сгенерировать строку документации для новой функции.

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

import openai # Install via "pip install openai"
import inspect

openai.api_key = "YOUR_OPENAI_API_KEY_GOES_HERE"

def generate_docstring(my_func, python_version=3.7):
    # Grab the source code from the function as a string
    source_code = inspect.getsource(my_func)
    
    # Remove any existing docstring
    if my_func.__doc__ is not None:
        source_code = source_code.replace(my_func.__doc__,"")\
                                 .replace("\"\"\"","")

    # Wrap the source code with hints for GPT-3
    prompt = f"# Python {python_version}\n\n" \
           + source_code \
           + "\n# An elaborate, high quality docstring for the above function:\n\"\"\""

    # Send prompt to GPT-3
    response = openai.Completion.create(
                   model="code-davinci-002",
                   prompt=prompt,
                   temperature=0,
                   max_tokens=150,
                   top_p=1.0,
                   frequency_penalty=0.0,
                   presence_penalty=0.0,
                   stop=["#", "\"\"\""]
               )
    
    # Return the generated docstring
    docstring = response["choices"][0]["text"]
    return docstring

Функция getsource библиотеки inspect извлекает исходный код из любой функции, которую вы ему передаете, и возвращает его в виде строки.

Если у функции уже есть строка документации, я не хочу искажать GPT-3, поэтому я включил некоторый код, чтобы удалить все существующие строки документации.

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

Эксперименты

Теперь самое интересное. Давайте посмотрим, как это происходит на нескольких примерах.

Сортировка выбором

Это алгоритм сортировки с временной сложностью O(n²), что означает, что он неэффективен для больших списков, но его преимущество заключается в простоте.

def sort(arr):
    for i in range(len(arr)):
        min_idx = i
        for j in range(i+1, len(arr)):
            if arr[min_idx] > arr[j]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

Я специально решил не называть функцию чем-то вроде selection_sort, потому что не хотел, чтобы GPT-3 просто извлекала строку документации из примера сортировки выбором, который он видел в своем обучающем корпусе.

Интересно, что GPT-3 сделал вывод, что здесь использовался алгоритм сортировки выбором. Вероятно, где-то в его корпусе именно так и был написан алгоритм сортировки выбором. Вот что вернул GPT-3:

    This function sorts an array of integers in ascending order.
    It uses the selection sort algorithm.

    Parameters
    ----------
    arr : list
        The array to be sorted.

    Returns
    -------
    list
        The sorted array.

Это в основном адекватная строка документации.

Разделение данных на обучающие и тестовые наборы

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

Предположим, у вас есть функция для этого и записи результатов в два файла:

import pandas as pd
from sklearn.model_selection import train_test_split

def randomly_split_dataset(folder, filename, split_ratio=[0.8, 0.2]):
    df = pd.read_json(folder + filename, lines=True)
    train_name, test_name = "train.jsonl", "test.jsonl"
    df_train, df_test = train_test_split(df, test_size=split_ratio[1], 
                                         random_state=42)
    df_train.to_json(folder + train_name, orient='records', lines=True)
    df_test.to_json(folder + test_name, orient='records', lines=True)
    return

Передача только функции randomly_split_dataset нашему генератору строк документации через

my_docstring = generate_docstring(randomly_split_dataset)

print(my_docstring)

GPT-3 возвращает:

    This function takes in a folder and filename, and splits the dataset into
    two files, train.jsonl and test.jsonl, with the split ratio specified by
    the user.
    
    Parameters
    ----------
    folder : str
        The folder where the dataset is located.
    filename : str
        The name of the dataset file.
    split_ratio : list
        The ratio of the split, with the first element being the training set
        and the second element being the test set.
    
    Returns
    -------
    None
    
    Examples
    --------
    >>> randomly_split_dataset("data/", "train

Неплохо. Во время примера он резко останавливается, но я обнаружил, что это можно улучшить, увеличив количество max_tokens.

Теперь последний тест: само документирование.

Напишите строку документации для генератора строки документации

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

my_docstring = generate_docstring(generate_docstring)

print(my_docstring)

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

    This function takes a function as input and returns a docstring for that function.
    It uses the OpenAI API to generate the docstring.
    
    Parameters
    ----------
    my_func : function
        The function for which you want a docstring.
    python_version : float
        The version of Python you are using.
    
    Returns
    -------
    docstring : str
        The generated docstring.

Заключение

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

Важно отметить, что GPT-3 на самом деле не понимает код. Он не может рассуждать о вашем коде. GPT-3 был обучен на миллиардах строк кода, включая множество высококачественных строк документации. Нейронная сеть с ее 175 миллиардами параметров очень хорошо предсказывает, какая последовательность токенов (слов и т. д.) с наибольшей вероятностью будет следовать заданной подсказке.

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

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

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