В компаниях с несколькими продуктами знания о коде и архитектуре почти неизбежно расползаются. Часть живёт в репозиториях, часть — в статьях с архитектурными решениями, часть — в корпоративной базе знаний (в нашем случае — Confluence). На небольшом масштабе это выглядит как порядок. Но по мере роста начинают проявляться системные эффекты.
Появляется дублирование функционала с разными подходами. Сложнее становится погружаться в новый продукт при кросс‑командных переходах. Поиск по каждому репозиторию и каждому пространству документации по отдельности — медленный и утомительный. В итоге вопросы уходят к «знающим людям», которые постепенно превращаются в узкое горлышко.
Мы столкнулись с этим в явном виде и сформулировали задачу так: дать разработчикам и системным аналитикам быстрый и актуальный поиск по всей кодовой базе компании с возможностью диалога через универсального агента.
Для скорости PoC решили делать локальный деплой.
В этой статье я расскажу, как мы построили локальный RAG‑сервис, оформили его как MCP‑сервер и подключили к IDE. Подход будет полезен командам с большим количеством репозиториев, внутренней документацией и требованиями к безопасности.
Общая идея и архитектура
Мы сознательно не пытались сделать «умный поиск по всему сразу». Вместо этого система строится вокруг простого и прозрачного потока данных:

Архитектура состоит из двух основных компонентов — индексатора и RAG‑сервиса (MCP‑слоя), который связывает их с клиентами. Всё развёрнуто на локальном сервере компании и используется как внутренний сервис.
rag-indexer: как мы работаем с источниками знаний
Первый вопрос, который пришлось решить: что именно индексировать и в каком виде.
Мы индексируем три основных типа источников:
код репозиториев;
базу знаний и архитектурные описания.
При этом для нас было важно не просто «сложить всё в векторное хранилище», а сохранить контекст. Для каждого документа мы храним метаданные: репозиторий, продукт или подсистему, теги, а также политики доступа. Это позволяет фильтровать и ограничивать поиск ещё до стадии генерации ответа. Использовались в лоб ASTEnhancer и API Confluence для подготовки данных, потом стандартная нарезка на чанки. Для кода CodeSplitter, для статей SentenceSplitter - все из llamaindex. Эмбедер OpenAI text-embedding-3-large.
Обновление индексов происходит несколькими способами. Основной — по триггерам из CI. При изменениях в репозитории код автоматически копируется на локальный сервер и переиндексируется. Для документации используется синхронизация по API, а для крупных изменений предусмотрен ручной запуск.
rag-server: RAG как сервис, а не как скрипт
Второй компонент — rag‑server. Это не просто обёртка над retrieval + generation, а полноценный сервис с собственной логикой обработки запросов. Здесь мы руководствовались принципами разделения ответственности и возможности тестировать каждый элемент по отдельности. Это значит, что отдельно был реализован сервер FastMCP и отдельно, на FastAPI - RAG сервис. Отдельно уточню, что использовалась бд FAISS и llamaindex для работы самого rag. А долполнительные вызовы LLM для расширения запроса пользователя, реранкинга и тд на обычном OpenAI python SDK.
Запрос проходит несколько этапов:
принимается от клиента;
уточняется и обогащается контекстом;
маршрутизируется по продуктам или подсистемам;
выполняется поиск по релевантным индексам;
результаты ранжируются;
формируется ответ с привязкой к источникам.
Ключевая идея здесь — не один глобальный поиск, а управляемый роутинг. Мы сознательно ушли от модели «спроси всё обо всём»: она плохо масштабируется и быстро начинает давать шум.
MCP слой дает стандартизированный протокол для IDE (стэк компании включает C++, C#, Java, Rust, JavaScript, Python). IDE разные, а инструмент один! Это позволяет подключить сервис к нескольким IDE без дублирования бизнес‑логики.
CI/CD и автоматическое обновление
Без автоматического обновления такая система быстро устарела бы, поэтому мы сразу встроили её в существующий CI/CD‑контур.
При пуше в репозиторий GitLab CI:
код копируется на локальный сервер;
запускается переиндексация.
Документация обновляется автоматически через API, без ручных действий со стороны разработчиков. Это критично: если ответы начинают отставать от реальности, доверие к системе падает очень быстро.
Эффект и метрики
В продакшене мы получили вполне измеримый эффект:
время ответа — от 5 до 60 секунд, в зависимости от ширины запроса;
снижение нагрузки на ключевых экспертов;
ускорение онбординга новых разработчиков;
меньше контекстных переключений при работе с кодом.
Это не инструмент «на каждый клик», но в ситуациях, где раньше требовались десятки минут или личные консультации, он окупается очень быстро.
Ограничения
Система далека от идеала, и это важно проговорить честно.
На текущий момент:
необходимо расширять методы поиска (текущая версия просто по векторам);
качество ранжирования на сложных запросах требует доработки;
роутинг по продуктам во многом настраивается вручную.
Вместо заключения
Это не массовый инструмент и не замена поисковику. Разработчику действительно не каждый день нужно искать код из других продуктов.
Но когда такая необходимость возникает, важно получить ответ быстро, из актуальных источников и без риска утечки данных.
Подход с локальным RAG‑сервисом, оформленным как MCP‑сервер, хорошо решает эту задачу и масштабируется под другие внутренние кейсы.
Комментарии (13)

Arahnid
08.01.2026 13:22Так как в итоге Вы построили свой локальный RAG-сервис?

Devenir-Glorieux Автор
08.01.2026 13:22В статье описан подход к созданию рабочего mvp. Построили, получается

Devenir-Glorieux Автор
08.01.2026 13:22Спасибо за комментарии, дополнил статью техническими нюансами.

ka4ep
08.01.2026 13:22Эту статью спокойно мог выдать ИИ в плане содержания. Достаточно спросить "как мне прикрутить RAG к своей системе". Я с ИИ сижу уже вторую неделю и пилю сервер, клент, embedding`и различных данных сквозь одну модель, день возился с одной лишь CUDA, подрубил ещё и LLM модель, что креативила, сама писала код. Там цепочка подлинее получается. А в статье - мы захотели и у нас получилось. Молодцы, что я могу сказать. Где детали, где подводные камни?

WhiteBehemoth
08.01.2026 13:22При пуше в репозиторий GitLab CI:
код копируется на локальный сервер;
запускается переиндексация.
а как много у вас команд/людей в них и как часто бывают пуши? Не накладно индексировать при каждом разе? Особенно если не только мастер-бренч...
за идею, кстати, спасибо, надо будет подумать о вариантах.

Devenir-Glorieux Автор
08.01.2026 13:22основных крупных продуктов 7, репозиториев много с учетом кросплатформенности, команд много, пуши регулярно. Ембединг модели не дорогие, при регулярной индексации выходит не заметно в масштабах компании.
Возможность заводить в БД не только мастер есть - все опционально для Джабы в CI, но как будто бы это избыточно для тех задач которые несет в себе этот инструмент.

rodion-m
08.01.2026 13:22Мы в CodeAlive graph RAG по коду с LSP и Roslyn строим уже почти два года в виде коммерческого продукта и до сих пор вылезают разные нюансы. В статье описаны лишь несколько % из тех приседаний, которые нужно сделать для того, чтобы такая система давала действительно релевантные и стабильные ответы.
Ну и главный инсайт в том, что векторизовать сырой код - неэффективно, а векторного поиска, конечно же, недостаточно - даже самого лучшего.
wolframko
08.01.2026 13:22Большинство же сидит на курсоре (где есть только векторный поиск по сырому коду) и на других инструментах (где нету даже его и хватает обычного grep). Эти инструменты отлично решают бизнес задачи даже в огромных легаси кодовых базах. Так зачем тогда graphrag там? Проще просто дать агенту доступ к поиску, он сам изучит поведение множественными вызовами поиска и даст ответ.

javadev
08.01.2026 13:22"маршрутизируется по продуктам или подсистемам;" - не совсем понятна эта часть. У вас несколько векторных хранилищ? На основании чего маршрутизация?

Devenir-Glorieux Автор
08.01.2026 13:22Мы не делаем глобальный индекс, иначе приходилось бы пересчитывать все при каждом обновлении. Каждая репа пишется в свой FaissVectorStore, роутинг основан на аргументах вызова MCP tool универсальным агентом. То есть когда вы задаете вопрос - агент вызывает тул с аргументами question, products_list (ему также доступен инструмент получения списка продуктов с мета информацией: name, description, technologies). Аргумент products_list опциональный, если не передан, то поиск по всем индексам
starfair
Я извиняюсь конечно, но вообще не вижу в статье заявленного :
По моему как, это когда описывается технологический стек, библиотеки, с чем столкнулись, какие решения и как применили в итоге.
А в этой статье скорее речь вот мы какие молодцы и умеем. И толку всем остальным от такого знания?
Devenir-Glorieux Автор
Толк в идее и подходе к решению задачи. Проблем и трудностей в подготовке mvp не возникло, но я бы использовал LangGraph для построения флоу в тулах MCP. Это не обязательно, но усовершенствовать логику будет потом удобнее.
starfair
Ну, как минимум, у вас такое количество заявленных хабов в заголовке по разным ЯП и нет ни одной строчки, даже формального описания решения с их использованием.
Ваша идея давно "витает в воздухе",и она уже во многом реализована в разного рода MCP для агентов. Поэтому, хотелось бы понимания, как конкретно вы решили в своем случае.
Просто описать идею, и что она вообще решаема - для такого уровня ресурса как Хабр, в наше время как то маловато! Хочется более конкретных решений, чтобы оправдать время на чтение изложения ваших идей.
Я не критикую само решение. Оно здравое, и сам к таким же идеям пришел, но пока нет времени на реализацию. И именно поэтому, очень хотелось бы ваше ноу-хао посмотреть с точки зрения человека так же готового в это окунуться, но слегонца сэкономить время и нервы, пользуясь проторенными вами путями.
ЗЫ, Спасибо, что расширили в итоге статью некоторыми деталями. Есть теперь над чем подумать!