Разработка AI-системы классификации и маршрутизации обращений граждан
Поступающие в государственные органы обращения часто направляются не в то подразделение с первого раза — ответственный исполнитель теряет время, заявитель получает отказ «не в нашей компетенции», сроки рассмотрения срываются. AI-классификатор решает задачу маршрутизации с точностью 92–95% на первом направлении.
Многоуровневая классификация
Рубрикаторы государственных органов имеют иерархическую структуру: федеральный рубрикатор, ведомственный, территориальный. Обращение нужно отнести к правильному уровню иерархии и конкретному исполнителю.
class RequestClassification(BaseModel):
federal_rubric: str # рубрика федерального классификатора
department_rubric: str # рубрика ведомственного классификатора
responsible_unit: str # подразделение-ответчик
responsible_officer: str | None # конкретный исполнитель (если однозначно)
territorial_scope: str # федеральный / региональный / муниципальный
subject_area: str # краткая тема для регистрации
requires_field_inspection: bool # нужен ли выезд на место
other_agencies: list[str] # другие ведомства, которых нужно привлечь
confidence: float
def classify_request(text: str, attachments: list) -> RequestClassification:
# Семантический поиск по базе прецедентов
precedents = precedent_db.search(text, top_k=10)
# Мультимодальная классификация при наличии вложений (фото, документы)
if attachments:
attachment_context = analyze_attachments(attachments)
else:
attachment_context = ""
return llm.parse(
build_routing_prompt(text, attachment_context, precedents),
response_format=RequestClassification
)
Обучение классификатора
Основа — исторические данные: тысячи обращений с разметкой «тематика → исполнитель». Проблема: разметка историческая нередко ошибочна (именно потому и нужна автоматизация). Очистка данных критична.
Стратегия обучения:
- Исключить обращения с перенаправлением (признак неправильной первичной маршрутизации)
- Оставить только те, где первый назначенный исполнитель дал окончательный ответ
- Дополнить данными из аналогичных органов (с анонимизацией)
- Active learning: эксперты размечают сложные кейсы, модель обучается итерационно
Метрики качества:
- Accuracy@1: правильное подразделение с первой попытки — цель 92%+
- Accuracy@3: правильное подразделение в топ-3 — цель 99%+
- False routing rate: % обращений перенаправленных повторно — цель < 5%
Территориальная маршрутизация
Обращения по вопросам инфраструктуры (ямы, фонари, мусор) требуют определения территориальной принадлежности объекта:
def extract_and_geolocate(text: str) -> GeoContext:
# Извлечение адресов через NER
addresses = ner_model.extract(text, entity_type="ADDRESS")
located_objects = []
for addr in addresses:
# Геокодирование через Яндекс.Геокодер или Nominatim
coords = geocoder.geocode(addr)
if coords:
# Определение муниципального образования, района
admin_unit = geodata.get_admin_unit(coords)
responsible = routing_matrix.get_responsible(
issue_category=...,
admin_unit=admin_unit
)
located_objects.append(GeoObject(
address=addr,
coords=coords,
responsible_org=responsible
))
return GeoContext(objects=located_objects)
Обработка смешанных обращений
Одно обращение нередко содержит несколько независимых вопросов разной тематики. Система разбивает такие обращения на части:
- «Прошу разобраться с шумными соседями и починить лифт» → два подобращения: участковый + УК
- Каждая часть маршрутизируется отдельно, ответы консолидируются в единый ответ заявителю
- Сроки считаются по максимальному из частей
Дашборд маршрутизации
Руководитель видит в реальном времени: очередь необработанных обращений, распределение нагрузки по исполнителям, обращения с истекающим сроком, топ-10 тематик за период. Цветовая индикация: зелёный (в срок), жёлтый (менее 5 дней), красный (просрочено).
Интеграция с системами документооборота
Поддерживаемые СЭД: ДЕЛО, DIRECTUM, Docsvision, 1С:Документооборот. Система передаёт обращение уже с заполненными карточками регистрации — исполнитель получает не «входящий email», а структурированную задачу с установленным сроком.







