Виклик
Цифри були замкнені в сотнях сторінок тексту.
10-K — це текстовий документ, у якому є таблиці. Фінансова звітність лежить десь посередині сотень сторінок, і кожна компанія оформлює її по-своєму: інший порядок розділів, інші назви для тієї самої статті, інша структура таблиць, виноски, які змінюють значення показника.
Тож робота лягала на людину: відкрити звіт, знайти в ньому звітність і перенести цифри в таблицю — звіт за звітом. Це повільно, це обмежувало швидкість самого сервісу, і кожен ручний крок — це шанс поставити число не в той рядок. Саме така помилка доживає аж до висновку користувача, бо правдоподібну цифру ніхто не передивляється.
Планку клієнт поставив свідомо незручну: витяг мав триматися на всіх пʼяти типах звітів, а не лише на звіті про прибутки та збитки. Інакше його користувачеві все одно доводиться відкривати документ — а отже, сервіс ручний крок не прибрав, а лише пересунув.
Рішення
Конвеєр витягу, побудований навколо змісту звітності.
Ми побудували систему, яка читає звіт від початку до кінця, знаходить у ньому фінансову звітність, визначає, який саме це з пʼяти типів, і витягує показники в узгоджену структуру — однакову для будь-якої компанії, незалежно від того, як саме вона вирішила подати свою звітність.
Найважчим був макет — тому система на нього й не спирається. Вона виходить із того, чим є стаття звітності, а не де вона розташована на сторінці. Саме це дозволяє одному конвеєру обробляти звіти емітентів, які не мають спільного шаблону. На виході працює валідація: суми, що не сходяться, і показники, які суперечать один одному, підсвічуються, а не експортуються мовчки.
Останній крок навмисно не ефектний. Результат приходить книгою Excel у тій структурі, у якій уже працюють користувачі клієнта, тож він вбудовується в наявні моделі, а не змушує когось переходити на новий інструмент. Усередині це Python із сервісом на FastAPI та шаром розбору PDF — але цікава інженерія тут у розпізнаванні звітності, а не в стеку.
Пʼять типів звітів, які покриває конвеєр
- Звіт про прибутки та збитки
- Баланс
- Звіт про рух грошових коштів
- Звіт про власний капітал
- Звіт про сукупний дохід
Результат
До 98% точності витягу по всіх пʼяти типах звітів.
Точність вимірювали на звітах, перевірених вручну, і вона трималася на всіх пʼяти типах, а не лише на тому, який найлегше розібрати. Саме це й було головним: покриття без слабкого місця — бо слабке місце й повертає користувача назад у PDF.
Результат одразу лягав у той табличний формат, яким користувачі клієнта вже користувались, тож витяг перестав бути кроком, який хтось виконує: на момент, коли користувач відкривав дані, він уже стався. Ручне перенесення цифр — і помилки, які йшли разом із ним — пішли із сервісу.
Ми свідомо публікуємо цифру як «до 98%». Точність витягу залежить від вихідних документів, і нам краще назвати число, за яке ми відповімо на новому наборі звітів, ніж таке, що описує лише вдалий день.