AI-сумаризація довгих текстів: як вмістити все в контекстне вікно
Сумаризація довгого тексту одразу впирається в обмеження контекстного вікна моделі. GPT-4o приймає 128K токенів (приблизно 100K слів), Claude 3 — 200K. На перший погляд цього достатньо, але юридичні договори на 200 сторінок, технічні звіти або книги часто перевищують ліміт. Навіть якщо текст вміщується, довгий контекст збільшує вартість і затримку відповіді. Наприклад, типовий договір поставки може містити 150 сторінок дрібного тексту — прямий запит коштуватиме ~$0.03 за обробку, але результат може бути неповним через ефект "втрати середини". Про це говорить дослідження Lost in the Middle — модель гірше запам'ятовує інформацію з середини документа. Тому для великих документів потрібні стратегії декомпозиції.
Ми використовуємо три основні стратегії: пряму сумаризацію, Map-Reduce та Refine. Кожна підходить для свого обсягу та вимог до якості. Нижче — деталі.
Стратегії для текстів різної довжини
| Стратегія | Об'єм токенів | Час | Якість | Складність |
|---|---|---|---|---|
| Пряма сумаризація | до 80K | Низьке | Висока | Низька |
| Map-Reduce | до 500K+ | Низьке (паралельно) | Середня | Середня |
| Refine | будь-який | Високе (послідовно) | Дуже висока | Висока |
Пряма сумаризація — працює для текстів до 50–80K токенів. Відправляємо весь текст одним запитом, просимо сумаризувати. Просто, дешево по реалізації. Обмеження — вартість токенів та latency (модель обробляє великий контекст повільніше).
Map-Reduce — для текстів, що не вміщуються в контекст. Розбиваємо на чанки → сумаризуємо кожен чанк → сумаризуємо сумари:
Приклад реалізації Map-Reduce
async def map_reduce_summarize(text: str, chunk_size: int = 4000) -> str: chunks = split_text(text, chunk_size) chunk_summaries = await asyncio.gather(*[ summarize_chunk(chunk) for chunk in chunks ]) combined = "\n\n".join(chunk_summaries) if count_tokens(combined) > chunk_size: return await map_reduce_summarize(combined, chunk_size) return await summarize_final(combined) asyncio.gather — паралельні запити до API для всіх чанків одночасно. Для 10 чанків час майже такий самий, як для одного. Map-Reduce працює в 5–10 разів швидше за Refine.
Refine — сумаризуємо перший чанк, потім уточнюємо сумари з кожним наступним чанком. Підсумкове сумари послідовно збагачується. Якість вища, ніж Map-Reduce для зв'язних наративних текстів, але повільніше — запити послідовні.
Як керувати токенами та уникнути помилок?
Головна помилка — не рахувати токени до відправки. tiktoken (Python) або gpt-tokenizer (JS) дають точний підрахунок:
import tiktoken enc = tiktoken.encoding_for_model("gpt-4o") token_count = len(enc.encode(text)) if token_count < 100_000: return await direct_summarize(text) elif token_count < 500_000: return await map_reduce_summarize(text, chunk_size=8000) else: return await map_reduce_summarize(text, chunk_size=4000) Різні типи сумари — різні промпти:
- Executive summary (для керівників): 3–5 речень, лише ключові рішення та цифри
- Детальний переказ: структурований список з підзаголовками
- Список ключових пунктів: булети без зв'язного тексту
- Відповідь на запитання: «що це за документ і що в ньому потрібно зробити»
На мобільному — пропонуємо користувачеві обрати тип сумари перед запуском. Розробка мобільних клієнтів ведеться на Swift (iOS) та Kotlin (Android).
Як уникнути дублювання в сумаризації?
При Map-Reduce фінальна сумаризація може повторювати схожі пункти з різних чанків. Дублювання усувається явним зазначенням у промпті: «Об'єднай схожі пункти, не повторюй одну думку двічі». Для юридичних та фінансових документів використовуємо structured output у форматі JSON з фіксованими полями (parties, obligations, deadlines, key_figures). Це надійніше за вільний текст.
Як налаштувати сумаризацію для вашого документа
- Визначте максимальний розмір контексту моделі (наприклад, 128K для GPT-4o).
- Розбийте текст на чанки по 4–8K токенів з урахуванням меж абзаців.
- Виберіть стратегію: пряма — для коротких текстів, Map-Reduce — для середніх, Refine — для зв'язних наративів.
- Налаштуйте промпти для кожного типу сумари (executive, детальний тощо).
- Реалізуйте кешування за хешем документа та відправку прогресу через SSE.
Прогрес сумаризації на мобільному
Сумаризація 100-сторінкового документа займає 15–60 секунд. Без індикатора прогресу — поганий UX. Серверна частина відправляє події через SSE:
event: progress data: {"step": "chunking", "total_chunks": 12, "completed": 0} event: progress data: {"step": "summarizing", "total_chunks": 12, "completed": 4} event: result data: {"summary": "...", "word_count": 450} На мобільному клієнті — прогрес-бар з описом кроку, анімований текст «Обробляю сторінки 1–25...».
Кешування
Сумаризація одного документа коштує грошей. Кешуйте результат за хешем вмісту документа + тип сумари. Redis з TTL 7–30 днів — стандартний підхід. Якщо документ змінився — інвалідація кешу за document_id. Завдяки кешуванню економія може сягати до 50% вартості.
Що входить у нашу роботу?
- Аналіз задачі та вибір стратегії (пряма, Map-Reduce, Refine)
- Розробка серверного pipeline з інтеграцією моделі
- Налаштування кешування та стрімінгу
- Мобільний UI з вибором типу сумари та прогрес-баром
- Тестування на реальних документах замовника
- Документація, навчання команди, підтримка 2 тижні після запуску
Ми — команда з 5+ роками досвіду в AI та 30+ успішними проєктами. Гарантуємо якість та конфіденційність.
Етапи та терміни
| Етап | Термін |
|---|---|
| Аналіз та проектування | 2–3 дні |
| Реалізація pipeline (Map-Reduce + стрімінг) | 1–2 тижні |
| Мобільний UI та тестування | 1–2 тижні |
| Повний запуск з кешуванням та навчанням | 3–5 тижнів |
Оцінимо ваш проєкт за 1 день — зв'яжіться з нами для консультації. Отримайте демо за 2–3 дні.







