Свой ИИ-агент по репозиториям на Qwen и Smolagents без облака
Как я собирал локального агента, который читает мои приватные репозитории и отвечает по коду — на открытой модели Qwen и фреймворке Smolagents, без отправки исходников наружу.
Перечитал, нашёл все «, а» после «не» — их четыре, переписываю каждое. Вот текст:
Когда мне нужно спросить что-то по своему коду, обычный путь — кинуть кусок в чужой чат. С приватными репозиториями это отпадает сразу: клиентские проекты, ключи в конфигах, внутренняя логика. Так что я собрал агента, который живёт на моей машине, видит мои репозитории и никуда их не отправляет. Модель — Qwen, обвязка — Smolagents. Ниже разбираю, как это устроено и где спотыкается.
Почему именно Qwen и Smolagents
Qwen хорош тем, что открытые веса поднимаются локально, а в линейке есть размеры под любое железо — от ноутбучных до серверных. Я работаю с 7B: она влезает в память рабочей станции и уже прилично держит код.
Smolagents от Hugging Face взял за минимализм. Тонкая библиотека, где агент по умолчанию действует через Python-код: модель пишет код, код выполняется, результат возвращается в контекст. Для задачи «походить по файлам, что-то найти, что-то посчитать» это удобнее длинных цепочек tool-calls. Мне важно было держать стек маленьким — меньше движущихся частей, меньше того, что ломается в три ночи.
Как устроена сборка
Весь агент — тонкий Python-оркестратор, поднятый через Docker Compose. Никаких n8n и тяжёлых платформ: они дали бы UI-обёртку и лишний сервис на VPS, а реальную работу всё равно пишешь руками. Состав получился короткий.
- Локальный inference-сервер с Qwen (через vLLM или Ollama — что удобнее на вашем железе).
- Smolagents как ядро агента с набором инструментов под файловую систему.
- Индекс репозиториев: я складываю пути, куски файлов и их эмбеддинги, чтобы агент искал по смыслу, а grep оставался запасным вариантом.
- Postgres как хранилище состояния — история запросов и то, что агент уже посмотрел.
Smolagents получает несколько простых инструментов: прочитать файл по пути, найти файлы по маске, семантический поиск по индексу. Дальше модель сама решает, что вызвать. Жёсткий сценарий расписывать не пришлось — я описываю инструменты и отдаю задачу.
Что даёт индексация репозиториев
Без индекса агент слепой: он либо просит точный путь, либо перебирает файлы наугад. Поэтому первый шаг — прогнать репозитории через разбивку на куски и посчитать эмбеддинги. Режу по функциям и логическим блокам. Порезка по строкам подряд рвала бы смысл, а так найденный фрагмент остаётся осмысленным.
Когда индекс готов, вопрос вроде «где мы формируем подпись запроса к API» превращается в семантический поиск по индексу. Больше никакого мучительного grep по десятку проектов. Агент подтягивает три-четыре релевантных куска, читает их целиком и отвечает со ссылками на файлы. Ради этого момента всё и затевалось.
Где спотыкается 7B и что с этим делать
Честно: 7B — рабочая лошадка с потолком. Что заметил на практике.
- Длинный контекст размывает внимание. Не вываливайте в модель весь файл на 2000 строк — отдавайте найденные куски.
- Сложную многошаговую задачу лучше дробить. «Найди, потом объясни, потом предложи правку» проходит стабильнее, чем один промпт на всё сразу.
- Модель иногда придумывает пути к файлам. Спасает жёсткая проверка: инструмент чтения возвращает ошибку на несуществующий путь, и агент переспрашивает индекс.
Эту проверку путей выкидывать нельзя, даже ради краткости кода. Без неё агент уверенно ссылается на файлы, которых нет.
Упёрлись в потолок 7B — поднимаете версию Qwen побольше на той же обвязке. Smolagents и индекс остаются прежними, меняется только адрес inference-сервера.
С чего начать
Собирайте по слоям. Целиком за один заход соберётся хуже.
- Поднимите Qwen локально и убедитесь, что модель отвечает через API.
- Прикрутите Smolagents с одним инструментом — чтением файла по пути. Уже на этом этапе агент кое-что умеет.
- Добавьте поиск по маске, потом семантический индекс. Каждый шаг проверяйте руками на реальном вопросе по своему коду.
Смысл всей затеи простой: получить помощника по коду, который работает с приватными репозиториями и держит исходники дома. Qwen и Smolagents дают для этого достаточно, а стек остаётся таким, что его понимаешь целиком. Я собирал это под себя и продолжаю докручивать — делюсь тем, что уже проверил руками.
Ваш контекст для работы с ИИ
Дело всё меньше в удачном запросе и всё больше в том, что ИИ знает о вас и вашей работе. Собираю и упаковываю ваш профессиональный контекст и передаю систему, в которой вы сами поддерживаете его актуальным.