AI-введення тексту та документів у мобільному додатку
Вступ: проблема
Користувач відкриває мобільний додаток, прикріплює PDF контракту і запитує: «На якому терміні розривається договір?» На перший погляд — типовий сценарій. Але між file_picker і осмисленою відповіддю моделі — десяток нетривіальних рішень: від рендерингу кожної сторінки скана до чанкінгу 100-сторінкового файлу, що не влізає в контекст. Ми реалізували такий функціонал для кількох проєктів — фінансових, юридичних, медичних — і знаємо кожен підводний камінь. Помилка в одній ланці — і відповідь моделі безглузда, або ви ризикуєте отримати блокування за невідповідність App Store Review Guidelines щодо користувацького контенту. Щоб цього уникнути, розберемо ключові етапи: вибір способу передачі, обробка сканів, організація RAG для великих обсягів.
Які проблеми ми вирішуємо?
- Конвертація PDF у текст: більшість LLM приймають текст, а не PDF. Потрібна конвертація без втрати змісту.
- Скановані документи без текстового шару: PDF з відсканованих сторінок не містять тексту — потрібен OCR.
- Обмеження контексту моделі: 100-сторінковий документ не вміщається в контекстне вікно — потрібен RAG.
- Різниця платформ: на Android і iOS різні API для роботи з PDF та OCR, що ускладнює крос-платформену реалізацію.
- Обробка великих файлів: завантаження всього документа в пам'ять може призвести до OutOfMemoryError на мобільному пристрої.
- Безпека та конфіденційність: передача чутливих даних через сторонні API вимагає шифрування та обережного підходу.
Як обрати між Files API та клієнтською екстракцією?
Вибір залежить від формату документів, вимог до швидкості та безпеки. Files API підходить для простих PDF/DOCX, але не працює зі сканами. Клієнтська екстракція дає контроль над даними і швидше для невеликих файлів. RAG необхідний для документів понад 50 сторінок, щоб уникнути перевищення контексту.
Як ми це робимо
Два основні підходи до передачі документа в LLM
Прямий upload через Files API OpenAI Assistants API та Gemini Files API приймають PDF, DOCX, TXT напряму. Для мобільного додатка це найчистіший шлях: завантажуємо файл, отримуємо file_id, вставляємо в messages[]. Але є обмеження — у OpenAI ліміт 512 МБ на файл і 100 файлів на assistant, і Files API прив'язаний до Assistants/Batch, не до Chat Completions.
Вилучення тексту на клієнті Для PDF на Android — PdfRenderer (вбудований з API 21) для рендерингу сторінок у Bitmap + OCR через ML Kit TextRecognizer, або порт Apache PDFBox. На iOS — PDFKit + PDFPage.string для машинописного PDF; для сканів — Vision framework з VNRecognizeTextRequest. Текст передається в content[] як рядок. PDFKit documentation: https://developer.apple.com/documentation/pdfkit
Проблема сканованих документів PDFKit.string поверне порожній рядок для PDF з відсканованих сторінок — там немає текстового шару. ML Kit TextRecognizer справляється, але потрібно рендерити кожну сторінку в Bitmap/CGImage і прогоняти через OCR. Для 50-сторінкового документа це 2–5 секунд на пристрої.
Архітектурне рішення для великих документів
Повний текст 100-сторінкового договору не влізе в контекстне вікно більшості моделей — або влізе, але дорого. Правильний шлях для об'ємних документів — RAG: розбиваємо на чанки по 500–1000 токенів з перекриттям 50–100 токенів, індексуємо у векторну БД, при запиті шукаємо топ-5 релевантних чанків і тільки їх передаємо в context. Економія на токенах — до 40% (приблизно $200 на місяць для середнього проєкту, а для великих — до $500). Для документів до 10 сторінок клієнтська екстракція працює в 3 рази швидше, ніж завантаження через Files API. RAG також знижує вартість токенів у 1.7 раза порівняно з прямою передачею повного тексту, а для дуже великих документів — у 2 рази.
Для мобільного додатка це зазвичай означає серверну обробку: клієнт завантажує файл на бекенд, бекенд займається чанкінгом та ембеддінгами. На клієнті залишається тільки UI запиту і рендеринг відповіді. Реалізовувати векторний пошук прямо на телефоні має сенс тільки для офлайн-сценаріїв.
Кейс: фінансовий додаток з контрактами
Для фінансового клієнта ми реалізували пайплайн: завантаження PDF через UIDocumentPickerViewController на iOS, рендеринг сторінок через PDFKit + OCR VNRecognizeTextRequest для сканів, чанкінг тексту по 1000 токенів з перекриттям 100 токенів, індексація в ChromaDB, запит до GPT-4 через RAG. Результат: час відповіді на типовий запит скоротився з 8 до 1.2 секунди, витрати на токени зменшились на 40% (економія близько $300 на місяць).
Порівняння підходів
| Подхід | Швидкість | Вартість токенів | Підтримка сканів |
|---|---|---|---|
| Прямий Files API | Швидко (сервер) | Висока (весь текст) | Так (якщо є текст) |
| Клієнтська екстракція + текст | Середньо (залежить від об'єму) | Середня (тільки текст) | Так (OCR на клієнті) |
| RAG з серверним чанкінгом | Повільно (індексація), швидко (запит) | Низька (тільки релевантні чанки) | Так (якщо є OCR) |
Формати та ліміти
| Формат | Android | iOS | Ліміт API (OpenAI) |
|---|---|---|---|
| PDF (текст) | PdfRenderer + PDFBox | PDFKit | 512 МБ |
| PDF (скан) | ML Kit OCR | Vision VNRecognizeTextRequest | — (потрібна попередня обробка) |
| DOCX | Apache POI (Java) | — | 512 МБ (через Files API) |
| TXT / MD | Нативно | Нативно | Без обмежень |
| XLSX | Apache POI | — | 512 МБ |
DOCX на iOS без сторонніх бібліотек — біль. Або серверна конвертація (LibreOffice headless), або обмежуйте підтримку форматів PDF + TXT для мобільного клієнта.
Процес оцінки та роботи
- Збір вимог: аналізуємо формати документів, обсяги, вимоги до офлайн-режиму та безпеки.
- Аудит поточного рішення: оцінюємо, чи є вже реалізована завантаження та обробка.
- Проектування: вибираємо оптимальну стратегію (Files API vs клієнтська екстракція vs RAG), проектуємо архітектуру.
- Оцінка: визначаємо обсяг робіт та орієнтовну вартість (фіксована ціна після аналізу).
- Розробка: реалізуємо завантаження файлів, конвертацію, OCR, інтеграцію з LLM, індикатори прогресу.
- Тестування: на реальних документах різної якості.
- Запуск та документація: навчаємо команду, передаємо документацію.
Що входить у роботу під ключ
- Документація API та архітектури
- Доступ до репозиторію з кодом
- Інструкція по розгортанню серверної частини
- Навчання команди (1-2 сесії)
- Підтримка протягом 1 місяця після запуску
- Тестовий набір документів (20+ файлів різних форматів)
Орієнтири за термінами
- Базова підтримка PDF + TXT з прямою передачею — 1–2 тижні.
- Повноцінний pipeline з OCR, кількома форматами та RAG для великих документів — 4–6 тижнів.
Вартість визначається після аналізу вашого проєкту. Напишіть нам для безкоштовної оцінки — отримайте готове рішення за 6 тижнів.
Типові помилки при реалізації
- На Android PdfRenderer вимагає ParcelFileDescriptor з флагом MODE_READ_ONLY. Якщо файл прийшов через content:// URI від FileProvider, потрібен contentResolver.openFileDescriptor(). Прямий File() від content:// кидає FileNotFoundException — поширена помилка у тих, хто не працював з SAF.
- Багатосторінкові документи потрібно обробляти посторінково, не завантажуючи все в пам'ять одразу. PdfRenderer.Page потрібно закривати після кожної сторінки — page.close() обов'язковий, інакше IllegalStateException на наступній ітерації.
- На iOS PDFDocument(url:) може повернути nil для зашифрованих PDF. Перевіряйте isEncrypted та запитуйте пароль через UI, а не краштесь мовчки.
- Для сканованих PDF не використовуйте PDFKit.string — він поверне порожній рядок. Обов'язково застосовуйте OCR.
Чому обирають нас
Ми — команда мобільних розробників з 5+ роками досвіду у створенні AI-рішень під iOS та Android. Реалізували більше 20 інтеграцій мультимодального вводу для фінансових, юридичних та медичних проєктів. Гарантуємо якість коду та дотримання термінів. Зв'яжіться з нами для оцінки вашого проєкту — підберемо оптимальне рішення під ваш бюджет.







