Робот сверял платежи и нашёл перевод без номера счёта. Он выбрал похожего контрагента и закрыл дебиторку. Бухгалтер обнаружил это при сверке месяца. Агент сэкономил четыре минуты и подарил два дня раскопок.
Workflow с ограниченным выбором
Для back office обычно нужен не свободный агент, а конечный автомат. Код определяет состояния и допустимые переходы; модель извлекает данные и предлагает решение внутри конкретного шага.
RECEIVED -> PARSED -> MATCH_CANDIDATES
-> AUTO_MATCHED | NEEDS_REVIEW
-> POSTED -> VERIFIEDasync def reconcile(payment):
parsed = await extract_payment(payment)
candidates = await invoices.find(amount=parsed.amount,
counterparty=parsed.counterparty)
decision = await rank_matches(parsed, candidates)
if decision.score < 0.98 or decision.margin < 0.10:
return await queue_review(payment, decision)
posting = await ledger.preview(decision.invoice_id, parsed.amount)
await approvals.require(posting, policy="reconciliation")
return await ledger.commit(posting, idempotency_key=payment.id)Порог строят на размеченной истории, а не на слове confidence. Для денег и юридических статусов нужен preview и детерминированная проверка инвариантов. Каждый run имеет лимит шагов, времени и стоимости. Возобновление идёт из сохранённого состояния, поэтому retry не повторяет уже проведённую операцию.
Failure modes
Документ приходит дважды, внешний API отвечает после таймаута, справочник обновляется посреди run, агент зацикливается между двумя инструментами. Ещё хуже тихое изменение политики: вчера расхождение в рубль допускалось, сегодня нет. Версионируйте policy вместе с run и ведите append-only audit log.
Правило: чем дороже действие, тем меньше свободы остаётся модели и тем больше решения принадлежит workflow.
Практикум 51.1
Смоделируйте сверку 200 платежей, включая дубли, частичные суммы и неоднозначных контрагентов. Реализуйте автомат с сохранением состояния и ручной очередью. Убейте worker после внешнего вызова и проверьте восстановление без двойной проводки. Посчитайте precision автоматических решений и время ручной обработки остатка.