Скрининг 100 резюме за 30 минут: AI-рубрика, которая убирает предвзятость
Что такое rubric-based AI-скрининг резюме?
Rubric-based AI-скрининг резюме — это практика применения формализованной оценочной рубрики к резюме кандидатов с помощью языковых моделей, которая формирует взвешенный числовой скор с обоснованием по каждому критерию для каждого соискателя. Это важно потому, что ручной скрининг деградирует по качеству уже после второго часа работы, даёт несогласованные результаты между разными проверяющими (расхождения в ~30% случаев) и воспроизводит когнитивные искажения на основе бренда работодателя, а не реальной компетентности. С AI 100 резюме обрабатываются за 30 минут при стоимости $62–123 против $320–640 при ручной проверке — улучшение в 5–8 раз.
TL;DR
- -LLM-скрининг по рубрике обрабатывает 100 резюме за 30 минут при суммарных затратах $62–123 против 8 часов и $320–640 при ручной работе — улучшение в 5–8 раз по обоим показателям.
- -Рекрутеры тратят ~7 секунд на первичный просмотр резюме (Ladders, 2018), за которые доминируют эффект ореола, предвзятость подтверждения и аффинити-предвзятость — структурированная рубрика вынуждает оценивать каждый критерий отдельно.
- -Используйте temperature=0.0 для максимальной воспроизводимости: повторный запуск на идентичных данных даёт согласованные результаты в 95%+ случаев, делая процесс аудируемым.
- -Правило 4/5 EEOC применяется к AI-скринингу: если доля прошедших скрининг в одной демогруппе ниже 80% от наиболее успешной группы — это prima facie evidence adverse impact, требующий пересмотра рубрики.
- -EU AI Act (2024) классифицирует AI для найма как high-risk, требуя документирования модели, human oversight, логирования решений и оценки рисков — ваши промпты и рубрики входят в обязательную документацию.
Рекрутер тратит около 7 секунд на первичный просмотр резюме. За это время срабатывают когнитивные искажения: знакомое название компании повышает шансы, пробел в стаже снижает, а имя, указывающее на этническую принадлежность, влияет на вероятность интервью — независимо от квалификации.
Rubric-based скрининг решает обе проблемы одновременно. Формализованная рубрика заставляет оценивать каждого кандидата по одинаковым критериям. LLM автоматизирует применение этой рубрики к сотням резюме. Результат: 100 резюме за 30 минут вместо 12 часов, с воспроизводимой и аудируемой оценкой по каждому кандидату.
Статья описывает полный процесс: от создания рубрики до калибровки модели, с промптами и примерами. Тот же принцип формализации неструктурированных процессов, что и в SOP-генераторе, только применённый к найму.
Почему ручной скрининг ломается на масштабе
Среднее количество откликов на вакансию в tech-компании — от нескольких десятков до нескольких сотен резюме. Senior-позиции в крупных компаниях собирают 500–1000. При 7 секундах на резюме рекрутер физически способен просмотреть 40–50 штук в час. 250 резюме занимают 5–6 часов монотонной работы.
После второго часа качество оценки падает предсказуемо. Исследования decision fatigue показывают: судьи выносят благоприятные решения значительно чаще после перерыва, чем непосредственно перед ним. У рекрутеров эффект аналогичный. Кандидат, попавший в первую двадцатку стопки, получает более внимательный разбор, чем кандидат номер 180.
Inconsistency. Один и тот же рекрутер оценивает одно и то же резюме по-разному в понедельник и в пятницу. Два рекрутера при параллельном скрининге расходятся в оценках примерно в трети случаев. Без формализованных критериев «подходит/не подходит» остаётся интуитивным решением, которое невозможно воспроизвести и трудно обжаловать.
Pattern matching вместо анализа. При быстром сканировании мозг использует эвристики: названия компаний, университеты, длительность работы на предыдущем месте. Эти сигналы коррелируют с социально-экономическим бэкграундом кандидата, а не с его способностью выполнять работу.
Что такое скрининговая рубрика
Рубрика — набор критериев с заранее определёнными уровнями оценки. Каждый критерий измеряет конкретный навык или квалификацию, необходимую для позиции. Каждый уровень описывает, что именно означает «сильный», «средний» или «слабый» результат по этому критерию.
Формат рубрики для скрининга резюме:
| Критерий | Вес | 3 (Strong) | 2 (Adequate) | 1 (Weak) | 0 (Missing) |
|---|---|---|---|---|---|
| Релевантный опыт | 30% | 5+ лет в аналогичной роли | 3–5 лет в смежной роли | 1–3 года в смежной роли | Опыт отсутствует |
| Технический стек | 25% | Владеет всеми ключевыми технологиями | Владеет 70%+ стека | Владеет 40–70% стека | Менее 40% |
| Масштаб проектов | 20% | Работал с системами на 1M+ пользователей | 100K–1M пользователей | До 100K пользователей | Масштаб не указан |
| Лидерство | 15% | Руководил командой 5+ человек | Менторил 1–3 человека | Участвовал в командной работе | Не указано |
| Образование/сертификации | 10% | Профильное образование + сертификации | Профильное образование | Непрофильное образование | Не указано |
Финальный скор = сумма (оценка × вес) по всем критериям. Максимум: 3.0. Порог приглашения на интервью зависит от позиции и рынка, обычно 1.8–2.2.
Три свойства рубрики, которые делают скрининг работающим:
- Специфичность. «Опыт работы с распределёнными системами» вместо «технический опыт». Чем конкретнее критерий, тем меньше пространства для субъективной интерпретации.
- Измеримость. Каждый уровень описан через наблюдаемые факты из резюме, а не через субъективные характеристики. «5+ лет в backend-разработке» вместо «значительный опыт».
- Привязка к работе. Каждый критерий связан с конкретной задачей или ответственностью из описания позиции. Критерий без привязки к работе создаёт adverse impact без предсказательной ценности.
Создание рубрики из описания вакансии
Описание вакансии (job description) содержит требования. Рубрика превращает эти требования в измеримые критерии. LLM ускоряет этот процесс.
Промпт для генерации рубрики
Роль: Эксперт по организационной психологии и структурированному найму.
Задача: Создай скрининговую рубрику для оценки резюме на основе описания вакансии.
Описание вакансии:
"""
{вставить текст вакансии}
"""
Требования к рубрике:
1. Выдели 5–7 критериев из описания вакансии. Каждый критерий
должен быть привязан к конкретной обязанности или требованию.
2. Назначь вес каждому критерию (в сумме 100%).
Must-have требования получают больший вес.
3. Для каждого критерия опиши 4 уровня оценки (0–3) через
наблюдаемые факты в резюме. Никаких субъективных характеристик.
4. Добавь столбец "Что искать в резюме" — конкретные ключевые
слова, паттерны, секции.
Ограничения:
- НЕ включай критерии, не связанные с работой
(возраст, пол, университет как самостоятельный критерий)
- НЕ используй "культурный фит" как критерий
- Образование включай только если это законодательное требование
или прямое требование позиции
Формат: markdown-таблица с колонками
[Критерий | Вес | 3 (Strong) | 2 (Adequate) | 1 (Weak) | 0 (Missing) | Что искать]
Калибровка рубрики
Сгенерированная рубрика требует ручной калибровки. Процесс:
- Тест на 10 резюме. Возьми 10 резюме из предыдущего найма на аналогичную позицию (5 принятых, 5 отклонённых). Примени рубрику. Если рубрика расходится с фактическим решением — пересмотри критерии или веса.
- Проверка на adverse impact. Убедись, что ни один критерий не создаёт системное преимущество для определённой демографической группы. Пример: требование «опыт в FAANG» фильтрует по бренду работодателя, а не по компетенции. Замени на «опыт работы с высоконагруженными системами (1M+ запросов/день)».
- Согласование с hiring manager. Рубрика отражает реальные требования позиции, а не wishlist. Hiring manager валидирует веса критериев и пороговые значения.
AI-скрининг: архитектура процесса
Полный pipeline от получения резюме до шорт-листа:
Резюме (PDF/DOCX)
│
▼
Парсинг → структурированный текст
│
▼
Анонимизация → удаление имён, фото, возраста, адресов
│
▼
LLM-оценка по рубрике → скор + обоснование по каждому критерию
│
▼
Ранжирование → отсортированный список
│
▼
Ручная проверка топ-N → шорт-лист
Шаг 1: Парсинг резюме
Резюме приходят в разных форматах. Минимальный набор инструментов:
- PDF → текст: PyMuPDF (fitz), pdfplumber
- DOCX → текст: python-docx
- Изображения: OCR через Tesseract или API (Google Vision, AWS Textract)
Результат парсинга — plain text каждого резюме. Не нужно извлекать структурированные данные (имя, опыт, навыки) отдельно. LLM справляется с неструктурированным текстом лучше, чем regex-парсеры.
Шаг 2: Анонимизация
Анонимизация убирает информацию, нерелевантную для оценки квалификации, и снижает риск предвзятости. Минимальный набор:
- Имя и фамилия →
CANDIDATE_001 - Фотография → удалить
- Дата рождения / возраст → удалить
- Домашний адрес → удалить (город можно оставить, если локация критична)
- Названия школ/университетов → опционально (заменить на «Университет [ранг]» или оставить)
Промпт для анонимизации через LLM:
Задача: Анонимизируй резюме. Замени персональные данные, сохрани
профессиональную информацию.
Замени:
- Имя и фамилию → "CANDIDATE_ID"
- Email → "email@redacted"
- Телефон → "redacted"
- Домашний адрес → город/страна (если указаны)
- Фото → убрать упоминание
Сохрани без изменений:
- Названия компаний
- Должности
- Описания проектов
- Технологии и навыки
- Даты работы
- Образование (название вуза и специальность)
Верни анонимизированное резюме.
Для компаний с требованиями compliance (GDPR, EEOC) анонимизацию лучше делать до передачи текста в LLM. Это означает локальную обработку через NER (spaCy, Presidio) вместо LLM-вызова.
Шаг 3: Оценка по рубрике
Основной промпт для скрининга. Каждое резюме оценивается отдельным вызовом.
Роль: Оценщик резюме. Применяешь скрининговую рубрику строго
по заданным критериям. Оцениваешь только то, что явно указано
в резюме. Не делаешь предположений.
Рубрика:
"""
{вставить рубрику из предыдущего шага}
"""
Резюме кандидата:
"""
{вставить анонимизированное резюме}
"""
Инструкции:
1. Оцени кандидата по каждому критерию рубрики (0–3).
2. Для каждой оценки приведи конкретную цитату или факт
из резюме, обосновывающий оценку.
3. Если информация по критерию отсутствует — ставь 0 (Missing),
НЕ делай допущений.
4. Рассчитай взвешенный итоговый скор.
5. НЕ учитывай при оценке: пол, возраст, этническую
принадлежность, название университета (кроме случаев,
когда образование является критерием рубрики), пробелы
в стаже без контекста.
Формат ответа (JSON):
{
"candidate_id": "CANDIDATE_001",
"criteria_scores": [
{
"criterion": "Название критерия",
"score": 2,
"weight": 0.30,
"evidence": "Цитата или факт из резюме",
"weighted_score": 0.60
}
],
"total_score": 2.15,
"recommendation": "ADVANCE | MAYBE | REJECT",
"summary": "Одно предложение о сильных и слабых сторонах"
}
Structured output (JSON mode) снижает постобработку. Claude, GPT-5.4 и Gemini поддерживают JSON-ответы через system prompt или API-параметры.
Шаг 4: Пакетная обработка
100 резюме = 100 API-вызовов. При среднем времени ответа 3–5 секунд последовательная обработка занимает 5–8 минут. Параллельная обработка (10–20 concurrent requests) сокращает время до 30–60 секунд.
import asyncio
import json
from pathlib import Path
async def score_resume(client, rubric: str, resume_text: str, candidate_id: str) -> dict:
"""Оценивает одно резюме по рубрике."""
prompt = SCORING_PROMPT.format(rubric=rubric, resume=resume_text)
response = await client.chat.completions.create(
model="gpt-5.4",
messages=[
{"role": "system", "content": "Respond in JSON only."},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"},
temperature=0.0 # детерминированность
)
result = json.loads(response.choices[0].message.content)
result["candidate_id"] = candidate_id
return result
async def batch_screen(resumes: list[dict], rubric: str, concurrency: int = 15):
"""Параллельный скрининг пачки резюме."""
semaphore = asyncio.Semaphore(concurrency)
async def limited_score(client, rubric, resume, cid):
async with semaphore:
return await score_resume(client, rubric, resume, cid)
tasks = [
limited_score(client, rubric, r["text"], r["id"])
for r in resumes
]
results = await asyncio.gather(*tasks)
return sorted(results, key=lambda x: x["total_score"], reverse=True)
Temperature = 0.0 даёт максимальную воспроизводимость. При повторном запуске на тех же данных результаты совпадают в 95%+ случаев (не 100% из-за особенностей sampling даже при temperature=0).
Шаг 5: Ранжирование и категоризация
После оценки кандидаты делятся на три группы:
- ADVANCE (скор >= 2.2): Приглашение на следующий этап. Автоматически.
- MAYBE (скор 1.6–2.1): Ручной пересмотр рекрутером. Обычно 15–25% кандидатов.
- REJECT (скор < 1.6): Отклонение с обоснованием. Автоматически.
Пороговые значения калибруются по историческим данным и текущему состоянию рынка. На рынке работодателя (много кандидатов) порог повышается. На рынке кандидатов — снижается.
Bias mitigation: как AI-скрининг снижает предвзятость
AI-скрининг не устраняет bias полностью. Он снижает определённые типы предвзятости и создаёт новые риски. Понимание обоих сторон обязательно.
Типы bias, которые рубрика снижает
Halo effect. Впечатление от одного сильного атрибута (компания-бренд, престижный университет) распространяется на всю оценку. Рубрика заставляет оценивать каждый критерий независимо. Кандидат из Google получает высокий балл по «масштаб проектов», но низкий по «лидерство», если руководящего опыта нет.
Confirmation bias. Рекрутер формирует впечатление за первые секунды и дальше ищет подтверждение. LLM обрабатывает резюме целиком, без «первого впечатления».
Affinity bias. Склонность выбирать кандидатов, похожих на себя (тот же университет, хобби, бэкграунд). Анонимизация + формализованные критерии минимизируют этот эффект.
Fatigue bias. 200-е резюме оценивается с тем же вниманием, что и первое. LLM не устаёт.
Типы bias, которые AI может усилить
Training data bias. Если модель обучена на данных, где определённые формулировки ассоциируются с успешными кандидатами, она воспроизводит этот паттерн. Mitigation: строгая рубрика с конкретными критериями, а не open-ended оценка «подходит/не подходит».
Proxy discrimination. «Опыт работы в компаниях из Fortune 500» коррелирует с доступом к определённым образовательным и социальным сетям. Mitigation: формулировать критерии через компетенции, а не через proxy-атрибуты.
Language bias. Резюме, написанные нестандартным английским (non-native speakers), могут получать заниженные оценки. Mitigation: в промпте явно указать «оценивай содержание, не стиль написания».
Чеклист bias mitigation
Перед запуском скрининга проверь:
- Рубрика содержит только job-related критерии
- Нет критериев-proxy (бренд работодателя, рейтинг университета)
- Анонимизация убирает имена, фото, возраст
- Промпт содержит явную инструкцию игнорировать нерелевантные факторы
- Temperature = 0 для воспроизводимости
- Группа MAYBE проходит ручной пересмотр
- Результаты логируются для аудита
- Adverse impact ratio отслеживается (4/5 rule EEOC)
Пример: скрининг на позицию Senior Backend Engineer
Вакансия требует: Go/Python, распределённые системы, Kubernetes, опыт 5+ лет, опыт менторства.
Сгенерированная рубрика
| Критерий | Вес | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|
| Backend-разработка на Go или Python | 25% | 5+ лет Go/Python, основной стек | 3–5 лет, один из языков | 1–3 года, начальный уровень | Нет опыта |
| Распределённые системы | 25% | Проектировал распределённые системы, упоминает конкретные паттерны (CQRS, event sourcing, saga) | Работал с микросервисами в продакшне | Теоретические знания, пет-проекты | Не упомянуто |
| Kubernetes и инфраструктура | 20% | Настраивал кластеры, писал операторы, helm charts | Деплоил сервисы в K8s, работал с CI/CD | Базовое понимание контейнеров | Не упомянуто |
| Масштаб и производительность | 15% | Системы на 1M+ RPS, описаны конкретные оптимизации | 100K+ RPS, есть метрики | Упоминает производительность без цифр | Не упомянуто |
| Менторство и лидерство | 15% | Руководил командой 3+, менторил junior/middle | Менторил 1–2 человека, проводил code review | Участвовал в парном программировании | Не упомянуто |
Результат оценки (пример)
{
"candidate_id": "CANDIDATE_042",
"criteria_scores": [
{
"criterion": "Backend-разработка на Go или Python",
"score": 3,
"weight": 0.25,
"evidence": "7 лет разработки на Go. Текущая позиция: Staff Engineer, backend на Go. Предыдущая: 3 года Python.",
"weighted_score": 0.75
},
{
"criterion": "Распределённые системы",
"score": 2,
"weight": 0.25,
"evidence": "Работал с микросервисной архитектурой, упоминает gRPC и Kafka. Конкретные паттерны не описаны.",
"weighted_score": 0.50
},
{
"criterion": "Kubernetes и инфраструктура",
"score": 3,
"weight": 0.20,
"evidence": "Разработал Helm charts для 15 сервисов. Настраивал HPA и PDB. Опыт с ArgoCD.",
"weighted_score": 0.60
},
{
"criterion": "Масштаб и производительность",
"score": 2,
"weight": 0.15,
"evidence": "Упоминает 500K DAU, но конкретные RPS и оптимизации не описаны.",
"weighted_score": 0.30
},
{
"criterion": "Менторство и лидерство",
"score": 2,
"weight": 0.15,
"evidence": "Менторил 2 junior-разработчиков. Проводил архитектурные ревью.",
"weighted_score": 0.30
}
],
"total_score": 2.45,
"recommendation": "ADVANCE",
"summary": "Сильный backend-инженер с глубоким опытом Go и Kubernetes. Распределённые системы и масштаб описаны недостаточно детально, стоит уточнить на интервью."
}
Скор 2.45 из 3.0. Кандидат проходит в шорт-лист. Обоснование по каждому критерию сохраняется для аудита и передаётся интервьюеру для подготовки вопросов.
Валидация и контроль качества
AI-скрининг требует постоянной валидации. Три механизма.
Inter-rater reliability
Пропусти 20 случайных резюме через двух рекрутеров и LLM. Рассчитай Cohen’s Kappa для каждой пары (LLM vs рекрутер 1, LLM vs рекрутер 2, рекрутер 1 vs рекрутер 2). Kappa >= 0.6 означает substantial agreement. Ниже 0.6 — рубрика нуждается в доработке.
Adverse impact analysis
Правило 4/5 (EEOC): если доля кандидатов, прошедших скрининг, в одной демографической группе составляет менее 80% от доли в наиболее успешной группе, существует prima facie evidence of adverse impact.
Пример: 60% мужчин-кандидатов проходят скрининг, 40% женщин. Ratio = 40/60 = 0.67. Это ниже 0.80 — сигнал пересмотреть критерии.
Отслеживание возможно только при наличии демографических данных (обычно собираются добровольно и анализируются агрегированно, не на уровне отдельного решения).
A/B тестирование
Разделить входящие резюме на две группы: AI-скрининг и ручной скрининг. Сравнить качество финальных наймов через 6–12 месяцев (performance reviews, retention rate). Это единственный способ измерить реальную предсказательную валидность.
Стоимость и ROI скрининга 100 резюме
Ручной скрининг:
- Время рекрутера: 100 × 5 мин = ~8 часов
- Стоимость часа рекрутера: $40–80
- Итого: $320–640
AI-скрининг:
- API-вызовы (GPT-5.4, ~2K токенов на резюме): 100 × ~$0.02 = ~$2
- Парсинг и анонимизация: ~$0.50
- Ручная проверка MAYBE-группы (20 резюме × 5 мин): ~1.5 часа = $60–120
- Итого: $62–123
Разница: 5–8x по стоимости, 4–6x по времени. При 10 открытых вакансиях одновременно экономия составляет 60–80 часов рекрутера в месяц. ROI растёт с масштабом: для компании, нанимающей 50+ человек в год, автоматизация скрининга окупается за первый месяц.
Юридические аспекты
EU AI Act (2024). AI-системы для найма классифицируются как high-risk. Требования: документирование модели, human oversight, логирование решений, оценка рисков. Промпты и рубрики — часть обязательной документации.
NYC Local Law 144 (2023). Automated Employment Decision Tools (AEDT) в Нью-Йорке требуют ежегодного bias audit от независимой аудиторской фирмы. Аудит анализирует scoring rate и impact ratio по расе/этничности и полу.
EEOC Guidelines. Uniform Guidelines on Employee Selection Procedures (1978) применяются к любым инструментам отбора, включая AI. Критерий: job-relatedness и business necessity каждого используемого критерия.
Практический минимум для compliance:
- Логируй каждое решение (input, output, scoring, recommendation)
- Обеспечь human-in-the-loop для финального решения
- Проводи adverse impact analysis ежеквартально
- Документируй рубрику, промпты и процесс калибровки
Внедрение за один день
Минимальный working pipeline без инфраструктурных инвестиций:
-
Утро: рубрика. Возьми описание текущей открытой вакансии. Сгенерируй рубрику через промпт из этой статьи. Откалибруй на 5 резюме из прошлого найма. Согласуй с hiring manager.
-
Обед: пайплайн. Python-скрипт из 100 строк: чтение PDF, анонимизация, вызов API, запись результатов в CSV. Или проще: Google Sheet + Apps Script + API-вызовы.
-
Вечер: прогон. Обработай текущую стопку резюме. Проверь MAYBE-группу вручную. Сравни результаты с интуитивной оценкой. Скорректируй пороги.
Инвестиция: 4–6 часов на первый запуск. Каждый последующий найм с той же рубрикой занимает 30 минут на 100 резюме.
Чего AI-скрининг не заменяет
Structured interviews. Скрининг резюме оценивает заявленный опыт. Интервью проверяет реальные навыки. По данным исследований в области психологии персонала, предсказательная валидность структурированного интервью (r≈0.51) выше, чем скрининга резюме (r≈0.18).
Work sample tests. Кандидат с идеальным резюме может не справиться с реальной задачей. Take-home assignments и live coding сессии дают данные, которых нет в резюме.
Reference checks. Резюме отражает точку зрения кандидата. Рекомендатели добавляют перспективу работодателя.
AI-скрининг занимает своё место в воронке: убирает шум на входе, чтобы рекрутер и hiring manager фокусировали время на кандидатах, которые с высокой вероятностью подходят.
Нужна помощь с автоматизацией HR-процессов? Я помогаю стартапам внедрять AI-решения и строить продукты — belov.works.
FAQ
Какой показатель Cohen’s Kappa нужен между LLM и рекрутерами, чтобы система считалась надёжной?
Целевой показатель — Kappa ≥ 0.61 (substantial agreement по шкале Landis & Koch). На практике при первом запуске новые рубрики обычно дают 0.45–0.55 — это означает, что критерии рубрики ещё недостаточно чёткие, а не то, что AI работает некорректно. Разберите MAYBE-группу вместе с рекрутером, определите расхождения и уточняйте описания критериев, пока Kappa не достигнет 0.61+. После этого рекалибровка нужна только при значительном изменении требований к позиции.
Как обрабатывать пробелы в стаже в AI-скрининге, чтобы не штрафовать за декретный отпуск, болезнь или потерю работы по экономическим причинам?
Добавьте явную инструкцию в промпт для скоринга: «Пробелы в стаже без контекстного объяснения оценивать как 0 (Missing) по критерию “Релевантный опыт”, а не как отрицательное свидетельство». Это предотвращает интерпретацию модели об отсутствии данных как негативного сигнала. Для MAYBE-группы (ручная проверка) обучите рекрутеров задавать нейтральный вопрос о пробеле, а не рассматривать его как красный флаг. Пробелы в стаже встречаются во всех демографических группах и практически не предсказывают эффективность на работе.
Законно ли использовать AI-скрининг для кандидатов из ЕС в соответствии с GDPR?
Статья 22 GDPR даёт кандидатам право не подвергаться исключительно автоматизированным решениям, существенно влияющим на них, включая найм. Практическое решение: сохранить человека в цепочке принятия финального решения (что также является лучшей практикой). Анонимизируйте резюме до передачи в LLM API для минимизации обработки персональных данных. При использовании облачного LLM-провайдера убедитесь в наличии DPA и что данные не покидают ЕС без соответствующего правового механизма. Документируйте рубрику, промпты и процесс калибровки в Записях о деятельности по обработке данных (ROPA).