В последнее время я много занимаюсь вопросами внедрения ИИ-ассистентов для написания кода на основе в процессы разработки ПО. По разным данным, code assistant'ы позволяют ускорить процесс написания кода до 25% (источник), а это очень существенно. И в этой статье я хотел бы развеять мифы о том, что кодинг-ассистент и их внедрение это что-то далекое от реальности. Более того, это не всегда привязка к определенному вендору LLM или определенной среде разработки (IDE), а также я развею миф о том, что внедрение такого ассистента это очень дорого и для этого нужно очень много ресурсов. Ну что ж, поехали.

Что такое Code Assistant и как с ними работать?

Кодинг-ассистенты — это такие приложения на основе больших языковых моделей (англ. large language models, LLMs), которые направлены на написание кода, а также на его понимание, оценку и объяснение. За плечами кодинг-ассистентов зачастую скрываются специализированные языковые модели, которые были дотренированы (англ. fine-tuned) на большом числе примеров кода. Самыми известными кодинг-ассистентами в данный момент являются GitHub Copilot (платно и под санкциями) и Cursor (требуются ключи для OpenAI/Anthropic, и т.д.) — как полностью интегрированная с кодинг-ассистентом среда разработки, а также из российских аналогов можно выделить GigaCode (привязка к IDE) и Yandex Code Assistant (только VS Code и нужно пользоваться облаком).

Важно отметить, что компании, которые серьёзно относятся к защите своего исходного кода обычно заключают enterprise соглашения с поставщиками таких ассистентов. Если в вашей компании ещё нет стратегии по внедрению ИИ в разработку — самое время ей заняться, иначе, разработчики просто начнут пользоваться сторонними продуктами и отсылать весь ваш код прямиком в OpenAI, Сбер или Яндекс :)

Как работают ассистенты по написанию кода? Рассмотрим ниже.

Режим чата

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

image.png
Режим чата в Github Copilot

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

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

Inline-режим

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

image.png
Inline режим на примере Github Copilot

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

AutoComplete режим

Режим автодополнения наиболее известен и именно с него началось внедрение кодинг ассистентов (2021-2022 годы). Автокомплит срабатывает в тот момент, когда выполняются определенные внутренние правила. Например, в тот момент, когда наш ассистент уже успел сгенерировать подсказки, а вы еще не успели написать следующую букву. В этот момент появляется так называемый ghost text, т.е. текст кода, написанный прозрачным серым шрифтом, намекающий нам на то, что это всего лишь подсказка и мы можем ее либо одобрить, либо нет.

image.png
Режим автодополнения на примере Github Copilot

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

А теперь давайте разберем, как внедрить такого ассистента в процесс разработки внутри вашей компании совершенно бесплатно, используя только open-source инструменты.

Внедряем свой Code Assistant

Для того, чтобы внедрить свой ассистент по написанию кода, нам понадобятся две вещи:

  • Плагин для среды разработки (IDE)

  • Доступ к большой языковой модели (LLM).

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

Данный гайд я основан на использовании плагина Continue, который, также имеет открытый исходный код. В Continue имеется возможность полного отключения телеметрии, таким образом мы не будем передавать данные о нашем коде сторонним вендорам. Ещё одним плюсом этого плагина является то, что он доступен как в Visual Studio Code, так и в продуктах JetBrains. Таким образом мы охватываем огромный спектр языков программирования. Следующее, что нам понадобится, это доступ к LLM.

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

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

Примерная схема архитектуры нашего ассистента
Примерная схема архитектуры нашего ассистента

Вариант 1: деплоим LLM на GPU сервере c помощью vLLM

Для данного варианта вам понадобится сервер с графической картой. Если в вашей компании есть такой, то можете смело начинать следовать данной инструкции. Если сервера в распоряжении нет, то можно воспользоваться Runpod, Vast AI или Reg.Ru.

На сервере нам необходимо установить библиотеку vLLM. Устанавливается она с помощью пакетного менеджера Python под названием pip. После чего нам необходимо будет написать простую строчку в терминале, которая запускает языковую модель. Выбор LLM довольно обширен, можно использовать практически любую модель, опубликованную на huggingface. Вот пример запуска:

# устанавливаем vllm и hf hub (чтобы подтягивать модельки)
pip install vllm huggingface_hub[cli]

# запускаем Qwen2.5-Coder 14B на определенном порту
vllm serve Qwen/Qwen2.5-Coder-14B-Instruct --port 8081

В зависимости от того, насколько мощны ваши ресурсы, а именно видеопамять, вы можете загружать модели различного размера. Исходя из своего опыта, могу сказать, что модели размером 14 миллиардов параметров (14B) и выше работают уже вполне прилично, и их можно использовать в продакшене. Для использования такой модели без квантизации достаточно порядка 30гб видеопамяти, с квантизацией — в несколько раз меньше.

По поводу качества работы моделей более малого размера (8B, 3B, 0.5B) наверняка сказать не могу, однако они тоже могут дать прирост в производительности написания кода.

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

image.png
Open API (не путать с OpenAI) интерфейс vLLM

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

Вариант 2: деплоим LLM локально c помощью OLLAMA

Для этого способа развертывания языковых моделей вам просто понадобится мощный компьютер. Не обязательно иметь графическую карту, однако, это будет предпочтительнее. Чтобы установить Ollama, необходимо просто запустить одну команду, если вы на Linux:

curl -fsSL <https://ollama.com/install.sh> | sh

Если вы на Mac или Windows, посетите страницу с инструкцией по установке, там тоже все очень просто.

Запуск Ollama производится также одной строчкой кода в терминале. Я могу выбрать одну из доступных моделей, которую можно найти на сайте Ollama и просто развернуть её на своем компьютере. В этот же момент я сразу могу начать использовать эту языковую модель…

# команда для запуска Ollam'ы
ollama run qwen2.5-coder:0.5b
>>> Send a message (/? for help)

…но это уже совсем другая история. Мы сейчас фокусируемся на том, как настроить ассистент для написания кода.

Установка плагина Continue в VS Code

Для того, чтобы настроить расширение в Visual Studio Code, нам необходимо зайти на вкладку с расширениями и найти там Continue, о котором я говорил выше. Устанавливаем это расширение, все как обычно.

image.png
Страничка расширения Continue в VS Code

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

Установка плагина Continue в продуктах Jet Brains

Чтобы установить расширение в одном из продуктов Jet Brains (я показываю на примере PyCharm, но в IntelliJ Idea и других аналогично) необходимо зайти в поиск сторонних плагинов и найти там Continue. Устанавливаем плагин следуя стандартным процедурам.

image.png
Страничка плагина Continue в PyCharm

Аналогично VS Code — если вы уже пользуетесь какими-либо Code Assistant, то их рекомендуется на время деактивировать для того, чтобы между ними не возникало коллизий. Установив плагин, вы увидите значок, который появится в среде разработки.

Написание конфигурационного файла для Continue

Для того, чтобы открыть конфигурационный файл (config.json), кликните на шестерёнку на вкладке плагина Continue в среде разработки. Ниже представлю наиболее важные отличия между vLLM и Ollama, ну а полный конфигурационный файл прикрепляю сюда.

Конфигурация для vLLM

"allowAnonymousTelemetry": false, // Не отправлять анонимную статистику
  "models": [
    {
      "title": "⭐ Мой Ассистент",
      "provider": "openai", // Пишем openai потому, что vLLM предоставляет совместимый API
      "model": "Qwen/Qwen2.5-Coder-14B-Instruct",
      "apiBase": "<http://192.168.0.1:8081/v1>" // заменить на свой хост и порт
    }
  ],
  "tabAutocompleteModel": {
    "title": "⭐ Мой Ассистент",
    "provider": "openai",
    "model": "Qwen/Qwen2.5-Coder-14B-Instruct",
    "apiBase": "<http://192.168.0.1:8081/v1>" // заменить на свой хост и порт
  }

Конфигурация для Ollama

"allowAnonymousTelemetry": false, // Не отправлять анонимную статистику
  "models": [
    {
      "title": "⭐ Мой Ассистент",
      "provider": "ollama", // Пишем ollama -- всё логично
      "model": "qwen2.5-coder:0.5b" // Идентификатор модели, которую запустили
    }
  ],
  "tabAutocompleteModel": {
    "title": "⭐ Мой Ассистент",
    "provider": "ollama", // Пишем ollama -- всё логично
    "model": "qwen2.5-coder:0.5b" // Идентификатор модели, которую запустили
  }

Примеры использования

А теперь я покажу, как я пользуюсь ассистентом для написания кода в реальной жизни. В данном случае я буду использовать модель Qwen2.5-Coder-14B, так как ее результаты вполне схожи с коммерческими моделями. Ниже показываю самые базовые варианты, гораздо большего эффекта можно достичь донастраивая плагин на основе вашего имеющегося кода и документации. Об этом буду рассказывать в следующих статьях.

Inline режим

Попросил ассистента заменить print’ы на logging. Не все строчки на месте, но скопировать импорт и конфигурацию логгера вверх не составит труда:

image.png
Inline режим в Continue

Кстати говоря, вся история взаимодействия с плагином сохраняется локально в папке ~/.continue/.

Режим чата

В режиме чата решил уточнить, почему использовать logging лучше, чем print: вот что ответил ассистент:

image.png
Режим чата в Continue

Вроде бы всё по делу. Прошу обратить внимание, что в качестве контекста указал файл, в котором работал (@main.py).

Autocomplete режим

Пример работы режима autocomplete (22-я строчка).

image.png
Режим autocomplete в Continue

Довольно тривиально, но скорость написания кода увеличивает.

Провайдеры контекста и команды

Провайдеры контекста — это интерфейсы вашего ассистента к внешнему миру. Например, можно рассмотреть использование контекста git diff для генерации сообщения для коммита в одном из моих проектов. Провайдер контекста вызывается через "@" (подробнее в config.json), а затем пишется ваш промпт:

Просим ассистента сгенерировать сообщение для коммита (VS Code)
Просим ассистента сгенерировать сообщение для коммита (VS Code)

Исходя из моих изменений, сообщение получилось довольно точное, но, возможно, слегка длинное. Чтобы достичь оптимальной длины и детализированности, необходимо экспериментировать с промптами. Как только вы найдёте золотую середину — можно завернуть ваш промпт в команду, которые также прописываются в config.json. Команды — это просто shortcuts для ваших промптов. Вот пример команды для генерации сообщения для комита:

"slashCommands": [
    {
      "name": "commit",
      "description": "Сгенерируй понятное, но краткое сообщение коммита"
    }
]

А теперь, запустим команду и посмотрим, что получится:

Сгенерированный коммит в PyCharm (провайдер контекста не понадобился)
Сгенерированный коммит в PyCharm (провайдер контекста не понадобился)

О чём ещё нужно сказать

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

  • Сбор и анализ метаданных — интеракций разработчика и ассистента

  • Донастройка системных промптов

  • Изменение правил для режима autocomplete

  • Создание своего провайдера контекста (Context Provider) для режима чата

  • Дообучение модели или обучение предпочтениям

Надеюсь, данная статья была полезна. Если у вас остались вопросы как по самой статье, так и по более продвинутым сценариям использования кодинг-ассистентов — смело пишите мне!

PS. Найти меня можно тут.

Комментарии (5)


  1. cupraer
    23.01.2025 10:20

    code assistant'ы позволяют ускорить процесс написания кода до 25%

    1. Citation needed.

    2. Это средняя температура по больнице? Потому что человеку, впервые увидевшему компьютер вчера — оно ускорит написание кода на ∞%, а профессионалу — замедлит втрое.


    1. perevalov_a Автор
      23.01.2025 10:20

      1. Источник добавил, слова не мои, а Андрея Белевцева, старшего VP Сбера. Сам был на конференции и слышал. Можете порыться в Google Scholar если интересно, есть куча научных работ.

      2. Я, конечно, встречал людей, которые всё ещё предпочитают писать код в vim'e или nano, но их меньшинство. ИИ помощники станут обыденным инструментом через несколько лет (как IntelliSense, например). И да, они не заменяют, а помогают работать быстрее, кому то на 5%, а кому-то на 25%.


      1. cupraer
        23.01.2025 10:20

        Я 90% времени думаю, а не пишу код. Для джейсоноукладки — да, ИИ, наверное, ускоряет процесс. Для любых более-менее серьёзных задач — нет. Потому что архитектуру для решения новой задачи это автодополнение на стероидах не предложит никогда.

        Да, я пишу код в виме, и любую более-менее нетривиальную задачу я решу быстрее 100% людей, пользующихся помощниками.


        1. perevalov_a Автор
          23.01.2025 10:20

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

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


          1. cupraer
            23.01.2025 10:20

            передача ИИ помощнику задач вроде написания docstring

            Вот уж нет. В docstring должно быть написано главное, а не всё подряд.

            или генерации boilerplate кода

            Языки, на которых в 2025 году требуется писать бойлерплейт — вне сферы мщих интересов, пардон.