В последние месяцы я видел много противоречивых постов в своей ленте, в которых говорилось о ChatGPT и о том, как он может заменить разработчиков (я не могу сосчитать, сколько коротких роликов на Youtube я видел на ChatGPT, пишущих идеальный код!)

Дело в том, что алгоритмы Youtube искажают правду. Люди хотят увидеть невозможное. Они хотят развлечений. Большинству людей не интересно простое видео об ограничениях ChatGPT…

Что ж, пора конкретно попробовать! (конечно, все пошло не так, как ожидалось)

В этой статье вы узнаете:

  • Конкретный пример и отзыв о навыках развития ChatGPT
  • Демистификация о плюсах и минусах ChatGPT
  • Мое 2-центовое мнение, сможет ли ИИ заменить разработчиков в будущем

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

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

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

Однако это был не лучший способ сделать это, и он лишь частично решил решение.

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

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

Это одна из причин, по которой ChatGPT пока не может заменить разработчиков: это одностороннее взаимодействие.

Может быть, вы знаете поговорку: Мудрый человек не дает правильных ответов, он ставит правильные вопросы.

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

С другой стороны, ChatGPT по своей природе хорош в написании кода. Это связано с тем, что кодирование детерминировано и следует логической структуре, а не естественному языку.

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

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

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

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

Наконец, ChatGPT предназначался не для замены разработчиков, а для поисковых систем (путем сканирования, агрегирования и обобщения информации), поэтому Microsoft включила его в Bing.

Наконец: может быть, нам стоит снизить наши ожидания?

Вот два высказывания, подтверждающие мою точку зрения:

Вторая — менее известная цитата, но она говорит о многом в мире науки о данных: мусор на входе, мусор на выходе.

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

Когда мы читаем информацию в Интернете, мы знаем, что ее написал человек. Все люди совершают ошибки. Но поскольку ChatGPT — это ИИ, он должен быть идеальным и никогда не ошибаться… верно? :)

Теперь, что касается технической части, вот код, который я попросил написать в ChatGPT:

Я попросил ChatGPT: «создать sql-процедуру для сервера ms sql, чтобы перестроить все фрагментированные индексы в базе данных»

Вот ответ:

CREATE PROCEDURE RebuildAllFragmentedIndexes
AS
BEGIN
  SET NOCOUNT ON;
  SET DEADLOCK_PRIORITY LOW;
  DECLARE @IndexName VARCHAR(255),
          @TableName VARCHAR(255),
          @SQL NVARCHAR(500);
  DECLARE FragmentedIndexCursor CURSOR FOR
  SELECT 'ALTER INDEX ' + QUOTENAME(ix.name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(ix.object_id)) + '.' + QUOTENAME(OBJECT_NAME(ix.object_id)) + ' REBUILD'
  FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS ips
  JOIN sys.indexes AS ix
  ON ips.object_id = ix.object_id
  AND ips.index_id = ix.index_id
  WHERE ips.avg_fragmentation_in_percent >= 5.0
  AND ix.is_disabled = 0
  AND ix.is_hypothetical = 0;
  OPEN FragmentedIndexCursor;
  FETCH NEXT FROM FragmentedIndexCursor INTO @SQL;
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC (@SQL);
    FETCH NEXT FROM FragmentedIndexCursor INTO @SQL;
  END
  CLOSE FragmentedIndexCursor;
  DEALLOCATE FragmentedIndexCursor;
END;

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

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

А вот и обновленная версия:

CREATE PROCEDURE RebuildAllFragmentedIndexes (@FragmentationPercentage FLOAT, @TimeoutMinutes INT, @DatabaseName VARCHAR(255), @MinIndexSize INT)
AS
BEGIN
  SET NOCOUNT ON;
  SET DEADLOCK_PRIORITY LOW;
  SET LOCK_TIMEOUT @TimeoutMinutes * 60;
  DECLARE @IndexName VARCHAR(255),
          @TableName VARCHAR(255),
          @SQL NVARCHAR(500);
  DECLARE FragmentedIndexCursor CURSOR FOR
  SELECT 'ALTER INDEX ' + QUOTENAME(ix.name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(ix.object_id)) + '.' + QUOTENAME(OBJECT_NAME(ix.object_id)) + ' REBUILD'
  FROM sys.dm_db_index_physical_stats (@DatabaseName, NULL, NULL, NULL, NULL) AS ips
  JOIN sys.indexes AS ix
  ON ips.object_id = ix.object_id
  AND ips.index_id = ix.index_id
  WHERE ips.avg_fragmentation_in_percent >= @FragmentationPercentage
  AND ix.is_disabled = 0
  AND ix.is_hypothetical = 0
  AND ix.page_count * 8 >= @MinIndexSize
  ORDER BY ips.avg_fragmentation_in_percent DESC;
  OPEN FragmentedIndexCursor;
  FETCH NEXT FROM FragmentedIndexCursor INTO @SQL;
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC (@SQL);
    FETCH NEXT FROM FragmentedIndexCursor INTO @SQL;
  END
  CLOSE FragmentedIndexCursor;
  DEALLOCATE FragmentedIndexCursor;
END;

Этот код больше не компилируется. Я отладил ошибки:

  1. LOCK_TIMEOUT не работает с переменной. Это также плохой выбор, потому что он убивает процесс вместо того, чтобы позволить ему завершиться. Я непреднамеренно ввел ChatGPT в заблуждение, сказав в своем вопросе «тайм-аут» вместо «лимит времени», поскольку он исправляет свою ошибку, когда я задаю тот же вопрос с ограничением времени. Это поднимает вопрос о хорошем выборе слов для ваших входных требований (я все еще новичок!), потому что ChatGPT напишет именно то, что вы просили, и ни на йоту не усомнитесь в этом.
  2. Столбец page_count не существует в sys.indexes
  3. @DatabaseName нельзя передавать в качестве параметра dm_db_index_physical_stats.

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

Я несколько раз пытался задать вопросы немного по-другому, и ближе всего я пришел к тому, что ChatGPT написал динамический SQL для решения проблемы и добавил имя базы данных в вызовы DMV. Это все еще не было идеальным, потому что DMV базы данных иногда пусты, если вы не находитесь внутри базы данных.

Заключение :

  1. Мудрый человек не дает правильных ответов, он ставит правильные вопросы.
    На данный момент ChatGPT ограничивается односторонним взаимодействием, и возникла задача оперативного проектирования, чтобы решить Эта проблема. Возможно, вам больше не нужен разработчик для написания кода, но вам по-прежнему нужен эксперт, чтобы задать правильный вопрос.
  2. Если это есть в Интернете, это должно быть правдой.
    ChatGPT и вообще любая модель LLM ограничены исходными данными, на которых она была обучена. А фальшивые новости или неверная информация существовали всегда.
  3. Не изобретайте велосипед.
    ChatGPT предназначен для обобщения информации из Интернета. Это очень мощный инструмент для сбора информации, особенно по общим, общим задачам и потребностям. Однако чем более инновационной или конкретной является ваша потребность, тем менее точной она будет.