Перейти к основному содержимому

OCR (Yandex Vision OCR)

Нода OCR распознает текст в изображениях и PDF-файлах с помощью Yandex Vision OCR. Поддерживает обычный печатный текст, многоколоночный текст, рукописный текст, таблицы, формулы (LaTeX), а также шаблонные документы (паспорт, водительское удостоверение, СТС, автомобильные номера).

Нода занимается только распознаванием. Чтобы проиндексировать результат в базу знаний для последующего поиска, подключите к её выходу ноду Индексация в базу знаний.

Назначение

  • Извлечение текста из сканов документов и фотографий
  • Распознавание паспортов, водительских удостоверений, СТС, автомобильных номеров
  • OCR таблиц с возвратом структурированных данных
  • Распознавание рукописного текста (русский / английский)
  • Извлечение математических формул в формате LaTeX

Настройки

URL файла

URL изображения или PDF, который нужно распознать. Поддерживает подстановку переменных через {{переменная}}:

https://storage.example.com/{{input.document_id}}.pdf

Кнопка справа от поля позволяет вставить ссылку на переменную из workflow.

Если поле оставлено пустым, нода использует:

  1. Текущий элемент цикла ForEach (если в нем строка с URL)
  2. Поле fileUrl / url / file_url из выхода предыдущей ноды
  3. Строковый выход предыдущей ноды

Модель

Выбор модели определяет, какой алгоритм Yandex использует для распознавания.

Текстовые модели

ЗначениеОписание
pageПо умолчанию -- одноколоночный печатный текст
page-column-sortМногоколоночный текст (две и больше колонок)
handwrittenРукописный + печатный текст. Только русский и английский
tableТаблицы. Только русский и английский
markdownВозвращает результат в формате Markdown
math-markdownМатематические формулы в LaTeX-разметке внутри Markdown

Шаблонные документы

ЗначениеОписание
passportОсновной разворот российского паспорта
driver-license-frontВодительское удостоверение, лицевая сторона
driver-license-backВодительское удостоверение, обратная сторона
vehicle-registration-frontСТС, лицевая сторона
vehicle-registration-backСТС, обратная сторона
license-platesВсе автомобильные номера на изображении

Шаблонные модели возвращают распознанные поля в массиве entities (см. ниже).

Языки

Список языковых кодов ISO 639-1 (ru, en, de, fr, ...). По умолчанию: ru, en.

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

Только RU/EN

Модели handwritten и table поддерживают только русский и английский. При выборе других языков нода вернет ошибку ConfigurationError ещё до вызова Yandex.

Лимит символов inline

Максимум символов в inline-поле text. По умолчанию: 50 000.

Если распознанный текст превышает лимит, поле text обрезается, ставится флаг truncated: true, а полный массив pages[] сохраняется без изменений. Это позволяет downstream нодам (например, ForEach) обрабатывать длинные документы постранично, не нагружая контекст LLM.

Тайм-аут async

Используется при распознавании многостраничных PDF. По умолчанию: 180 секунд, диапазон 30--300.

Yandex обрабатывает PDF в асинхронном режиме (отправка → polling → результат). Если за указанное время операция не завершилась, нода возвращает ошибку APIError.

Лимиты Yandex Vision OCR

  • Форматы: JPEG, PNG, PDF
  • Максимальный размер файла: 10 МБ
  • Максимальный размер изображения: 20 мегапикселей (длина × ширина)

Нода проверяет размер прямо при скачивании -- если файл больше 10 МБ, скачивание прерывается без буферизации (защита от OOM).

Входные данные

URL файла из настроек ноды или из выхода предыдущей ноды (через fallback-цепочку, см. раздел «URL файла»). Внутри ForEach -- текущий элемент массива, если это строка-URL.

Выходные данные

{
"__success": true,
"__error": false,
"text": "Полный распознанный текст (возможно, обрезанный)",
"pages": [
"Текст страницы 1",
"Текст страницы 2"
],
"truncated": false,
"totalChars": 12345,
"blocks": [
{
"text": "PENGUINS\nCROSSING",
"vertices": [
{"x": "460", "y": "777"},
{"x": "460", "y": "906"},
{"x": "810", "y": "906"},
{"x": "810", "y": "777"}
],
"layoutType": "LAYOUT_TYPE_TEXT",
"languages": [{"languageCode": "en"}],
"page": 0
}
],
"entities": [],
"tables": [],
"markdown": null,
"model": "page"
}
ПолеОписание
textПолный текст всех страниц, склеенный через \n\n. Обрезается по maxInlineChars.
pagesМассив текстов по страницам. Всегда полный, никогда не обрезается -- удобно для ForEach.
truncatedtrue, если text был обрезан по лимиту inline
totalCharsДлина полного текста до обрезки
blocksБлоки с координатами, типом layout и языком (для отображения областей на изображении)
entitiesИзвлеченные поля шаблонных документов (паспорт, ВУ, СТС, номера)
tablesСтруктурированные таблицы (для модели table)
markdownMarkdown-вариант результата (для моделей markdown / math-markdown)
modelИспользованная модель

При ошибке распознавания:

{
"__success": false,
"__error": true,
"error": "Yandex Vision OCR failed: invalid model",
"errorType": "APIError",
"status": 400
}

Возможные значения errorType: ConfigurationError (валидация настроек), ValidationError (формат / размер файла), DownloadError (не удалось скачать URL), APIError (ошибка от Yandex), и имя класса исключения для прочих случаев.

Подключения

  • Вход: один вход (слева)
  • Выход: один выход output (справа)

Примеры использования

Извлечение данных из паспорта

URL файла: {{input.passport_url}}
Модель: passport
Языки: ru

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

Распознавание длинного PDF + индексация в базу знаний

Сценарий: пользователь загружает 50-страничный договор, по нему нужно отвечать на вопросы.

  1. OCR -- URL {{input.contract_url}}, модель page. Возвращает text и pages[].
  2. Индексация в базу знаний -- получает text от OCR, складывает в KB через выбранный пайплайн.
  3. (Позже, в другом workflow или ветке) Поиск (Retrieve) -- запрос {{input.question}} ищет по проиндексированному документу.
  4. LLM -- ответ на вопрос с использованием результатов RAG.

Индексация выполняется в фоне (Celery), поэтому RAG-нода в том же запуске может ещё не увидеть документ. Для интерактивных сценариев лучше разделить на два workflow: первый только индексирует, второй отвечает на вопросы.

Постраничная обработка через ForEach

Сценарий: распознать PDF и получить саммари каждой страницы отдельно.

  1. OCR -- модель page. Возвращает pages[].
  2. ForEach -- inputPath: "pages", внутренняя операция «LLM».
  3. LLM -- промпт Сделай краткое саммари: {{_loop_item}}.
  4. Сообщение -- собрать все саммари в один ответ.

OCR таблицы

URL файла: {{input.report_url}}
Модель: table
Языки: ru, en

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

Распознавание формул

URL файла: {{input.equation_url}}
Модель: math-markdown
Языки: en

Поле markdown будет содержать результат с формулами в LaTeX-обертке вида $E = mc^2$.

Где взять URL файла

Для интерактивных сценариев загрузите файл в S3-совместимое хранилище (Yandex Object Storage, AWS S3, MinIO) и передайте подписанный URL в переменную workflow. Yandex скачает файл по этому URL.

Прямая загрузка файла из upstream-ноды (например, байты из function-ноды) пока не поддерживается -- только URL.

API-ключ Yandex Vision

Для работы ноды необходим API-ключ Yandex Cloud с ролью ai.vision.user. Ключ настраивается в провайдере Yandex Vision OCR в настройках организации.

При Api-Key-аутентификации folderId не требуется, но сам ключ должен быть привязан к сервисному аккаунту с правами на Vision.

Поворот изображений (EXIF)

Если изображение содержит EXIF-метаданные с поворотом (Orientation), координаты блоков в выходе могут не совпадать с тем, что видит пользователь в просмотрщике. Yandex учитывает EXIF-поворот, а часть просмотрщиков -- нет.

Решение: либо настроить просмотрщик с учетом EXIF, либо удалить атрибут Orientation из секции EXIF перед загрузкой.

Стоимость

Yandex Vision OCR оплачивается по тарифам Yandex Cloud отдельно от платформы. Для шаблонных документов (passport, driver-license, vehicle-registration, license-plates) тариф выше, чем для общего распознавания.