Как автоматизировать проверку резюме с помощью локальных LLM и данных из GitHub

04 Jun, 2026

Разбор почты с откликами на вакансию — это всегда боль. Сначала ты полчаса пытаешься понять, что именно человек делал на прошлом месте работы, потом идешь в его GitHub, чтобы проверить, не ограничиваются ли его «глубокие знания Python» парой форков и учебным проектом по туториалу. Ребята из HackerRank (команда interviewstreet) выложили в опенсорс Hiring Agent — инструмент, который пытается забрать эту рутину на себя.

Я наткнулся на этот проект, когда искал способ быстро прогнать пачку PDF-файлов через локальную нейронку. Идея простая: скормить агенту резюме, дать ему доступ к GitHub кандидата и получить на выходе структурированный отчет с оценками.

Что умеет этот агент

Hiring Agent — это не просто обертка над ChatGPT. Это полноценный конвейер, который вытаскивает данные из «кривых» PDF и превращает их в человекочитаемый JSON.

Проект делает несколько вещей:

  1. Парсит PDF и переводит его в Markdown. Это критично, потому что LLM гораздо лучше понимают размеченный текст, чем сырую кашу из символов после обычного извлечения текста.
  2. Обогащает данные через GitHub API. Агент не просто смотрит на количество звезд, он анализирует репозитории, классифицирует их и выбирает топ-7 наиболее релевантных проектов, где кандидат реально писал код.
  3. Выставляет оценки по критериям. Система проверяет навыки, опыт в продакшене и вклад в опенсорс.

Интересно, что проект поддерживает работу с Ollama. Это значит, что можно запустить всё локально на своей машине, не отправляя персональные данные кандидатов в облака Google или OpenAI. Для тех, кому лень настраивать локальные модели, есть поддержка Gemini.

Реклама

Как это устроено внутри

Архитектура проекта довольно прозрачная. Весь процесс разбит на этапы, которые можно отследить в коде.

Resume-to-Score pipeline that extracts structured data from PDFs, enriches with GitHub signals, and outputs a fair, explainable evaluation.

Python License: MIT Code style: Black

За извлечение текста отвечает 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 чистый, так что форкнуть и адаптировать под себя не составит труда.