Перейти к содержимому

Почему я разработал Code2Prompt

Иллюстрация code2prompt, оптимизирующая контекст кода для агентов ИИ.

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

Трудности планированияВысокие затраты на токеныГаллюцинации
🧠 ➡️ 🤯🔥 ➡️ 💸💬 ➡️ 🌀

Именно поэтому я начал работать над code2prompt, инструментом на основе Rust, который помогает подавать в LLM именно тот контекст, который необходим.

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

Я начал экспериментировать с LLM в OpenAI Playground с text-davinci-003, когда он приобрел популярность в ноябре 2023 года. Языковые модели открыли новую революцию. Это было похоже на наличие блестящего нового помощника, который мог генерировать单元-тесты и комментарии почти по команде. Я наслаждался тестированием моделей на их пределах — проверкой всего, от небольших разговоров и этических дилемм до jailbreaks и сложных задач кодирования. Однако, когда я взялся за более крупные проекты, я быстро осознал, что модели имеют явные ограничения. Сначала я мог поместить в окно контекста только несколько сотен строк кода, и даже тогда модели часто с трудом понимали назначение или структуру кода. Именно поэтому я быстро осознал, что важность контекста имеет первостепенное значение. Чем более краткими были мои инструкции и лучше контекст, тем лучше результаты.

OpenAI Playground

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

Я начал писать модуль поиска пути ROS для роботизированного соревнования, генерировать функции для кроссплатформенного приложения Flutter с чистой архитектурой и создал небольшое веб-приложение для отслеживания расходов в Next.js. Тот факт, что я создал это небольшое приложение за один вечер, в фреймворке, с которым я никогда не работал раньше, был поворотным моментом для меня; LLM были не просто инструментами, но и умножителями. Я разработал bboxconverter, пакет для преобразования ограничивающих рамок, и список продолжается. LLM могут помочь вам быстро изучить новые технологии и фреймворки; это потрясающе.

Я глубже погрузился в LLM и начал создавать агентов и скелеты вокруг них. Я повторил известную статью RestGPT. Идея отличная: дать LLM возможность вызывать некоторые REST API с помощью спецификации OpenAPI, такие как Spotify или TMDB. Эти возможности вводят новый парадигму программирования программного обеспечения, который я называю Software 3.0.

Software 1.0Software 2.0Software 3.0
На основе правилНа основе данныхАгентный

Та же идея привела к протоколу MCP, который позволяет LLM вызывать инструменты и ресурсы напрямую бесшовным образом, потому что по дизайну инструмент нуждается в описании, чтобы быть вызванным LLM, в отличие от REST API, который не обязательно требует спецификации OpenAPI.

При повторении известной статьи RESTGPT я заметил некоторые серьезные ограничения LLM. Авторы статьи столкнулись с теми же проблемами, что и я: LLM галлюцинировали. Они генерируют код, который не реализован, изобретая аргументы и просто следуя инструкциям буквально без использования здравого смысла. Например, в исходном коде RestGPT авторы спросили в подсказке вызывающего.

“не быть слишком умным и не придумывать шаги, которых нет в плане.”

Я нашел это заявление забавным и очень интересным, потому что это был первый раз, когда я встретил кого-то, кто инструктирует LLM не галлюцинировать.

Другим ограничением был размер контекста; LLM хорошо справляются с поиском иголки в стоге сена, но с трудом понимают его. Когда вы даете слишком много контекста языковым моделям, они склонны теряться в деталях и теряют из виду общую картину, что раздражает и требует постоянного управления. Способ, которым я люблю думать об этом, похож на проклятие размерности. Замените слово “размерность” или “функция” на “контекст”, и вы получите идею.

Проклятие размерности

Чем больше контекста вы даете LLM, тем труднее найти правильный ответ. Я придумал nice предложение, чтобы суммировать эту идею:

Предоставьте как можно меньше контекста, но как можно больше, чем необходимо

Это heavily вдохновлено известным цитатой Alain Berset, швейцарского политика 🇨🇭, который сказал во время карантина COVID-19:

“Мы хотим действовать как можно быстрее, но и как можно медленнее, когда это необходимо”

Это представляет идею компромисса и применяется к размеру контекста LLM!

Следовательно, мне нужен был способ быстро загружать, фильтровать и организовывать контекст моего кода, предоставляя как можно меньше контекста с лучшим качеством. Я попробовал вручную копировать файлы или фрагменты в подсказки, но это стало неудобным и подверженным ошибкам. Я знал, что автоматизация tedious процесса создания контекста для запросов лучших подсказок будет полезна. Затем, однажды, я ввел “code2prompt” в Google, надеясь найти инструмент, который напрямую подключает мой код к подсказкам.

И, voilà, я обнаружил проект на основе Rust Mufeed под названием code2prompt, который имеет около 200 звезд на GitHub. Это было еще просто на тот момент: простой инструмент CLI с базовой ограниченной емкостью фильтрации и шаблонами. Я увидел огромный потенциал и сразу же присоединился к нему, реализовав совпадение шаблонов glob, среди других функций, и вскоре стал основным участником.

Сегодня существует несколько способов предоставить контекст LLM. Генерация из более крупного контекста, использование генерации на основе извлечения (RAG), сжатие кода, или даже использование комбинации этих методов. Создание контекста — это горячая тема, которая будет быстро развиваться в ближайшие месяцы. Однако, мой подход — KISS: Keep It Simple, Stupid. Лучший способ предоставить контекст LLM — использовать самый простой и эффективный способ. Вы создаете именно тот контекст, который вам нужен; это детерминировано, в отличие от RAG.

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

  • Core: Ядро code2prompt — это библиотека Rust, которая предоставляет базовую функциональность для создания контекста из вашей кодовой базы. Она включает в себя простой API для загрузки, фильтрации и организации контекста вашего кода.
  • CLI: Интерфейс командной строки — это самый простой способ использования code2prompt. Вы можете создать контекст из вашей кодовой базы и напрямую подключить его к вашим подсказкам.
  • Python API: Python API — это простой wrapper вокруг CLI, который позволяет вам использовать code2prompt в ваших Python-скриптах и агентах. Вы можете создать контекст из вашей кодовой базы и напрямую подключить его к вашим подсказкам.
  • MCP: Сервер code2prompt MCP позволяет LLM использовать code2prompt как инструмент, тем самым делая их способными создавать контекст.

Видение описано дальше на странице видения в документации.

Я считаю, что будущие агенты будут нуждаться в способе потреблять контекст, и code2prompt — это простой и эффективный способ сделать это для текстовых репозиториев, таких как кодовая база, документация или заметки. Типичное место для использования code2prompt будет в кодовой базе с осмысленными соглашениями об именовании. Например, в чистой архитектуре есть четкое разделение проблем и слоев. Соответствующий контекст обычно resides в разных файлах и папках, но имеет одно и то же имя. Это идеальный случай использования code2prompt, где вы можете использовать шаблон glob для захвата соответствующих файлов.

На основе шаблонов glob: Точно выберите или исключите файлы с минимальными усилиями.

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

Состояние контекста: Добавляйте или удаляйте файлы по мере развития вашего разговора с LLM.

Эти возможности делают code2prompt идеальным выбором для рабочих процессов на основе агентов. Сервер MCP позволяет бесшовную интеграцию с популярными фреймворками ИИ-агентов, такими как Aider, Goose, или Cline. Пусть они обрабатывают сложные цели, а code2prompt доставляет идеальный контекст кода.

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

Вкратце:

  • Уменьшите галлюцинации, предоставляя правильное количество контекста
  • Уменьшите стоимость токенов, тщательно создавая необходимый контекст
  • Улучшите производительность LLM, предоставляя правильное количество контекста
  • Интегрируется со стеком агентов как поставщик контекста для текстовых репозиториев

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

Спасибо за чтение, и я надеюсь, что моя история вдохновила вас проверить code2prompt. Это было невероятное путешествие, и оно только начинается!

Olivier D’Ancona

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