Подключая OCR API, команды в Китае обычно сначала сравнивают качество распознавания и сразу вызывают интерфейс. Уже в production выясняется, что основное время уходит на уровень доступа: стабильно ли загружаются изображения, работает ли канал в вечерний пик, в какой валюте приходит счёт, можно ли провести его в бухгалтерии и как продолжить пакетную задачу, если половина файлов уже обработана.
Отличие OCR от чат-API в том, что входные данные — изображения или PDF: тело запроса больше, тайм-ауты встречаются чаще, а повторы легче создают двойные расходы. Ниже сравнение трёх схем — прямого подключения, собственного прокси и китайского AI-шлюза — с акцентом на загрузку изображений, лимиты, переключение при сбоях и чек-лист проверки. Конкретные услуги и биллинг — на странице тарифов и в документации провайдера.
Примечание: названия OpenAI, Claude, Gemini, Baidu AI Cloud, Tencent Cloud и Alibaba Cloud являются товарными знаками соответствующих правообладателей. Материал носит технический характер; мы не связаны с этими компаниями отношениями подчинения или представительства. Трансграничная сеть, передача данных и платежи должны соответствовать местному законодательству и условиям платформ.
1. Три маршрута
Прямое подключение — вызов интерфейса OCR-провайдера или поставщика моделей напрямую. Если используется OCR китайского облака, канал и оплата уже внутри страны, и это обычно проще всего; если используется зарубежная визуальная модель, придётся самостоятельно решать вопросы трансграничной сети, долларовых счетов и курса.
Собственный прокси — развёрнутый на соответствующем требованиям сервере обратный прокси или шлюз, который берёт на себя аутентификацию, журналы, повторы и лимиты. Контроль высокий, но серверы, сертификаты, обновления и дежурство ложатся на вас. В OCR дополнительно нужно поднять лимит тела запроса и тайм-ауты, иначе большие изображения обрезаются на уровне прокси.
Китайский AI-шлюз — совместимая с OpenAI точка входа, расчёты в юанях, обычно с консолью, статистикой расхода и счетами. Подключение дешёвое, несколько моделей удобно объединить; при этом нужно проверить сторону услуги, условия обработки данных, правила лимитов и порядок реакции на сбои.
| Критерий | Прямое подключение | Собственный прокси | Китайский AI-шлюз |
|---|---|---|---|
| Сеть и доступ | Короткий маршрут у местного провайдера; зарубежные модели требуют трансграничной связи | Маршрут на выбор, но эксплуатация своя | Внутренняя точка входа, обычно готова сразу |
| Загрузка изображений | Ограничения провайдера по телу и формату | Нужно синхронно настроить лимиты прокси | Зависит от настроек тела и тайм-аутов шлюза |
| Оплата и счета | Местный провайдер — юани; зарубежные модели — доллары | Зависит от аккаунта и юрлица сервера | Расчёты в юанях, обычно со счётом |
| Пакеты и лимиты | QPS, параллелизм и квоты провайдера | Можно добавить очередь, но ограничения вышестоящего сервиса остаются | Смотрите лимиты, планировщик и повторы шлюза |
| Границы данных | Нужно самостоятельно оценить передачу и условия | Ответственность за размещение данных своя | Нужно проверить условия и квалификацию провайдера |
| Стоимость эксплуатации | Средняя, в основном сеть и аккаунт | Высокая: серверы, сертификаты, мониторинг | Низкая, централизованная консоль |
| Охват моделей | В основном один провайдер | Можно расширять самостоятельно | Обычно несколько моделей |
2. Сеть и загрузка изображений: сначала 413 и тайм-ауты
Тело OCR-запроса значительно больше текстового. Изображение на 3 МБ после Base64 вырастает примерно на треть — до ~4 МБ; если интерфейс принимает только Base64, лимит тела нужно поднять на клиенте, обратном прокси и шлюзе. Частые сбои — не «неточное распознавание», а 413, сброс соединения, тайм-аут и обрезанный ответ.
Несколько практических рекомендаций:
- Если интерфейс поддерживает URL или предподписанный адрес, передавайте изображение по URL — тело запроса меньше. Убедитесь, что ссылка действует до завершения распознавания и не требует авторизации.
- Сжимайте до приемлемого для бизнеса разрешения, но без фанатизма: мелкий текст, печати, рукопись и линии таблиц чувствительны к резкости. Лучше задать два порога — по длинной стороне и по размеру файла — и сохранять оригинал для проверки.
- Поворачивайте изображение по EXIF до загрузки, чтобы страница не легла горизонтально и порядок распознавания не сбился.
- Настройте на прокси
client_max_body_size,proxy_read_timeoutиproxy_send_timeout; менять только тайм-аут приложения недостаточно. - Для многостраничных PDF предпочитайте асинхронные задачи, а не отправку всего файла одним синхронным запросом.
Если изображение забирает провайдер по URL, проверьте, что адрес доступен из интернета, не требует входа, а срок подписи покрывает время ожидания в очереди.
3. Оплата, договор и счета
Частая проблема команд в Китае — сторона платежа. Пополнение с личной карты, оплата через посредника и несовпадающие документы мешают бухгалтерии провести расход. До выбора схемы уточните: с кем заключается договор, валюта расчётов, тип счёта, срок действия предоплаты и правила возврата.
При оплате по факту уточните единицу учёта: изображения, страницы PDF, вызовы или токены; входят ли неудачные запросы; не тарифицируются ли повторы дважды; можно ли разбить расход по проектам или ключам. Внесите это в сравнительную таблицу закупки и проверьте на одной партии изображений — иначе реальную стоимость не оценить. Конкретные суммы — на странице тарифов и в договоре.
4. Лимиты, параллелизм и пакетные задачи
OCR-интерфейс обычно ограничен одновременно по QPS, числу параллельных запросов, размеру изображения, числу страниц PDF и суточной квоте аккаунта. 429 не обязательно означает сбой сервиса — иногда это просто кратковременное превышение параллелизма. Пакетное распознавание рекомендуем строить так:
- Считайте SHA-256 каждого изображения или PDF и используйте как ключ идемпотентности; сначала проверяйте локальную таблицу результатов, потом решайте, отправлять ли запрос.
- Разделите задачи по ограничениям интерфейса: отдельные пороги для размера изображения, страниц в запросе и параллелизма.
- Начинайте с низкого параллелизма, например 2–4 потока, наблюдайте долю 429 и P95, затем постепенно увеличивайте.
- Для 429 и кратковременных 5xx применяйте экспоненциальную задержку со случайным разбросом; 401, 403 и ошибки параметров не повторяйте — сначала исправьте конфигурацию.
- Для асинхронных задач храните task_id, время отправки, статус и адрес результата; своевременно сохраняйте файлы, поскольку ссылки на результаты часто истекают.
- По завершении партии считайте успешные, неуспешные и тарифицированные изображения и время; неудачные образцы отправляйте в отдельную очередь повтора.
- После полного прогона выборочно проверьте результат вручную и сверьте число записей в базе с числом исходных файлов.
5. Повторы, идемпотентность и переключение при сбоях
Перед повтором обеспечьте идемпотентность, иначе один сетевой сбой превратится в двойную оплату и две записи. В примере хэш изображения помечает запрос, а для повторяемых ошибок используется задержка:
import base64
import hashlib
import os
import time
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ZSQH_API_KEY"],
base_url=os.environ["ZSQH_BASE_URL"],
timeout=90.0,
max_retries=0,
)
def ocr_image(path, model, attempts=4):
raw = open(path, "rb").read()
key = hashlib.sha256(raw).hexdigest()
data_url = "data:image/jpeg;base64," + base64.b64encode(raw).decode()
for i in range(attempts):
try:
resp = client.chat.completions.create(
model=model,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Распознай весь текст на изображении и выведи его в исходном порядке."},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
)
return key, resp.choices[0].message.content
except Exception as exc:
if i == attempts - 1:
raise
wait = min(2 ** i, 30) + 0.5 * (i + 1)
print(key[:8], type(exc).__name__, "retry in", wait)
time.sleep(wait)
key, text = ocr_image("invoice.jpg", os.environ["VISION_MODEL"])
print(key[:12], len(text))
При переключении есть легко упускаемая граница: выход разных OCR-движков нельзя смешивать напрямую. Традиционный OCR возвращает текст и координаты, визуальная модель — естественный язык или JSON; имена полей и системы координат могут различаться. Перед переключением зафиксируйте реальные образцы и сравните точность символов, точность полей и успешность структурированного вывода; код разбора и процесс проверки нужно менять вместе, а не только имя модели.
6. Чек-лист перед запуском
- Канал: отдельно нагрузите большие изображения, многостраничные PDF и вечерний пик; зафиксируйте долю 413, тайм-аутов и 5xx.
- Точность: 50–100 реальных изображений, включая чёткие, размытые, наклонные, рукописные, таблицы и многоколоночную вёрстку.
- Расход: сходятся ли
usageили число изображений в ответе со счётом в панели; не тарифицируются ли повторы повторно. - Лимиты: предельный параллелизм, доля 429 и успешность после задержки.
- Данные: есть ли на изображениях персональные данные или коммерческая тайна; ясны ли правила хранения, журналирования и удаления у провайдера.
- Выход: можно ли ротировать ключи, вернуть остаток, сохранить старый сервис и маршрут отката.
Если хотя бы один пункт неясен, сначала запускайте малый трафик и не переводите production целиком.
7. Выбор по ограничениям
Порядок выбора: способны ли сеть и оплата долго работать стабильно, нужны ли фиксированный выход и аудит, и только затем — охват моделей и работа со счетами. Если китайский облачный OCR подходит, можно подключаться напрямую; если используется зарубежная визуальная модель, а людей для трансграничной эксплуатации нет, оцените местный шлюз. Для единой точки входа и расчётов в юанях можно создать тестовый ключ в ZSQH AI Gateway, прогнать небольшую партию изображений и затем увеличить объём; биллинг описан на странице тарифов.
Читайте также:
- Альтернативы OCR API: облака, open source и мультимодальные модели
- Закупка OCR API для бизнеса
- Ошибки OCR API: 401, 413, 429 и пустой результат
Частые вопросы
Стабильно ли прямое подключение к зарубежному OCR из Китая?
Зависит от местного выхода, времени суток, целевого региона и лимитов аккаунта — общего ответа нет. Наблюдайте несколько дней на реальных изображениях и реальном параллелизме, фиксируйте долю ошибок и P95, затем сравните со шлюзом; не делайте вывод по одному успешному запросу.
Передавать изображение через Base64 или по URL?
Для небольших изображений Base64 проще; для больших файлов, многостраничных PDF и высокого параллелизма предпочтительны URL или предподписанные адреса объектного хранилища — тело запроса заметно меньше. В любом случае проверьте ограничения размера, требования к формату и срок действия ссылки.
Как продолжить пакетное распознавание после прерывания?
Используйте хэш содержимого изображения как ключ идемпотентности, сохраняйте результаты пакетами и дозапускайте только отсутствующие. Перед повтором сверьте число записей в базе с числом исходных файлов, чтобы не задвоить данные и не принять половину пакета за полный результат.
Изменится ли формат результата после смены OCR-сервиса?
Обычно да. Имена полей, системы координат, уверенность и структура ошибок у разных движков различаются, а структурированный вывод требует повторной проверки схемы. При миграции сохраняйте старые результаты некоторое время и сравнивайте новый и старый вывод на фиксированных образцах.
Можно ли разбить счёт и расход по проектам?
Зависит от провайдера. До договора уточните, можно ли выгружать расход по проектам, ключам или моделям, включает ли счёт неудачные и повторные запросы и соответствует ли содержание счёта требованиям закупки.
