Голем: как в нём устроен анализ кода

В прошлый раз я рассказал про Голема — кодинг-агента в Telegram. Сейчас хочу показать, что у него под капотом. А именно — как работает анализ кода.
Первая версия была примитивной: весь код летел в LLM, та читала и выдавала вердикт. Работало паршиво. LLM галлюцинировала про «обрезанные функции», жрала токены как не в себя, а если проект был больше пары файлов — просто захлёбывалась.
Нужно было что-то менять.
Гибридный анализ: четыре утилиты вместо одной LLM
Теперь перед тем, как отдать код модели, его прогоняют четыре статических анализатора:
bandit, ruff, semgrep, pip_audit = await asyncio.gather( run_bandit(project_dir), # безопасность run_ruff(project_dir), # стиль и баги run_semgrep(project_dir), # глубокий анализ run_pip_audit(project_dir) # зависимости )
Каждая утилита отвечает за свою область:
Bandit ищет уязвимости безопасности: SQL-инъекции, использование
eval(), хардкод паролей.Ruff проверяет стиль и очевидные ошибки: неиспользуемые импорты, синтаксис, голые except.
Semgrep находит сложные паттерны: XSS, утечки данных, опасную десериализацию.
pip-audit сверяет зависимости с базой CVE и сообщает о дырявых пакетах.
Все четыре запускаются параллельно через asyncio.gather. На проекте среднего размера это занимает 10-15 секунд вместо 40-50 при последовательном запуске.
LLM получает только проблемные строки
Раньше модель получала первые 1000 символов из каждого файла. Это приводило к двум проблемам: дикий перерасход токенов и галлюцинации. LLM видела обрывок функции и думала, что код незавершённый.
Теперь всё иначе. Анализаторы возвращают конкретные проблемные строки, и модель получает только их с контекстом в 3-4 строки вокруг:
# main.py:42 — Bandit HIGH query = f"SELECT * FROM users WHERE id = {user_input}" # SQL-инъекция
Результат:
Расход токенов сократился в 10 раз.
Галлюцинации про «незавершённый код» исчезли полностью.
Анализ работает одинаково быстро на проекте из 10 файлов и из 500.
Асинхронный режим
ZIP-архивы и GitHub-репозитории анализируются в фоне. Пользователь отправляет файл и сразу получает ответ «анализ запущен», а результат приходит отдельным сообщением через минуту-две. Бот не висит, можно продолжать с ним работать.
asyncio.create_task( _analyze_directory_async(context, temp_dir, source, llm, user_id) ) await update.message.reply_text("🔍 Анализ запущен в фоне")
Что дальше
Сейчас Голем умеет анализировать только Python-проекты. В ближайших планах:
Поддержка JavaScript/TypeScript (ESLint + npm audit)
Поддержка Go (golangci-lint + govulncheck)
Поддержка Rust (clipp +cargo-audit )
Также хочу добавить команду /fix — автоматическое исправление проблем, которые находит Ruff. Часть ошибок можно починить без участия человека, и Голем будет делать это сам.
Попробовать
Бот живёт в Telegram: @Golem666bot
Там же можно посмотреть другие проекты и следить за разработкой: @system_develope







