Как превратить микро-скрипт для автоматизации в коммерческий продукт: библиотеки, чистый ООП и немного C++ для скорости

Всем привет! Снова отыскала интересную статью на Medium, интересно услышать ваше мнение :-)

Я создал этот инструмент, потому что устал от одних и тех же скучных кликов каждую неделю. Мне нужен был инструмент, который: отслеживает папку, извлекает данные из PDF, обогащает их, отправляет отчеты и, в идеале, позволяет выставлять кому-то счет за сэкономленное время. Два выходных, несколько библиотек и пачка кофе – и у меня был продукт, за который люди действительно платили.

Ниже я покажу точный технологический стек, архитектуру, методы монетизации и паттерны кода, которые я использовал. Вас ждет практический код, ООП-структура и один небольшой трюк с C++, когда чистого Python уже не хватало.

1. Выбирайте маленькую, но болезненную задачу

Большинство проектов по автоматизации умирают, потому что пытаются решить слишком много. Вместо этого выберите одну повторяющуюся «боль» с измеримым ROI. Моя проблема была такой:

  1. Клиент ежедневно присылает счета (инвойсы) в виде разрозненных PDF.

  2. Я вручную открываю их, извлекаю поставщика, дату, сумму и заношу в Google Sheet.

  3. Трата: ≈ 20 минут в день, или ≈ 6 часов в месяц.

  4. Цель: Свести это к нулю человеко-минут и предложить как платную услугу.

2. Быстрый MVP: Наблюдатель за файлами + PDF-экстрактор

Начните с малого: отслеживайте папку, обнаруживайте новый PDF, извлекайте текст. Используем watchdog и PyMuPDF (fitz).

pip install watchdog pymupdf

# file_watcher.py
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import fitz # pymupdf

class PDFHandler(FileSystemEventHandler):
    """Обработчик событий файловой системы."""
    def on_created(self, event):
        if event.src_path.lower().endswith(".pdf"):
            print(f"[+] Новый PDF: {event.src_path}")
            text = extract_text(event.src_path)
            print(text[:200], "...\n") # быстрый превью

def extract_text(path: str) -> str:
    """Извлечение текстового слоя из PDF."""
    doc = fitz.open(path)
    pages = [page.get_text() for page in doc]
    doc.close()
    return "\n".join(pages)

if __name__ == "__main__":
    observer = Observer()
    handler = PDFHandler()
    # Следим за папкой 'inbox'
    observer.schedule(handler, path="./inbox", recursive=False) 
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Этот единственный скрипт сократил мою ежедневную работу до 5 минут – в основном на проверку

3. Повышаем отказоустойчивость: OCR + текстовый фолбэк

Некоторые PDF – это просто сканированные изображения. Добавим фолбэк с помощью pytesseract.

pip install pytesseract pillow
# Внимание: tesseract должен быть установлен в системе (apt / brew / choco)
from PIL import Image
import pytesseract
import fitz

def extract_text_with_ocr(path: str) -> str:
    """Извлечение текста: сначала текстовый слой, затем OCR для сканов."""
    doc = fitz.open(path)
    aggregated = []
    for page in doc:
        text = page.get_text()
        if text.strip():
            # Если есть текстовый слой, используем его
            aggregated.append(text) 
        else:
            # Иначе делаем скриншот страницы и прогоняем через Tesseract
            pix = page.get_pixmap(dpi=200)
            img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
            aggregated.append(pytesseract.image_to_string(img))
    doc.close()
    return "\n".join(aggregated)

Такой гибридный подход (текстовый слой → OCR) сделал инструмент надежным для 95% входящих счетов.

4. Архитектура: ООП для модульности (Пайплайн)

Если вы хотите превратить это в продукт, пайплайн должен быть модульным. Каждый шаг – это класс: Loader → Parser → Enricher → Sink. Это позволяет легко менять хранилище (Google Sheets, СУБД, вебхук) без переписывания логики.

# pipeline.py
from abc import ABC, abstractmethod
from typing import Dict

class Step(ABC):
    """Абстрактный класс для шага обработки."""
    @abstractmethod
    def run(self, data: Dict) -> Dict:
        pass

class Loader(Step):
    """Загружает данные (извлекает текст)."""
    def __init__(self, path): self.path = path
    def run(self, data):
        data['text'] = extract_text_with_ocr(self.path)
        return data

class Parser(Step):
    """Извлекает ключевые поля (сумма, дата, поставщик)."""
    def run(self, data):
        text = data['text']
        # Здесь будет реальная логика парсинга (regex/NLP)
        data['vendor'] = find_vendor(text)
        data['amount'] = find_amount(text) 
        return data

class Sink(Step):
    """Выгружает данные в целевую систему (например, Google Sheets)."""
    def run(self, data):
        push_to_google_sheet(data)
        return data

class Pipeline:
    """Сборщик и исполнитель пайплайна."""
    def __init__(self, steps: list[Step]):
        self.steps = steps
    def execute(self, initial: Dict):
        data = initial
        for step in self.steps:
            data = step.run(data)
        return data

Этот паттерн масштабируем: легко добавить ClassifierStep для определения языка или TranslatorStep для неанглоязычных документов.

5. Извлечение и обогащение: Regex, а затем ML

Начинайте с детерминированного парсинга (regex). Если счета сложные, переходите к ML-моделям (например, spacy или layout-parser). Пример для извлечения суммы:

import re

# Регулярное выражение для поиска сумм с валютой (USD/EUR/$, с запятыми/точками)
AMOUNT_RE = re.compile(r"(?<!\d)(?:USD|EUR|\$)?\s?([\d]{1,3}(?:,\d{3})*(?:\.\d{2})?)\b")

def find_amount(text: str) -> float | None:
    text = text.replace("\n", " ")
    m = AMOUNT_RE.search(text)
    if m:
        # Удаляем разделители тысяч, чтобы коррект��о преобразовать в float
        s = m.group(1).replace(',', '') 
        return float(s)
    return None

Для повышения надежности используйте spacy + кастомный NER или библиотеки вроде layout-parser для пространственного обнаружения полей.

6. Веб-автоматизация: Playwright для загрузки

Если счета находятся за веб-дашбордами, автоматизируйте их загрузку с помощью Playwright.

pip install playwright
playwright install
from playwright.sync_api import sync_playwright

def login_and_download(url, user, password, download_path):
    """Автоматически логинится и скачивает файл."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        page.goto(url)
        # Автоматическое заполнение полей
        page.fill('#username', user) 
        page.fill('#password', password)
        page.click('#login')
        
        # Ожидание элемента и скачивание
        page.wait_for_selector('a.download') 
        with page.expect_download() as download_info:
            page.click('a.download')
        download = download_info.value
        download.save_as(download_path)
        browser.close()

Это позволяет вашему сервису самостоятельно собирать исходные PDF – критически важно для подписки, где система должна сама получать документы клиента каждое утро.

7. Распространение: CLI с Typer / Click

Для удобства использования оберните функциональность в CLI-интерфейс с помощью Typer (или Click). Это позволяет не-разработчикам запускать его локально или упрощает развертывание на серверах.

pip install typer
# cli.py
import typer
from pipeline import Pipeline, Loader, Parser, Sink

app = typer.Typer()

@app.command()
def process(path: str):
    """Обрабатывает один файл по указанному пути."""
    steps = [Loader(path), Parser(), Sink()]
    p = Pipeline(steps)
    p.execute({})
    typer.echo(f"Файл {path} успешно обработан!")

if __name__ == "__main__":
    app()

Опубликуйте п��оект на PyPIsetup.py или pyproject.toml) или упакуйте в Docker-образ.

8. Оптимизация: Ускорение с C++ (pybind11)

Для тяжелой обработки изображений или масштабного пре-процессинга для OCR Python может стать узким местом. У меня был шаг (кастомное преобразование изображения), который должен был обрабатывать тысячи страниц в день.

Я переписал этот единственный шаг на C++ и сделал его доступным из Python через pybind11 (можно использовать и Cython).

Суть подхода:

  1. Написать тяжелую функцию на C++.

  2. Обернуть ее с помощью pybind11 (для Python-интерфейса).

  3. Импортировать скомпилированный модуль в Python как обычную библиотеку.

Этот микро-рефакторинг сократил время выполнения шага со ≈ 120 мс/страница до ≈ 10 мс/страница. Знайте, где замедляет Python, и изолируйте это место.

9. Масштабирование: Воркеры с Celery + Redis

При росте числа пользователей обрабатывайте задачи в очередях воркеров, чтобы не блокировать основной поток.

pip install celery redis
# tasks.py
from celery import Celery
from pipeline import Pipeline, Loader, Parser, Sink

# Настройка Celery с Redis в качестве брокера
app = Celery('tasks', broker='redis://localhost:6379/0') 

@app.task
def process_file(path):
    """Задача Celery для асинхронной обработки."""
    steps = [Loader(path), Parser(), Sink()]
    Pipeline(steps).execute({})

10. Монетизация: От фриланса до SaaS

Как я превратил это в деньги:

  1. Фриланс-контракты (ранняя выручка): Предложил автоматизацию обработки счетов нескольким местным клиентам. Быстрые победы, минимальная поддержка.

  2. Цена за документ (Volume pricing): Тарификация за обработанный счет (например, $0.10–$0.50). Отлично для клиентов с большим объемом.

  3. Ежемесячная подписка (SaaS): Хостинг сервиса, автоматический инжест (через Playwright или SFTP) и оплата за удобство + SLA.

  4. White-label / Enterprise: Интеграция в существующую бухгалтерскую платформу.

Ключевые тактики, которые помогли конвертировать лиды:

  • Двухнедельный бесплатный пробный период: Обработка первых 50 счетов клиента бесплатно.

  • Прозрачный отчет о точности: Показываем, что было спарсено машиной, а что пришлось править вручную.

  • Human-in-the-loop (человек в контуре): Предлагаем ручную коррекцию для результатов с низкой уверенностью (дополнительный доход).

11. Скелет репозитория (стартовая точка)

Используйте эту стру��туру в качестве основы для любого серьезного проекта по автоматизации:

invoice-automator/
├─ pyproject.toml
├─ README.md
├─ src/
│  ├─ automator/
│  │  ├─ __init__.py
│  │  ├─ cli.py               # Точка входа CLI
│  │  ├─ pipeline.py          # Основная логика ООП-пайплайна
│  │  ├─ loaders.py           # Классы Loader (файл, загрузка, Playwright)
│  │  ├─ parsers.py           # Regex / NLP парсеры
│  │  ├─ ocr.py               # OCR-утилиты и фоллбэк
│  │  ├─ enrichers.py         # Нормализация валют, поиск поставщиков
│  │  ├─ sinks.py             # Google Sheets / DB / Webhook
│  │  └─ utils.py
│  └─ tests/
│     ├─ test_parsers.py
│     └─ test_pipeline.py
├─ docker/
│  ├─ Dockerfile
│  └─ prod-compose.yml
└─ infra/
   └─ celery_worker.yml       # Конфигурация воркера

Какие еще рутинные задачи вы хотели бы автоматизировать с помощью этого архитектурного шаблона?

Комментарии (70)


  1. randomsimplenumber
    15.10.2025 19:31

    То есть сначала вы работали бесплатно, а потом написали автоматизацию и решили ее продать? А, перевод..

    Ну, написать код несложно. Продать - вот в чем сложность.


    1. boulder
      15.10.2025 19:31

      Вообще говоря, всю дорогу раньше считалось, что непросто именно написать код ;)


      1. sic
        15.10.2025 19:31

        Ещё годов с 05ых эта дорога превратилась в тропинку, а потом и вовсе лесом заросла.


      1. PerroSalchicha
        15.10.2025 19:31

        Смотря кто вы по профессии, программист или продажник.


        1. venanen
          15.10.2025 19:31

          Я бы сказал смотря что вы делаете.
          Все, что закрывает потребности и хорошо продается - уже создано.
          Все, что не лежит на поверхности - продать сложно. И тут нюанс в том, что разработку можно закрыть только деньгами, а вот продать кому-то в плюс - только деньгами не закрыть, нужна идея и еще больше денег.


          1. PerroSalchicha
            15.10.2025 19:31

            Все, что закрывает потребности и хорошо продается - уже создано.

            Да, создано, но далеко не всем, кому можно, продано.


          1. Turbo_Pascal_55
            15.10.2025 19:31

            >> Все, что закрывает потребности и хорошо продается - уже создано.

            Где то это уже говорили.
            В 19-м веке, в патентном бюро, кажется.
            "Всё, что можно было изобрести, уже изобретено".


          1. vdudouyt
            15.10.2025 19:31

            Участие в любой инженерной деятельности, включая и разработку ПО, влечет за собой целый ряд серьезных когнитивных искажений, непосредственно мешающих вести бизнес-деятельность - в следствие чего эти 2 скилла весьма редко сочетают себя в одной персоне.

            Одним из наиболее вопиющих, безо всяких сомнений, является инженерское убеждение о том, что если похожий продукт уже существует на рынке, то другой такой уже вроде как и "не нужен" (что бы не подразумевалось под этими словами: "не нужно изобретать велосипед" или "не получится продавать").


            1. DMGarikk
              15.10.2025 19:31

              у убеждения "если существует на рынке то не нужен" кстати есть огромная база подтверждаемая статистически и чтобы в таких условиях сделать чтото конкурентноспособное надо или делать уникальную ф-цию или затратить просто космические деньги на продвижение

              проблема в том что уникальную ф-цию моментально повторит конкурент и вы вы сразу переходите к п.2 с деньгами

              посчитайте сколько раз уже убийцы айфона и андройда выходили на рынок и куда делись

              тут какбы да, надо пробовать пробовать пробовать, а для этого нужны деньги, а находить деньги это совершенно отдельный скилл который вообще не пересекается с ИТ навыками и техническим мышлением


              1. SystemOutPrintln
                15.10.2025 19:31

                посчитайте сколько раз уже убийцы айфона и андройда выходили на рынок и куда делись

                чтобы в таких условиях сделать чтото конкурентноспособное надо или делать уникальную ф-цию или затратить просто космические деньги на продвижение

                Вы подвели удобный пример под свой тезис. Никто не спорит, рынок смартфонов многомиллиардный и для конкуренции там нужно хоть как-то соответствовать конкурентам.

                Но это же не значит, что абсолютно все ниши заняты такими акулами.

                проблема в том что уникальную ф-цию моментально повторит конкурент

                Вы исходите из ложной посылки, что конкуренты абсолютно всегда ведут себя рационально, выдают высшее качество и не расслабляются ни на секунду. А это, мягко говоря, не так.

                Конкурент может если и скопировать фичу, то через одно место. Может своими "улучшениями" превратить свой продукт в тормознутое и перегруженное нечто. А ещё может просто расслабиться, думая, что раз он достиг первого места на рынке в своей нише, то можно почивать на лаврах до конца своей жизни. Людям это вообще очень свойственно, когда они решили, что уже всех победили.

                В истории полно подобных примеров.


                1. DMGarikk
                  15.10.2025 19:31

                  ну конечно я самый явный пример привел, в других сферах ситуация не такая выраженная но всеравно такая

                  Я еще могу примеров накидать, x86 процессоры, автомобили, самолеты, браузеры, почтовые программы, трекеры времени-задач, даже IDE среды

                  там везде так, попробуйте создать новую коммерческую IDE и выйти на рынок и продать хотябы 50тысяч копий.

                  Новичку переплюнуть конкурента-гиганта можно, но это стоит огромных денег и гигант в какойто момент может просто купить вас похоронив продукт если вы чемто начали сильно выделятся

                  да конечно гигант не всегда может повторить уникальную фичу, но вы попробуйте еще найдите такую фичу, а пока вы выкатили очередной рутуб как конкурента ютьюба в надежде что вы чемто ютьюб перебъете и ваша фича окажется фичей..у вас скорее кончатся инвесторские деньги чем попрут продажи... потому что вы врятли повторите 1:1 функционал конкурента чтобы не переучивать пользователей - значит единомоментно переход к вам будет затруднен...и ваша фича должна быть сверхценной

                  везет очень немногим, сам факт попытки совершенно не гарантирует результата

                  под этим могильным камнем закопаны сотни тысяч стартапов конкурентов мордокниги и всего подряд


                  1. SystemOutPrintln
                    15.10.2025 19:31

                    x86 процессоры, автомобили, самолеты, браузеры

                    гигант 

                    Ну вот вы снова о гигантах и только о них, как будто на рынке никого больше и нет.

                    А я вам о том, что рынок состоит не только из гигантов. И что хватает ниш, которые гигантам попросту не интересны - прибыль будет слишком незначительна, по их меркам, чтобы попытаться занять эти ниши. А вот по меркам мелкого бизнеса эта прибыль будет более чем приличной, почему бы не занять, конкурируя с такими же мелкими бизнесменами, а не гигантами.

                    Есть, например, такая ниша, как изготовление металлических изделий по заказам от частных лиц. Всякая там художественная ковка, лестницы, авторские мечи и тому подобное. "Гигантам" в лице металлургических заводов эта ниша попросту не интересна — заказы слишком маленькие по объему, и при этом каждому заказчику подавай что-то своё. В то время как завод рассчитан на выпуск однотипной продукции в огромных объемах. И вот в этой нише и трудятся частные кузнецы.

                    И в айти хватает подобных ниш.


                    1. DMGarikk
                      15.10.2025 19:31

                      чтобы попытаться занять эти ниши.

                      Есть, например, такая ниша, как изготовление металлических изделий по заказам от частных лиц. Всякая там художественная ковка, лестницы, авторские мечи и тому подобное. "

                      тут же просто адская конкуренция, просто настолько огромная что я вообще хз кто новый в этот сектор еще выйти может

                      гигантам она не интересна, там частников настолько много что они даже расти по объемам не могут, насколько низка наценка по таким работам, они ограничены даже географически из-за этого и не могут расти дальше радиуса километров в 20-30 в котором работают, потому что логистика этих железяк становится нерентабельной...а там уже свои кузнецы есть и условную лесенку закажут у них, а не у вас просто потому что у вас доставка пара тысяч рублей, а там нет.

                      а в айти всё сильно печальнее, вот моему знакомому нужно было интернет магазин сделать, ему предложили известный типовой или на php с нуля написать, я ему типовой посоветовал, потому что если написать с нуля, он будет привязан к этому разрабу который ему это делал, а это проблемы в долгосрочной перспективе

                      вот также со всеми инструментами, хотите написать софт по учету сбора коробок на коробочной фабрике - ну продадите двум фабрикам его, а остальные на базе 1С это сделают...потом вы закроетесь от отсутствия заказов, и фабрика больше никогда не будет брать самопальные решения, бизнес берет решения только от проверенных временем поставщиков, а те кто с нуля выходит это очень высокий риск

                      собственно, я это не к тому что нельзя делать чтото новое, а к тому что выйти на рынок сложно и найти достаточно клиентов сложно, а удержать их еще сложнее

                      А вот по меркам мелкого бизнеса эта прибыль будет более чем приличной

                      приличная прибыль по меркам мелкого бизнеса это примерно медианная зарплата сеньора плют риски что у вас всё одним моментом может схлопнутся если ваш бывший коллега с которым вы случайно поругались форкнет ваш продукт, ну или ктото еще зайдет в эту узкую нишу


                      1. SystemOutPrintln
                        15.10.2025 19:31

                        а в айти всё сильно печальнее, вот моему знакомому нужно было интернет магазин сделать, ему предложили известный типовой или на php с нуля написать

                        А потом ему понадобится какая-нибудь нетиповая интеграция и привет. Всё-таки понадобится нанять разраба, который её напишет и будет сопровождать.

                        Типовые решения на то и типовые, что они покрывают наиболее популярные и востребованные кейсы. Нужно решение для чего-то непопулярного - либо заказывай у вендора за многоденег, либо нанимай программиста для написания и сопровождения интеграции (выйдет намного дешевле).

                        вот также со всеми инструментами, хотите написать софт по учету сбора коробок на коробочной фабрике - ну продадите двум фабрикам его, а остальные на базе 1С это сделают...потом вы закроетесь от отсутствия заказов

                        Что за глупости? Двух фабрик уже будет достаточно, если продавать не саму коробку с продуктом "как есть", а продукт + техническую поддержку, сопровождение и дальнейшие доработки. С такой бизнес-моделью пары клиентов хватит за глаза.

                        приличная прибыль по меркам мелкого бизнеса это примерно медианная зарплата сеньора

                        Ну да, и?


                      1. DvoiNic
                        15.10.2025 19:31

                        А потом ему понадобится какая-нибудь нетиповая интеграция и привет. Всё-таки понадобится нанять разраба, который её напишет и будет сопровождать.

                        Все-таки будет, грубо говоря, "90% типового"


                      1. SystemOutPrintln
                        15.10.2025 19:31

                        Изначальный тезис был "Все, что закрывает потребности и хорошо продается - уже создано", и вы лишь подтвердили его ложность.


                  1. creativcheck
                    15.10.2025 19:31

                    Трекеров времени и задач вагон и маленькая тележка как раз, и ничего, периодически новый выстреливает и поднимает миллионные инвестиции. А есть маленькие и дешёвые без нагромождения кучи функционала, такие и сделать недолго и затраты отбить легче, как у автора постп


                    1. PerroSalchicha
                      15.10.2025 19:31

                      Трекеров времени и задач вагон и маленькая тележка как раз, и ничего, периодически новый выстреливает и поднимает миллионные инвестиции.

                      При этом обычному программисту для того, чтобы чувствовать себя уверенно, не нужен софт, поднимающий миллионные инвестиции. Достаточно софта, подписку на который оформит тысяча клиентов по $10/месяц.


                    1. DMGarikk
                      15.10.2025 19:31

                      и поднимает миллионные инвестиции

                      миллионные инвестиции != выстреливает, хотя это смотря что вы под выстреливанием имеете в виду

                      я работал в стартапе который поднял миллионные инвестиции и обанкротился в один день когда очередной транш пришел, до этого они пытались "найти клиента который нас будет окупать" и прожрали всё на ФОТ

                      Опятьже, это всё менеджмент и продажи, если человек умеет и хочет идти туда - тут совершенно всёравно какой продукт. Айтишники сюда не попадают потому что это технари, а не продажники, и тут не в мышлении дело, а в том кто что умеет делать в принципе


              1. vdudouyt
                15.10.2025 19:31

                посчитайте сколько раз уже убийцы айфона и андройда выходили на рынок и куда делись

                То, что Вы говорите это яркий пример т.н. "платформенного эффекта". Не весь бизнес такой. А точнее, почти весь не такой.


        1. randomsimplenumber
          15.10.2025 19:31

          Продать то что удалось сделать за выходные - высший класс для обоих ;) уважаю.


    1. Verona90210
      15.10.2025 19:31

      Большинство таких проектов и умирают на этапе "кому это нужно"


  1. Kollubov
    15.10.2025 19:31

    Так сколько удалось заработать? И еще - бухгалтерия это дело ответственное. Прежде чем подписать отчетность бухгалтер все равно должен просмотреть оригиналы всех присланных счетов, сверить распознанные результаты и убедиться в правильности расчетов и итогов. Если не сойдется приход с расходом, то отдуваться будет материально ответственное лицо, а не сервис распознавания циферок. И еще большой вопрос, насколько проще сначала автоматически извлечь, а потом все сверять, а не сразу самостоятельно заполнять по присланным сканам.


    1. McKinseyBA
      15.10.2025 19:31

      m = AMOUNT_RE.search(text) if m: # Удаляем разделители тысяч, чтобы корректно преобразовать в float s = m.group(1).replace(',', '') return float(s)

      для кого ответственное, а автор и во float преобразует финансовые данные... Но, может это я чего-то не понимаю?


      1. Kollubov
        15.10.2025 19:31

        Ну да, флоат может, конечно, грешить. Если надо не только складывать и умножать, но и, допустим, высчитывать НДС. Но мужик не раскрывает, что кроется за термином "обогащение". Возможно, все процентные расчеты сделаны уже в самих сканах, и надо только извлекать цифры и, возможно, складывать их в единый итог. Хотя для верности все равно разумнее конвертировать распознанные строки денежных сумм в децималы (если в питоне еще не придумали специальную переменную для бабла).


  1. TomYummTm
    15.10.2025 19:31

    Это, вероятно, крайне старая статья. Сейчас на волне хайпа n8n, который уже зарекомендовал себя, как надёжный инструмент с большим набором инструментов: как встроенных, так и от сообщества


    1. zradeg
      15.10.2025 19:31

      Заход на рекламу n8n с критики статьи? Шикарно)


    1. Ratenti
      15.10.2025 19:31

      Оригинал 2025 года


  1. sic
    15.10.2025 19:31

    Такой гибридный подход (текстовый слой → OCR) сделал инструмент надежным для 95% входящих счетов

    Это шутка, или я что-то дальше забыл прочитать? Такие цифры надёжности OCR это что-то из донулевых годов. А сейчас я бы и за инструмент у которого нет хотя бы 99.99% точности не стал бы платить - все равно нужен человек, который будет результат проверять, и чтобы доказать, что он проверяет что-то не нужно давать ему результат OCR, а, значит OCR и не нужен. Если что, просто штрафуем человека.


    1. PerroSalchicha
      15.10.2025 19:31

      Это шутка, или я что-то дальше забыл прочитать? Такие цифры надёжности OCR это что-то из донулевых годов.

      Это неплохой результат, на самом деле. У меня в реальности даже меньше получается. Проблема даже не в том, чтобы символы распознать (с этим-то современные OCR справляются отлично). Проблема в том, чтобы идентифицировать нужные поля на счёте, которые у каждого второго контрагента наделены индивидуальностью, где-то нужные реквизиты на логотипе, где-то в шапке, где-то в футере. Ну и да, человек для верификации по-любому нужен, если инвойс - скан или текстовая пдфка, а не в электронном формате приходит.


      1. sic
        15.10.2025 19:31

        Не хочу спорить, я просто очень много структурным OCR занимался, и связать поля и значения вовсе не так сложно, даже если часть их распознана недостоверно, а общая структура документа нам даётся первый раз (в самом документе). У меня даже статья тут на Хабре есть про то самое. Давно правда было.

        С тех пор было веселее парсить одного трейдера шизофреника, который давал удивительно точные прогнозы, но часть инфы у него в кружочках, а часть в рукописных каракулях на графиках. Даже там, какие 95%, больше 99.5% удавалось выжать... а человек что, человек штука медленная.

        P. S. В общем, смотря какая вообще дичь может быть в тестовом наборе.

        P. P. S. Tesseract невероятно слаб.


        1. venanen
          15.10.2025 19:31

          P. P. S. Tesseract невероятно слаб.

          А что есть кроме?
          P.S. Уж не знаю как, но все что я трогал на порядок уступало топовым LLM.


          1. sic
            15.10.2025 19:31

            Как раз для разного рода pdf сканов документов меня устраивает PaddleOCR. Из коробки многого не стоит ждать, хотя по сравнению с tesseract он все же работает. Но дообучение и предварительная обработка изображений даёт сколь угодно близкие к 100% результаты. Ядром предобработки сканов выбираю retinex msr. Так разве что рукописные каракули на салфетке снятые ночью на улице иногда не распознает.

            Tesseract в принципе тоже можно научиться "готовить". Если специфика такая, что числа+a..z самая важная информация, из него можно выкинуть ненужные символы алфавита, переобучить и получить отличную скорость при, чуть менее точном распознавании. И я все равно его использую как fallback алгоритм и в метрике качества распознавания; если paddle и tess дают разные варианты распознавания, то это уже неплохая вероятность, что документ либо плохо предобработан, либо повреждён.

            P. S. Какими-то фундаментальными сравнениями с топовыми LLM не занимался уже год, но последний раз сравнивать было по большому счету нечего. Про 60-80% распознавания на них для структурных документов соглашусь. Но они как бы вообще не для этого, возможно как-то можно специализированно учить.


        1. DvoiNic
          15.10.2025 19:31

          Присоединюсь к вопросу ниже - а чем заменять?


        1. NiPh
          15.10.2025 19:31

          Регулярно сталкиваюсь с желанием парсить трейдеров-шизофреников) Если можете подсказать куда смотреть чтобы распарсить данные с картинок за пару лет и не сойти с ума - буду очень признателен. Пробовал Яндекс Толоку, пробовал в чатгпт по АПИ засылать нейронки - результат крайне нестабильный. Как, как правильно делать разметку этих чекнутых скриншотов с tradingview с кучей каракуль?)


  1. AlexeyPolunin
    15.10.2025 19:31

    Это все делается одним промптом в gpt-5, предварительно вынув все из pdf самыи топорным способом. Счета, УПД, КП и просто когда на салфетке написано - все работает. Себестоимость около 3 рублей счет. А также мы вынимаем и docx и xlsx и если там pdf в котором лежит картинка, то берем и картинку в гпт отправляем. 100% результат супер надежный.


    1. PerroSalchicha
      15.10.2025 19:31

      А также мы вынимаем и docx и xlsx и если там pdf в котором лежит картинка, то берем и картинку в гпт отправляем. 100% результат супер надежный.

      Я проводил тесты на пачке из восьми тысяч инвойсов из пдфков с текстом и полутора тысяч пдфок со сканами. Из текстовочки гпт-5 извлекал со 100% точностью, на сканах точность падала до совершенн неприемлемых 67%, там надо было OCR подключать.


      1. AlexeyPolunin
        15.10.2025 19:31

        Спасибо, учтем


  1. BenderA
    15.10.2025 19:31

    Для массовых однотипных документов, всё это есть изкаробки в 1С8. А кто сейчас не пользуется 1С?


    1. Vilos
      15.10.2025 19:31

      эт вроде перевод.....за границей мало кто.


      1. APh
        15.10.2025 19:31

        Да, за границей, несмотря на наличие точечных компетенций в каких-то высоких технологиях у производителей, например в Гугел, все плоховато с цифровизацией...

        Это хорошо ещё не по факсу счета приходят. Пришлось бы дополнять шагом сканирование, если факсимильный аппарат не цифровой.


        1. Vilos
          15.10.2025 19:31

          Ну справедливости ради скажу, что давно существуют (с 90-х годов) факсы в компьютер...так называемые софт-факс....ставишь плату в PCI и все факсы автоматом в папочку на диске ложатся. В принципе проблем с интеграцией из примера из статьи не вижу. Просто будет распазнавалка брать уже принятые факсы из папочки....причем даже, ей не нужно знать как туда этот файл попал - с факса или со сканера или еще от куда.


          1. select26
            15.10.2025 19:31

            "Софт-факс"! Улыбнулся.
            Любой модем с поддержкой факс (по факту - действительно любой года c 1995 выпуска) может принимать факсы. Даже если он не PCI, а вовсе себе внешний с RS232. Был такая чудная программа: VentaFax.
            А в 2008 уже году делали прием прямо в IP PBX. Безо всяких физических модемов.


            1. Vilos
              15.10.2025 19:31

              Ну без модемов, однако тогда нужна плата с FXO портом...физически то кабельную линию кудато воткнуть нужно.


        1. Vilos
          15.10.2025 19:31

          И дааа....насчет цифровизации - подписываюсь под вашими словами; многое из бытовой жизни просто заставляет рыдать. Какое-то время находился в Турции, так вот онлайн банки - просто выбивали слезы, счета приходили только в виде бумажки засунутой в счетчик (под крышечкой), причем как на воду так и на эл-во. Я уж не говорю о том что большинство банков и банкоматов имеют только турецкоязычный интерфейс (почему не любят английский непонятно).... и только лишь однажды я встретил банкомат с рускоязычным интерфейсом. Короче с переводами на другие языки у них почему-то сложно. Большинство госструктур или окологосударственных имеют сайты а ля "привет из 90-х". Короч почему-то у них с этим трудности.


          1. bubandos
            15.10.2025 19:31

            видимо, давно вы в Турции не были))) в 2025-м все банкоматы, что я видел, минимум на русском, английском, турецком, два из трех еще и с немецким и китайским языками


            1. Vilos
              15.10.2025 19:31

              Возможно зависит от локации (туристическая зона или нет)...да, возможно за последние годы у них стало лучше (в связи с большим пополнением за счет российских релокантов)...но раньше было очень грустно по этой части (город Денизли, совсем не туристический).


            1. vadimk91
              15.10.2025 19:31

              Да буквально на днях нужно было узнать про ЖД транспорт в Измире, сайт только на турецком. А это третий по населению город в Турции. Переводишь в браузере - заодно переводятся и названия станций, потом догадывайся, что это было в оригинале)) Объявления на центральном вокзале только на турецком. Автомат пополнения карт izban - интерфейс тоже только для своих, хорошо местный подсказал, что надо зелёную галку жать


              1. Vilos
                15.10.2025 19:31

                Kemer - ремень:))) Знакомо... интересно что названия локаций в Турции как правило что-то значат и можно перевести (поэтому онлайн переводчики вносят дополнительную чехарду)...Mahmutlar - много Махмутов (наверное раньше там жили Махмуты)...забавно


                1. randomsimplenumber
                  15.10.2025 19:31

                  Mahmutlar - много Махмутов

                  Иваново.. хм? ;)


                  1. Vilos
                    15.10.2025 19:31

                    Угу, почти "города-побратимы" :))


    1. Verona90210
      15.10.2025 19:31

      1С подходит не всем, особенно за пределами СНГ


  1. Brakomes
    15.10.2025 19:31

    Напомню, что с 26 года ФНС будет настойчиво рекомендовать использовать ЭДО не только организациям передающим друг другу маркированную продукцию, но вообще всем организациям независимо от того, что они там друг другу передают. В свете этого подозреваю, что совсем скоро сканированные счета и упд канут в лету. Надо думать что-то другое уже сейчас.


    1. Vilos
      15.10.2025 19:31

      на рубежом все эти ФНСы неактуальны, так же как и их распоряжения....это ж перевод, не у нас вся эта статья описывает


      1. DMGarikk
        15.10.2025 19:31

        на рубежом все эти ФНСы неактуальн

        за рубежом есть свои местные ФНСы, которые в зависимости от юрисдикции тоже много всякого маразма могут требовать

        Налоговая служба существует во всех странах мира без исключенгия, и цель у неё одна и таже везде


    1. Devastator82
      15.10.2025 19:31

      Мы пользуемся ЭДО для 100% договоров уже не первый год.

      1. Отправка в ЭДО платная. 7-10 рублей за документ. Это не разорительно, просто для информации.

      2. При работе через ЭДО достаточно отправлять договоры и акты. Счета не обязательно.

      3. Исходя из п1 и п2 документы не требующие ЭЦП отправляются в почту или мессенджер.


  1. diakin
    15.10.2025 19:31

    - За чей счет вы оплачиваете квартиру?
    - За счет Питон инструмента!


  1. medvedd
    15.10.2025 19:31

    Доверять Tessearct'у финансовые документы — невероятная смелость.


  1. ovalsky
    15.10.2025 19:31

    что будете делать, когда клиенты начнут требовать возмещение упущенной прибыли, после сорванных сделок из-за оплаченного счёта на другой номер? Вероятность не так уж и мала, когда распознается не та цифра


  1. Verona90210
    15.10.2025 19:31

    Хорошо показано, как шаг за шагом превращается идея в рабочий сервис


  1. RulenBagdasis
    15.10.2025 19:31

    Начните с малого: отслеживайте папку, обнаруживайте новый PDF, извлекайте текст.

    Как PDF появляются в папке?

    Такой гибридный подход (текстовый слой → OCR) сделал инструмент надежным для 95% входящих счетов.

    Т.е. просматривать надо всё равно все. Если уж открыл и посмотрел, скопировать сумму и понтрагента дело 15 секунд.


    1. PerroSalchicha
      15.10.2025 19:31

      Открыл, посмотрел, набрал сумму (ибо откуда вы будете копировать? Там, где можно копировать, там и GPT-5 не ошибётся, ошибки будут на OCR-варианте, где копировать не откуда), открыл список контрагентов, начал вводить, поискал глазами нужного в выпадающем списке, закрыл, сохранил. И это только если там всего два поля, а не НДС, дата и прочие реквизиты, как обычно бывает.


      1. RulenBagdasis
        15.10.2025 19:31

        Сумму я буду копировать мозгом, я в состоянии за 5 секунд запомнить и ввести 1-2 числа. В выпадающем списке начнте набирать имя контрагента и он у вас быстро найдётся ещё за 5 секунд.


        1. PerroSalchicha
          15.10.2025 19:31

          Ну ок, 99% пользователей не настолько прокачаны, как матёрый ИТшник, чтобы найти сумму и название контрагента в инвойсе, ткнуть мышкой в нужные поля и ввести это руками, ещё и без необходимости внимательно проконтролировать уже самого себя после ввода.


          1. RulenBagdasis
            15.10.2025 19:31

            100% пользователей вынуждены будут это проделать, найти в инвойсе сумму, контрагента и вот это вот всё, потому что 5% риск заплатить не тому или не ту сумму просто убъёт бизнес. Вы работали с инвойсами или вы теоретик?


            1. PerroSalchicha
              15.10.2025 19:31

              Вы работали с инвойсами или вы теоретик?

              Пфф, если вы читали комментарии к этой статье, увидели бы, что я непосредственно занимаюсь автоматизацией распознавания инвойсов.

              потому что 5% риск заплатить не тому или не ту сумму просто убъёт бизнес.

              Ага, а 10% риск заплатить не тому разорвёт бухгалтера в кровавые клочья. Кстати, по поводу теоретиков: я не сомневаюсь, что взрослый дядька вроде вас, конечно же, в своей жизни встречал инвойсы, и не раз. Но вот что и как с ними делают люди, очевидно, разбираться не приходилось. Так вот, практически невозможно нанести ущерб бизнесу, что-то не так вбив в инвойсе. Все операции там обратимые. Если вы ошиблись при вводе суммы - вы доплатите вторым платежом недостающее, или вам вернут ошибочно перечисленное. Если даже вы ошиблись с контрагентом (что малореально, т.к. для сколь-нибудь серьёзных оплат всегда есть двойной контроль, бухгалтерия ключевых контрагентов знает поименно), но даже если реально ошиблись, вам эти деньги "неправильный" контрагент также вернёт. Чтобы нанести ущерб бизнесу, это надо вообще какие-то нереальные вещи сотворить: у вас в базе должен быть вбит активный контрагент с арестованными счетами на большую сумму, вы должны перечислить ошибочно деньги именно ему, эта сумма должна быть критичной для бизнеса, а кассовый разрыв должен наступить у вас вот прям щас, а не через какое-то время, достаточное для разборок с судебными приставами по возврату денег. Ну т.е. это вообще нереальное сочетание условий, про которое вы даже и не догадывались.


              1. RulenBagdasis
                15.10.2025 19:31

                Конечно, я так, погулять вышел.

                Все операции там обратимые.

                Ага, через суд через несколько месяцев, если не повезёт, если вы автоматически пульнули на 1-2 нолика больше, чем нужно и к вам пришёл тот самый кассовый разрыв. Вы, судя по всему, в Газпроме работаете и поэтому он вам не страшен, но у мелкого бизнеса всё не так шоколадно.

                Пфф, если вы читали комментарии к этой статье

                Мне каждый раз все комментарии читать, прежде чем свой написать, или только ваши?

                что я непосредственно занимаюсь автоматизацией распознавания инвойсов.

                Ну, теперь понятно, почему вы пишите странные вещи, у вас шкурный интерес. Всего хорошего.


                1. PerroSalchicha
                  15.10.2025 19:31

                  Ага, через суд через несколько месяцев, если не повезёт

                  Ага, вот так перевели деньги ошибочно. а тот контрагент вам их не отдаёт, дескать, всё, что мне упало, то моё. И возвращает только через суд. И пульнули сразу на 1-2 нолика больше, OCR и бухгалтер, выполняющий оплаты, в вашем воображаемом мире такие же фантазёры, как и вы сами.

                  Всего хорошего.

                  Мой вам совет: если вы видите тему, в которой у вас никаких актуальных знаний, кроме личного видения мира, нет, просто проходите мимо. Всяко лучше молчать, чем демонстрировать некомпетентность.


                  1. RulenBagdasis
                    15.10.2025 19:31

                    Ага, автоматика, она такая, за ней 3 проверяющих нужны.

                    Мой вам совет

                    Ну, раз вы говорите, что мне делать, скажу куда вам своими советами пойти. На хрен. Там вас остальные профаны радостно встретят, обсудите с ними, как вы 15 минут 2 числа из инвойса переносите. Кого только не принесло в индустрию...


                    1. PerroSalchicha
                      15.10.2025 19:31

                      Ага, автоматика, она такая, за ней 3 проверяющих нужны.

                      Не, конечно же, оно всё всегда само делало, никогда же люди не контролировали ни производственные, ни делопроизводческие процессы.

                      Ну, раз вы говорите, что мне делать, скажу куда вам своими советами пойти. На хрен.

                      А, я с вами уже ведь общался, к сожалению. И уже прекрасно знаю, что вы быдло, так что не обязательно это демонстрировать в очередной раз.

                      Хотя мне странно слышать какие-то упрёки в профессиональности от луддита, который даже смартфон не осилил :)