Знакомство с суммировщиком GPT — создавайте сводки запросов на вытягивание и описания коммитов.

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

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

Подготовьте и запустите за считанные минуты

Готовы начать использовать GPT-Commit-Summarizer? Добавить действие в ваш репозиторий можно быстро и легко — все, что вам нужно, — это токен OpenAI API, секрет в вашем репозитории и добавление одного файла для определения рабочего процесса.

Следуйте инструкциям в Readme, и вы сможете приступить к работе за считанные минуты. Акция поддерживает все языки программирования и фреймворки — результаты могут отличаться. Посмотрите это здесь.

Результаты на реальных кодовых базах

Все результаты из реальных кодовых баз — личных проектов, ditto.fit и connectedpapers.com.

  • Сводные комментарии PR очень помогают уловить основную идею пулл-реквеста. Они сформулированы как «Резюме PR на данный момент», поскольку они генерируются постепенно, чтобы не загромождать страницу обсуждения двойными комментариями, когда коммит добавляется к запросу на вытягивание.
  • Сводки различий в отдельных файлах, как правило, точны и обеспечивают дополнительную помощь в процессе проверки. Действие GitHub очищает себя, удаляя устаревшие сводные комментарии, чтобы предотвратить спам на странице обзора.
  • Если конкретное изменение файла сбивает вас с толку, вы всегда можете просмотреть сводку коммита, в котором оно произошло, часто находя полезное объяснение.

За кулисами

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

В настоящее время модель text-davinci-003 (та, которая поддерживает ChatGPT), используемая в проекте Summarizer, ограничена 4096 токенами, примерно двумя сотнями строк кода.

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

Чтобы решить эту проблему, GPT-Commit-Summarizer разбивает запрос на вытягивание на более мелкие diff — отдельные diff-файлы и коммиты внутри него. Затем они суммируются по отдельности. Затем все эти сводки объединяются в один запрос для создания сводки всего запроса на вытягивание.

Новый вид программной инженерии

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

На этом сходство с классической программной инженерией не заканчивается — взгляните на начало запроса для суммирования коммитов git:

You are an expert programmer, and you are trying to summarize a git diff.
Reminders about the git diff format:
For every file, there are a few metadata lines, like (for example):
```
diff --git a/lib/index.js b/lib/index.js
index aadf691..bfef603 100644
--- a/lib/index.js
+++ b/lib/index.js
```
This means that `lib/index.js` was modified in this commit. Note that this is only an example.
Then there is a specifier of the lines that were modified.
A line starting with `+` means it was added.
A line that starting with `-` means that line was deleted.
A line that starts with neither `+` nor `-` is code given for context and better understanding.
It is not part of the diff.
[...]
EXAMPLE SUMMARY COMMENTS:
```
* Raised the amount of returned recordings from `10` to `100` [packages/server/recordings_api.ts], [packages/server/constants.ts]
* Fixed a typo in the github action name [.github/workflows/gpt-commit-summarizer.yml]
* Moved the `octokit` initialization to a separate file [src/octokit.ts], [src/index.ts]
* Added an OpenAI API for completions [packages/utils/apis/openai.ts]
* Lowered numeric tolerance for test files
```
Most commits will have less comments than this examples list.
The last comment does not include the file names,
because there were more than two relevant files in the hypothetical commit.
Do not include parts of the example in your summary.
It is given only as an example of appropriate comments.

Это… Не хочется писать по-английски. Мне знакомо это чувство. Это программирование.

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

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

Написание кода с помощью GPT

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

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

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

Наиболее важные советы, которые я усвоил для продуктивной работы с этим инструментом, следующие:

  • Дайте четкие инструкции о том, что вы хотите, чтобы он сделал.
  • Если ваш код не собирается или содержит какие-либо ошибки — сообщите об этом и вставьте сообщение об ошибке, попросив модель переписать его. Я обнаружил, что обычно он может исправлять ошибки и простые ошибки.
  • Всякий раз, когда вам нужно получить доступ к API или использовать библиотеку — спросите модель «Как я могу сделать X в библиотеке Y?» и это часто даст ответ.
  • Использование типизированного языка (я использовал TypeScript) оказалось невероятно полезным инструментом для этого процесса. Модель часто не может создать правильные сигнатуры типов. Иногда это была незначительная синтаксическая ошибка, но часто она также выявляла реальные проблемы, которые модель затем исправляла, когда отображалась ошибка типа.
  • Вы должны уже знать, как программировать, чтобы использовать этот инструмент. Иногда он допускает глупые ошибки, и вам нужно дать рекомендации, когда дело доходит до рефакторинга кода или внесения изменений.
  • Используйте детскую площадку, а не ChatGPT. Это обеспечивает следующий очень эффективный рабочий процесс: всякий раз, когда вы не удовлетворены результатом, определите первую точку, где модель отклонилась от вашего видения, напишите одно или два слова (или около строки кода), удалите остальные — и дайте модель продолжается оттуда (Как видно из скриншотов, это осознание пришло ко мне поздно в процессе… И я должен признать, что ChatGPT более фотогеничен).
  • Создание небольших коммитов и использование git оказалось чрезвычайно ценной практикой. Время от времени модель допускает ошибки при рефакторинге кода — часто делайте коммиты, и если она делает что-то не так, сбрасывайте до самого последнего работающего коммита.

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

Известные ограничения

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

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

Спасибо Soof Golan за вклад в кодовую базу и за написание add-gpt-summarizer.

Автор, Итай Кнаан-Харпаз, в настоящее время является техническим директором ditto.fit и соучредителем connectedpapers.com.