Как автоматизировать проверку резюме с помощью локальных LLM и данных из GitHub
Разбор почты с откликами на вакансию — это всегда боль. Сначала ты полчаса пытаешься понять, что именно человек делал на прошлом месте работы, потом идешь в его GitHub, чтобы проверить, не ограничиваются ли его «глубокие знания Python» парой форков и учебным проектом по туториалу. Ребята из HackerRank (команда interviewstreet) выложили в опенсорс Hiring Agent — инструмент, который пытается забрать эту рутину на себя.
Я наткнулся на этот проект, когда искал способ быстро прогнать пачку PDF-файлов через локальную нейронку. Идея простая: скормить агенту резюме, дать ему доступ к GitHub кандидата и получить на выходе структурированный отчет с оценками.
Что умеет этот агент
Hiring Agent — это не просто обертка над ChatGPT. Это полноценный конвейер, который вытаскивает данные из «кривых» PDF и превращает их в человекочитаемый JSON.
Проект делает несколько вещей:
- Парсит PDF и переводит его в Markdown. Это критично, потому что LLM гораздо лучше понимают размеченный текст, чем сырую кашу из символов после обычного извлечения текста.
- Обогащает данные через GitHub API. Агент не просто смотрит на количество звезд, он анализирует репозитории, классифицирует их и выбирает топ-7 наиболее релевантных проектов, где кандидат реально писал код.
- Выставляет оценки по критериям. Система проверяет навыки, опыт в продакшене и вклад в опенсорс.
Интересно, что проект поддерживает работу с Ollama. Это значит, что можно запустить всё локально на своей машине, не отправляя персональные данные кандидатов в облака Google или OpenAI. Для тех, кому лень настраивать локальные модели, есть поддержка Gemini.
Как это устроено внутри
Архитектура проекта довольно прозрачная. Весь процесс разбит на этапы, которые можно отследить в коде.
Resume-to-Score pipeline that extracts structured data from PDFs, enriches with GitHub signals, and outputs a fair, explainable evaluation.
За извлечение текста отвечает pymupdf_rag.py. Он старается сохранить структуру документа: заголовки, таблицы и списки. Затем в дело вступает pdf.py, который нарезает текст на секции (опыт, образование, навыки) и просит LLM привести их к стандарту JSON Resume.
Самая любопытная часть — github.py. Агент ищет ссылку на профиль в резюме, вытягивает список репозиториев и просит нейронку отфильтровать мусор. Он смотрит на количество коммитов автора и значимость проекта. Если у кандидата в профиле только учебные задания из университета, агент это заметит.
В конце evaluator.py сводит всё воедино. Он использует Jinja-шаблоны для формирования промптов, где прописаны жесткие правила оценки. На выходе получается не просто цифра, а обоснование: за что начислили баллы, а за что — оштрафовали.
Запуск на своей машине
Для работы понадобится Python 3.11. Если хотите гонять всё локально, сначала поставьте Ollama и вытяните какую-нибудь модель из семейства Gemma 3.
git clone https://github.com/interviewstreet/hiring-agent
cd hiring-agent
pip install -r requirements.txt
ollama pull gemma3:4b
После этого нужно создать файл .env (есть пример .env.example) и указать там провайдера. Если используете GitHub API активно, лучше добавить GITHUB_TOKEN, иначе быстро упретесь в лимиты.
Запуск одной командой:
python score.py /путь/к/резюме.pdf
Если включен DEVELOPMENT_MODE в конфиге, скрипт создаст CSV-файл со всеми результатами и закеширует промежуточные ответы от LLM в папку cache/. Это удобно, если вы дебажите промпты и не хотите каждый раз тратить токены или время на повторный парсинг одного и того же файла.
Кому это пригодится
Проект в первую очередь будет полезен тимлидам и небольшим командам, у которых нет выделенного HR-департамента, а поток резюме приличный.
Конечно, Hiring Agent не заменит полноценное техническое интервью. Но он отлично справляется с ролью первого фильтра. Например, можно быстро отсеять тех, кто приписывает себе владение технологиями, которыми ни разу не пользовался в реальных проектах на GitHub.
Из минусов — README довольно лаконичный, и в логике оценки придется разбираться через чтение Jinja-шаблонов в папке prompts/templates/. С другой стороны, это позволяет легко подкрутить критерии под свои нужды: например, добавить больше веса за участие в крупных опенсорс-проектах или знание специфических фреймворков.
В целом, это добротный пример того, как использовать LLM для автоматизации скучных офисных задач без лишнего хайпа. Проект живой, код на Python чистый, так что форкнуть и адаптировать под себя не составит труда.
