---
title: "Почему я разработал Code2Prompt"
date: 2025-04-11
lastUpdated: 2025-04-11
tags:
  - open-source
  - code2prompt
  - AI
  - Agent
excerpt: "История создания code2prompt: мой путь к открытому исходному коду для решения проблем контекста в рабочих процессах LLM"
authors:
  - ODAncona
cover:
  alt: "Иллюстрация code2prompt, оптимизирующая контекст кода для агентов ИИ."
  image: "/src/assets/logo_dark_v0.0.2.svg"
featured: false
draft: false
---

## Введение

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

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

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

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

## Первые шаги с LLM 👣

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

![OpenAI Playground](/assets/blog/post1/playground.png)

## Эволюция моделей 🏗️

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

## Мои первые проекты с LLM 🚀

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

## Новый парадигма: Software 3.0 💡

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

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

Та же идея привела к протоколу [MCP](https://modelcontextprotocol.io/introduction), который позволяет LLM вызывать инструменты и ресурсы напрямую бесшовным образом, потому что по дизайну инструмент нуждается в описании, чтобы быть вызванным LLM, в отличие от REST API, который не обязательно требует спецификации OpenAPI.

## Ограничения LLM 🧩

### Галлюцинации 🌀

При повторении известной статьи `RESTGPT` я заметил некоторые серьезные ограничения LLM. Авторы статьи столкнулись с теми же проблемами, что и я: LLM **галлюцинировали**. Они генерируют код, который не реализован, изобретая аргументы и просто следуя инструкциям буквально без использования здравого смысла. Например, в исходном коде RestGPT авторы спросили в [подсказке вызывающего](https://github.com/Yifan-Song793/RestGPT/blob/main/model/caller.py).

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

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

### Ограниченный размер контекста 📏

Другим ограничением был размер контекста; LLM хорошо справляются с поиском иголки в стоге сена, но с трудом понимают его. Когда вы даете слишком много контекста языковым моделям, они склонны теряться в деталях и теряют из виду общую картину, что раздражает и требует постоянного управления. Способ, которым я люблю думать об этом, похож на [проклятие размерности](https://towardsdatascience.com/curse-of-dimensionality-a-curse-to-machine-learning-c122ee33bfeb/). Замените слово "размерность" или "функция" на "контекст", и вы получите идею.

![Проклятие размерности](/assets/blog/post1/curse_of_dimensionality.png)

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

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

Это heavily вдохновлено известным [цитатой Alain Berset](https://www.lematin.ch/story/alain-berset-la-formule-qui-defie-le-temps-166189802108), швейцарского политика 🇨🇭, который сказал во время карантина COVID-19:

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

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

## Поиск лучшего способа: code2prompt 🔨

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

И, voilà, я обнаружил проект на основе Rust [Mufeed](https://www.reddit.com/r/rust/comments/1bghroh/i_made_code2prompt_a_cli_tool_to_convert_your/) под названием _code2prompt_, который имеет около 200 звезд на GitHub. Это было еще просто на тот момент: простой инструмент CLI с базовой ограниченной емкостью фильтрации и шаблонами. Я увидел огромный потенциал и сразу же присоединился к нему, реализовав совпадение шаблонов glob, среди других функций, и вскоре стал основным участником.

## Видение и интеграции 🔮

Сегодня существует несколько способов предоставить контекст LLM. Генерация из более крупного контекста, использование генерации на основе извлечения (RAG), [сжатие кода](https://www.all-hands.dev/blog/openhands-context-condensensation-for-more-efficient-ai-agents), или даже использование комбинации этих методов. Создание контекста — это горячая тема, которая будет быстро развиваться в ближайшие месяцы. Однако, мой подход — **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` как инструмент, тем самым делая их способными создавать контекст.

Видение описано дальше на [странице видения](/docs/vision) в документации.

## Интеграция с агентами 👤

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

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

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

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

Эти возможности делают `code2prompt` идеальным выбором для рабочих процессов на основе агентов. Сервер MCP позволяет бесшовную интеграцию с популярными фреймворками ИИ-агентов, такими как [Aider](https://github.com/paul-gauthier/aider), [Goose](https://block.github.io/goose/), или [Cline](https://github.com/jhillyerd/cline). Пусть они обрабатывают сложные цели, а `code2prompt` доставляет идеальный контекст кода.

## Почему Code2prompt имеет значение ✊

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

**Вкратце:**

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

## Вы можете присоединиться! 🌐

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

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

**Olivier D'Ancona**

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