Учебный Streamlit MVP для автоматического прескоринга кандидатов по тексту вакансии и PDF-резюме.
- ввод текста вакансии;
- загрузка PDF-резюме;
- извлечение и очистка текста из PDF;
- анализ через OpenAI API или mock-режим;
- структурированный JSON-анализ;
- расчёт итогового score;
- сохранение истории кандидатов в CSV.
- Python 3.11+
- Streamlit
- pdfplumber
- python-dotenv
- openai
- pandas
- google-genai
.
├── app.py
├── parser.py
├── gpt_service.py
├── scoring.py
├── models.py
├── storage.py
├── requirements.txt
├── .env.example
├── README.md
├── AGENTS.md
└── data/
└── history.csv
pip install -r requirements.txtЕсли команда pip недоступна, используйте:
python3 -m pip install -r requirements.txtСоздайте .env рядом с app.py и заполните переменные:
GEMINI_API_KEY=your_gemini_api_key_here
GEMINI_MODEL=gemini-2.5-flash
OPENAI_API_KEY=your_api_key_here
OPENAI_MODEL=gpt-4o-miniЕсли GEMINI_API_KEY задан, приложение использует Gemini. Если Gemini недоступен, но задан OPENAI_API_KEY, приложение использует OpenAI. Если оба ключа отсутствуют или запросы завершаются ошибкой, включается mock-режим.
streamlit run app.pyЕсли streamlit не найден в PATH, запустите через Python:
python3 -m streamlit run app.pyMock-режим включается автоматически, если нет API-ключей или запросы к Gemini/OpenAI завершаются ошибкой. Он возвращает демонстрационный анализ в той же структуре, что и LLM-ответ.
- Вставьте текст вакансии.
- Загрузите PDF-резюме.
- Нажмите
Запустить анализ. - Проверьте извлечённый текст, итоговый score и списки сильных/слабых сторон.
- История автоматически сохраняется в
data/history.csv.
Demo resume files for testing are located in:
example/resumes/
{
"hard_skills_score": 0,
"experience_score": 0,
"soft_skills_score": 0,
"strengths": [],
"weaknesses": [],
"missing_skills": [],
"summary": ""
}Итоговый score считается локально, не приходит от GPT:
final_score = hard_skills_score * 0.5 + experience_score * 0.3 + soft_skills_score * 0.2
По умолчанию используются веса 50% / 30% / 20%. В sidebar приложения веса можно изменить; они нормализуются автоматически до суммы 100%. Некорректные значения score приводятся к диапазону 0-100.
- PDF без текстового слоя может вернуть пустой текст.
- Mock-режим не выполняет реальную оценку соответствия.
- CSV history не предназначен для многопользовательского production-хранения.
- Приложение не хранит API-ключи в коде.
- Gemini используется первым при наличии
GEMINI_API_KEY.
Reference repository: https://github.com/MrGAN12009/prescore
Из референса взяты идеи модульной структуры, PDF-парсинга, GPT JSON-анализа и отображения истории. Упрощены Pydantic-валидация, эвристический скоринг, JSON-экспорт и сравнение кандидатов. История реализована иначе: через data/history.csv, как требуется в задании.