ВВЕДЕНИЕ 3
1. Обзорный раздел по предметной области 6
1.1 RAG конвейеры на основе LLM для генерации кода 6
1.1.1 Gorilla: Large Language Model Connected with Massive APIs 6
1.1.1 RepoCoder: Repository-Level Code Completion Through Iterative Retrieval and Generation 7
1.1.2 REPOFORMER: Selective Retrieval for Repository-Level Code Completion 9
1.2 Системы для помощи в разработке программного кода 10
1.2.1 GitHub Copilot 10
1.2.2 DevChat 12
1.3 Вывод 13
2. Основная часть. Реализация генерации кода для помощи в программировании на основе Retrieval Augmented Generation 15
2.1 Retrieval Augmented Generation. Обзор метода 15
2.2 Используемые данные и модели для тестирования 20
2.3 Реализация работы с базой данных 21
2.3.1 Сбор и обработка данных 22
2.3.2 Построение векторных представлений текста 28
2.4 Работа с LLM для генерации кода 45
2.4.1 Точная настройка LLM для RAG 45
2.4.2 Оптимизация LLM 51
2.4 Финальные результаты 54
Вывод 57
Список источников 58
На данный момент Большие языковые модели (LLM) это одна из самых активно развивающихся отраслей в области исследования искусственного интеллекта. Популярность LLM неуклонно растет, поскольку они находят все большее применение в различных областях. Использование больших языковых моделей способно упростить и ускорить таких задач как:
1. Генерация текста.
2. Автоматический перевод.
3. Моделирование диалогов.
4. Анализ текста.
5. Генерация кода.
Из всех перечисленных задач с точки зрения изучения наиболее сложной и интересной является последняя, ведь сейчас, когда разработка программного обеспечения набирает все большие и большие обороты, неизбежно встает вопрос автоматизации этого процесса.
Внедрение генеративных LLM в жизненный цикл разработки программного обеспечения имеет свои преимущества, например, позволяет разработчикам работать более эффективно. Так, исследование GitHub[1] показало, что при использовании LLM в разработке программисты могут выполнять задачи более чем на 50% быстрее.
Большие языковые модели (LLM) продемонстрировали свое мастерство в понимании естественного языка и генерации текста. Они также могут генерировать фрагменты кода, функции и даже целые программы на основе текстовых данных. Такая возможность имеет существенное значение для разработки программного обеспечения, поскольку позволяет ускорить выполнение задач написания программ и открыть двери для более быстрого создания инновационных решений.
Хотя код, генерируемый LLM, помогает разработчикам быстро приступить к работе и позволяет компаниям быстрее создавать приложения, это сопряжено со значительными рисками. Иногда LLM могут генерировать неверную, вводящую в заблуждение или даже вымышленную информацию. Рассмотрим некоторые причины возникновения этой проблемы:
Во-первых, LLM обучаются на огромных массивах данных, которые могут быстро устаревать. В результате они могут не иметь доступа к самой актуальной информации или закреплять устаревшие сведения. Важно убедиться, что фрагмент кода, предлагаемый моделью, безопасен и чист в контексте всей кодовой базы.
Во-вторых, Большая языковая модель может генерировать код без глубокого понимания контекста проекта и требований, что приводит к неадекватным или неправильным решениям. Хотя LLM в некоторой степени способны понимать контекст, они могут не в полной мере уловить все нюансы и специфические требования конкретного проекта. Это может привести к тому, что технически код будет работать, но не будет соответствовать уникальным целям проекта или требованиям к пользовательскому опыту.
Традиционный подход к решению этих проблем Fine-Tuning - способ улучшить предварительно обученную модель, которая уже имеет некоторые знания, путем небольших корректировок. Тонкая настройка помогает модели лучше работать над конкретной задачей, не обучая ее с самого начала. Дополнительный цикл обучения обновит веса модели в случае их устаревания, поможет справится с галлюцинациями в узкоспециализированных областях.
Однако, этот подход не лишен недостатков. Ввиду того, что зачастую большие языковые модели имеют огромное число параметров, их дообучение требует большого количества ресурсов и времени, а значит и денег тоже. Кроме того, в задаче по генерации кода зачастую необходимо повторять цикл тонкой настройки несколько раз, так как в этой области часто происходят изменения: появляются новые библиотеки, выходят обновления уже существующих и т.д...
В ходе данной работы была реализована система способная использовать данные из различных источников для решения задачи генерации дополнений кода и задачи генерации кода по текстовому запросу. Были описаны результаты тестирования различных методов и модификация для получения лучшего качества, а также реализованы новые алгоритмы и подходы для построения системы на основе Retrieval Augmented Generation, способные увеличить качество работы системы и ее временную эффективность. Кроме того, была произведена точная настройка модели для ее лучшей работы совместно с RAG, а также проанализированы различные методы квантования модели и была произведена работа по уменьшению размера модели для ее использования на слабой видеокарте или процессоре.
В ходе анализа результатов было выявлено, что реализованная система по качеству превосходит существующие решения и модели большего размера в обеих задачах генерации, которые были заявлены.
Их сказанного выше можно сделать вывод, что при правильной работе с данными и при использовании нескольких источников данных, подход Retrieval Augmented generation способен значительно улучшить работу модели по генерации программного кода, а также позволяет модели учитывать контекст проекта и актуальные данные, необходимы для решения задачи программирования.