AI-скрининг резюме — это автоматизация первичной обработки резюме кандидатов с помощью языковых моделей. Рекрутер тратит в среднем 7 секунд на первичный просмотр резюме, при этом при большом потоке (100+ откликов на вакансию) неизбежны ошибки. AI помогает структурировать данные, сопоставить навыки с требованиями и ранжировать кандидатов объективно.
Извлечение структурированных данных из резюме
Первый шаг — парсинг резюме в структурированный формат:
from openai import OpenAI
import json
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
def parse_resume(resume_text: str) -> dict:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """Извлеки из резюме данные. JSON:
{
"name": "ФИО",
"position": "текущая/желаемая должность",
"experience_years": число,
"skills": {"technical": [...], "soft": [...]},
"education": [{"degree": "...", "institution": "...", "year": ...}],
"work_history": [
{"company": "...", "position": "...", "duration": "...", "key_achievements": [...]}
],
"languages": [{"language": "...", "level": "..."}],
"certifications": [...]
}"""},
{"role": "user", "content": resume_text}
],
temperature=0.1
)
return json.loads(response.choices[0].message.content)
Сопоставление кандидата с вакансией
После парсинга AI оценивает, насколько кандидат подходит под конкретную вакансию:
def match_candidate(resume_data: dict, vacancy: dict) -> dict:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """Сопоставь кандидата с вакансией. JSON:
{
"match_score": 0-100,
"matching_skills": ["совпадающие навыки"],
"missing_skills": ["недостающие навыки"],
"overqualified": true/false,
"strengths": ["сильные стороны для этой роли"],
"concerns": ["потенциальные проблемы"],
"recommendation": "strongly_recommend" | "recommend" | "maybe" | "not_recommend",
"interview_questions": ["3 рекомендованных вопроса"]
}
Оценивай объективно, не дискриминируя по полу, возрасту или другим нерелевантным факторам."""},
{"role": "user", "content": (
f"Кандидат:
{json.dumps(resume_data, ensure_ascii=False)}
"
f"Вакансия:
{json.dumps(vacancy, ensure_ascii=False)}"
)}
],
temperature=0.2
)
return json.loads(response.choices[0].message.content)
vacancy = {
"title": "Senior Python Developer",
"requirements": ["Python 3+", "FastAPI", "PostgreSQL", "Docker", "CI/CD"],
"nice_to_have": ["ML", "Go", "Kubernetes"],
"experience": "5+ лет"
}
Ранжирование и отчёт для рекрутера
Для большого потока откликов автоматически ранжируйте кандидатов:
async def rank_candidates(resumes: list[str], vacancy: dict) -> list[dict]:
parsed = []
for resume in resumes:
data = parse_resume(resume)
match = match_candidate(data, vacancy)
parsed.append({**data, **match})
# Сортировка по match_score
ranked = sorted(parsed, key=lambda x: x["match_score"], reverse=True)
# Топ-10 кандидатов для рекрутера
return ranked[:10]
Этика и ограничения AI-скрининга
При внедрении AI в HR критически важно соблюдать этические принципы:
- Прозрачность — информируйте кандидатов об использовании AI в процессе отбора
- Отсутствие дискриминации — явно указывайте в промпте не учитывать пол, возраст, национальность
- Человеческий контроль — AI ранжирует, но решение принимает рекрутер
- Персональные данные — обрабатывайте резюме в соответствии с ФЗ-152
- Право на апелляцию — кандидат должен иметь возможность оспорить решение
Стоимость обработки 100 резюме через ModelSwitch — около $2-5. Для HR-отдела, обрабатывающего 500+ откликов в месяц, это экономит десятки часов рабочего времени рекрутеров. Используйте gpt-4o для точного сопоставления навыков — экономия на модели здесь может привести к пропуску сильных кандидатов.