Как я сделал AI-ассистента, который помогает IT-джунам собрать первое резюме, и почему он принципиально ничего не выдумывает.

* Соло-проект в рамках хакатона Kodik Launchpad

Я сам джуниор NLP/LLM/AI engineer и вместе со знакомыми ребятами познал проблему: у тебя есть пет-проекты не “в стол”, хакатоны, соревнования и какой-то опыт, но просто перечислить эти факты в резюме, которое пройдет фильтры hr-ов, где всё чаще применяется ИИ типа GhatGPT, уже не достаточно. Не потому, что нечего показать, а потому, что не знаешь, что именно показать и как это упаковать под требования определенной вакансии (про весь рынок говорить слишком сложно).

Казалось бы, в эпоху нейронок, когда и код и отчеты ты не пишешь так, как еще 2 года назад, можно попросить любую нейросеть написать резюме - и она “сварганит”, но с проблемами: она выдумает метрики, раздует опытом и проектами, подтянутыми оттуда, где обучается.

Более продвинутый путь - давать свои реальные данные и просить итеративно, посредством промптов, доводить резюме. Но если у тебя очень мало опыта, результат будет соответствующий.

Я же выбрал альтернативный путь: решил создать инструмент, который помогает достать и структурировать то, что у человека реально есть, и ничего не додумывает. Так появился JunMate.

Что такое JunMate

Это разговорный ассистент, в котором пользователь загружает своё резюме (или при отсутствии оного, просто описывает себя текстом), а дальше - короткий диалог, в котором ассистент задаёт точечные вопросы и дозаполняет профиль. На выходе - готовое к скачиванию PDF-резюме под структуру hh.ru, с корректной кириллицей и кликабельными ссылками.

Главный принцип системы: GROUNDING - ассистент работает только с фактами, которые пользователь-джун сообщил. Он может переформулировать, структурировать, усилить формулировки, НО не выдумать проект/метрику/стек/цифру, которых не было.

Типичный сценарий пользователя

Человек загружает короткое резюме, можно даже пару строк: “Вася Пупкин. Python разработчик. Стек: Django, Flask, SQL, Docker.”

Ассистент:

  • Распознаёт карьерный трек и целевую роль (если указана).
  • Делает gap-анализ - что есть под роль и чего не хватает.
  • Ведёт диалог, задавая 1 конкретный вопрос за ход: не абстрактное “расскажите о себе”, а “какие метрики были у платёжной системы ?”, “с помощью каких инструментов в проекте N реализовали кеш ?”, “как обрабатывали фоновые задачи ?”, “настраивали ли CI-CD и как упаковывали проект ?”.
  • Из ответов собирает структурированное резюме с проектами, bullets, метриками и прочими фактами.
  • Включает критика и проверяет сам себя на фантазии и рендерит готовый PDF, который можно просмотреть прямо на странице диалога, сразу скачать либо продолжить доработку.

Отдельный момент: часто можно встретить в резюме ссылки на GitHub/Telegram/LinkedIn, представляющие гиперссылки-якоря. То есть виден только текст “GitHub”, а сам URL спрятан в аннотации файла и при обычном парсинге не извлекается. JunMate распознает такие “заглушки” и переспрашивает у пользователя корректные ссылки - чтобы в итоговом резюме они были кликабельными (на больших резюме может не сработать на 1м вопросе - от недетерминизма LLM не уйти).

Что внутри

Под капотом не один промпт, а конвейер из шести агентов (на текущий момент), каждый под свою спецзадачу:

  • Parser - извлекает структурированный профиль из текста/резюме.
  • Track - классифицирует карьерный трек (Industry / Research / Education / Startup).
  • Matcher - проводит gap-анализ навыков под целевую роль (если указана, если нет - она выясняется в диалоге).
  • Turn - ведёт диалог, дозаполняет профиль, по вопросу за ход.
  • Rewriter - переписывает резюме под структуру hh.ru
  • Critic - проверяет фактологичность результатов.

Critic - это слой LLM-as-a-judge. Перечитывает резюме и сверяет каждое утверждение с исходными фактами и фактами диалога. Если обнаруживает противоречия и что-то, чего пользователь не говорил - запускает повторную генерацию с учётом этих замечаний. Так контроль честности встроен в саму архитектуру, а не остаётся на одном промпте.

Слияние данных детерминировано в коде и покрыто unit-тестами, а не управляется моделью. Объединение нового ответа с данными старого профиля нельзя давать на откуп LLM.

Измерение качества: разметил вручную набор реальных резюме, написал модуль eval. В результате точность классификации трека ~90-100 %. Проверка на фактологичность выдумок модели не выявила. Детерминированное ядро покрыл unit-тестами, которые прогоняются автоматически на каждом push.

Стек прагматичный: Python 3.12, Streamlit, pydantic, pdfplumber для входа и fpdf2 для корректного рендера PDF с кириллицей.

Про разработку в Kodik IDE

Проект я разрабатывал преимущественно в Kodik IDE - это было условием хакатона. Ребята делают отечественный аналог Cursor/Windsurf и потребность в нём очевидна (проблемы с оплатой зарубежных подписок напрямую всем известны).

Что понравилось: можно выбирать множество моделей, в том числе и топовые или подключать свои локальные. Также радует, что команда предусмотрела marketplace внутри IDE с хостингом на своих же серверах. То есть разработчику, особенно начинающему, можно не заморачиваться с инфраструктурой, а просто писать код агентами, разворачивать своё приложение и подключать монетизацию, не выходя из IDE. Идея классная !!!.

Но честно: стоимость токенов пока выше, чем у того же Cursor - есть куда оптимизировать процессы. Однако действительно подкупает то, что команда очень быстро реагирует и даёт обратную связь. Буквально: участники хакатона находят баги, а ребята правят их на ходу. Для продукта на старте и без крупных инвесторов это правильный вектор развития.

Отдельный плюс: ребята создали свой шлюз-провайдер для маршрутизации запросов к нейросетям с приятными ценами

Через него и обращаюсь по API к gpt-4.1-mini.

Что дальше

JunMate - сейчас рабочий MVP. И мне интересно развивать его до полноценного продукта. В планах добавить:

  • Мотивационное письмо - генерация и корректировка под обновленное резюме.
  • Tools, подтягивающие требования по целевой роли с hh.ru подбирающие курсы под выявленные пробелы (со Stepik, ODS и пр.)
  • Production-observability - авторизацию, монетизацию, базы данных и дашборды для удобного мониторинга действий пользователей и расхода ресурсов.

О себе

С 2024 решил сменить профессию. Начал обучаться на бесплатных курсах/симуляторах, писать пет-проекты.

Из проектов, которыми занимался помимо JunMate: telegram RAG бот техподдержки на ~1500 пользователей для друга-предпринимателя (анализ скриншотов и текстовых запросов, корпус документов 500+) и telegram бот суммаризации постов из каналов, на которые подписаны пользователи (командный проект).

Последние 9 месяцев активно участвую в хакатонах. В командных как teamlead и индивидуальных. Из достижений - попадали в топ-10/ доезжал до топ-4 соответственно.

JunMate - способ помочь ребятам вроде меня самого выйти на рынок и полигон, где я собрал мультиагентную систему целиком: от архитектуры до тестов, eval и деплоя.

Я открыт к предложениям на позиции NLP / LLM / AI engineer в продуктовые / AI команды. Буду рад обратной связи по проекту.

Про доступ и монетизацию

Приложение сейчас работает в демо-режиме, без авторизации и оплаты. Это осознанный выбор для MVP.

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

Как я вижу монетизацию: единицей оплаты станет не количество токенов, а готовое резюме. Условно “пакет на N резюме”. Для этого в roadmap авторизация, БД и пр.

Ссылка на приложение

- может не отвечать/быть на паузе для экономии ресурсов.

1