Credit Report Assistant — документация
AI-агент для автоматической подготовки первичного черновика кредитных заключений по корпоративному клиенту: Limit Application и Risk Opinion для Кредитного комитета. Рекомендованный контрольный чек-лист используется как методическое руководство — агент сверяет по нему полноту заключения, но не заполняет его.
Обзор
Аналитик загружает пакет due-diligence документов по клиенту (общая информация, финансы, налоги, лицензии, госзакупки, оценка рисков). Агент распознаёт содержимое, извлекает структурированные показатели и заполняет соответствующие поля DOCX-шаблонов. Каждое значение сопровождается ссылкой на первоисточник (файл + страница).
Проблема
- Подготовка пакета документов на Кредитный комитет по одному клиенту занимает 1–3 дня ручной работы.
- Одни и те же поля (реквизиты, финпоказатели, акционеры) переписываются из разных PDF в несколько шаблонов.
- Легко пропустить рисковый сигнал — налоговую задолженность, отозванную лицензию, снижение рейтинга — если читать документы по отдельности.
- Формат ответов у разных аналитиков отличается, что усложняет сопоставление решений Кредкома.
Цели
| Метрика | Цель |
|---|---|
| Время подготовки черновика пакета | < 5 минут |
| Доля полей, заполненных автоматически | ≥ 80% |
| Корректность заполненных значений | ≥ 95% |
| Пропуск рисковых флагов (false negative) | < 2% |
Шаблон: Limit Application
Заявка на кредитный лимит. Основные секции:
- Идентификация клиента/группы (Client ID, TIN, отрасль).
- Запрос: сумма, валюта, назначение, срок.
- Финансовые показатели: Total Revenues, Total Assets, EBITDA, Equity Ratio, NFD/EBITDA, Liquidity Ratio.
- Рейтинг клиента (внутренний, S&P/Moody’s/Fitch).
- Коллатераль и её покрытие.
- Структура существующих и предлагаемых лимитов.
Шаблон: Risk Opinion (Appendix)
Заключение для Кредитного комитета. Содержит:
- Summary of client relationship: история отношений, основные продукты, обслуживающие банки.
- Акционеры и бенефициары, UBO.
- Внешний аудит, качество отчётности.
- ESG Due Diligence, compliance risk, CRS, forbearance.
- Анализ отрасли, позиции клиента на рынке.
Чек-лист как методическое руководство
рекомендованный_чек.docx — это не шаблон на заполнение, а методический документ: какие пункты обязательно должны быть раскрыты в заключении для Кредитного комитета. Агент использует его на этапе проверки:
- Резюме по верификации клиента раскрыто.
- Предыдущие решения Кредкома за последние 12 месяцев перечислены.
- Особые условия предыдущих решений и статус их выполнения указаны.
- Признаки stress-сигналов по клиенту отражены.
TODO: требуется описание (см. чек-лист, п. N).Пайплайн: приём документов
Набор документов клиента (PDF, DOCX, XLSX, сканы, произвольное количество) загружается на /files. Агент определяет тип каждого файла по имени и содержимому (общая информация, финансы, налоги, лицензии, госзакупки, риски, прочие) и маршрутизирует в профильный экстрактор.
Пайплайн: извлечение данных
- PDF с текстовым слоем, DOCX, XLSX — прямое чтение структурированного контента.
- Сканированные PDF и изображения — OCR (tesseract + post-processing), детекция таблиц.
- XLSX — парсинг листов и именованных диапазонов, нормализация чисел и валют.
- Финансовые таблицы — извлечение в табличную структуру с нормализацией валют.
- Реквизиты и рейтинги — regex + LLM-валидация.
- Риск-сигналы (налоговая задолженность, отзыв лицензии, санкции) — отдельные правила.
Пайплайн: заполнение шаблона
Шаблон DOCX размечен плейсхолдерами вида {{client.name}}, {{finance.ebitda}}. Агент подставляет значения, сохраняя форматирование. Незаполненные поля остаются плейсхолдерами с префиксом TODO: и пометкой «требуется ручная проверка».
{{client.tin}} → 308255174
{{finance.ebitda.uzs}} → 184 562 300 000
{{risk.tax_overdue}} → нет (по состоянию на 14.04.2026)
{{rating.internal}} → TODO: отсутствует в DD-пакете
Пайплайн: проверка аналитиком
Готовый DOCX открывается аналитиком; каждое заполненное поле имеет комментарий со ссылкой на источник (имя файла, номер страницы, выдержка). Правки аналитика сохраняются и используются для улучшения маппинга.
Маппинг полей
Маппинг описан в mappings/<template>.yaml. Формат:
- field: client.tin
source: document_type=общая_информация
extractor: regex
pattern: "ИНН\\s+(\\d{9,12})"
- field: finance.ebitda.uzs
source: document_type=финансы, section=отчёт_о_прибылях
extractor: table_cell
locator: {row: "EBITDA", col: "Отчётный период"}
unit: UZS
Как добавить новый шаблон
- Разметить DOCX плейсхолдерами
{{...}}. - Создать
mappings/<template>.yamlс описанием полей и источников. - Прогнать на 3–5 эталонных клиентах, зафиксировать целевые значения.
- Включить шаблон во фронт после прохождения smoke-теста.
API
Минимальный набор эндпоинтов:
| Метод | Путь | Назначение |
|---|---|---|
| POST | /api/access | Загрузка документа клиента (base64) |
| POST | /api/jobs | Запуск заполнения шаблона по пакету документов |
| GET | /api/jobs/{id} | Статус и ссылка на готовый DOCX |
| GET | /files | Список загруженных файлов |
Сервисы и изоляция
На одном домене работают два независимых сервиса. Они разделены по URL, портам, базам данных, каталогам хранения и Linux-пользователям. Компрометация одного не должна давать доступ к данным другого.
| Сервис | URL | Порт | Данные | Пользователь |
|---|---|---|---|---|
| filedrop — общий файловый drop | /files, /api/* | 127.0.0.1:8000 | /var/lib/filedrop/ | filedrop |
| cra — Credit Report Assistant | /app/* | 127.0.0.1:8001 | /var/lib/cra/ | cra |
Единственная общая точка — nginx на портах 443/80, который терминирует TLS и маршрутизирует запросы по URL-префиксам. Сам nginx файлами сервисов не владеет.
Системные пользователи
Каждый сервис запускается от отдельного непривилегированного Linux-пользователя. Это базовая изоляция процесса: даже если в коде сервиса найдётся уязвимость (path traversal, command injection), атакующий получит права только этого пользователя — он не сможет читать или менять данные соседнего сервиса.
filedrop— системный аккаунт без shell, владеет/var/lib/filedrop/(загруженные файлы) и имеет право читать/etc/filedrop.token. Больше ему ничего не нужно.cra— системный аккаунт без shell, владеет/var/lib/cra/(SQLite-базаcra.dbи каталоги задачtasks/<id>/) и читает/etc/cra/env(секреты сессии, TOTP, пароль администратора).www-data— пользователь nginx. Обращается к сервисам только по loopback-сокету, прямого доступа к их файлам не имеет.root— только для администрирования хоста. Сервисы от root не запускаются.
useradd --system --no-create-home --shell /usr/sbin/nologin): у них нет домашней папки, нет пароля, нет возможности залогиниться по SSH. Это обычный приём для служебных пользователей.Hardening systemd
Поверх разделения пользователей оба unit-файла используют sandbox-опции systemd. Это ограничивает возможности процесса даже внутри прав своего пользователя.
| Опция | Что даёт |
|---|---|
User=, Group= | Запуск от выделенного непривилегированного аккаунта. |
NoNewPrivileges=yes | Процесс и его дети не могут получить новые привилегии (setuid-бинарники обезврежены). |
ProtectSystem=strict | /, /usr, /boot, /etc монтируются только для чтения. |
ProtectHome=yes | Домашние каталоги пользователей недоступны сервису. |
PrivateTmp=yes | Собственный /tmp и /var/tmp; другие процессы и сервисы их не видят. |
ReadWritePaths= | Явный белый список каталогов, куда сервис может писать (только свой data-dir). |
CapabilityBoundingSet= | Пустой набор Linux-capabilities: сервис не может биндить привилегированные порты, менять владельца файлов и т.п. |
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX | Разрешены только обычные сети и unix-сокеты; никакого AF_NETLINK/AF_PACKET. |
Проверить применённые опции можно командой systemd-analyze security cra — она выводит оценку и список предупреждений.
Безопасность
- DD-документы не выходят за контур; LLM-вызовы — через внутренний шлюз без логирования в третьих сторонах.
- Персональные данные и банковская тайна маскируются до отправки промпта (шаблоны уже помечены
_masked_runsafe). - Доступ к пакету клиента ограничен ответственным аналитиком и его руководителем.
- Полный журнал: кто загрузил, какие документы, какие поля заполнены, какие значения изменены.
Ограничения
- Агент не принимает кредитных решений. Заключение и подпись — всегда человек.
- Качество зависит от качества DD-пакета: нечитаемые сканы и отсутствующие разделы снижают долю авто-заполнения.
- Нестандартные сделки (проектное финансирование, синдикация) могут требовать расширенного маппинга.
FAQ
Заменит ли агент аналитика? Нет. Он снимает рутину заполнения форм; суждение и ответственность остаются за аналитиком.
Что с аудитом? Каждое поле имеет ссылку на источник и автора последней правки. Журнал выгружается в стандартном формате.
Как быть с полями, которых нет в DD-пакете? Агент помечает их TODO: и не заполняет «из головы» — это принципиальная позиция.