AI-суммаризація довгих текстів в мобільних додатках
Суммаризація довгого тексту упирається в одне обмеження одразу: контекстне вікно моделі. GPT-4o приймає 128K токенів (приблизно 100K слів). Claude 3 — 200K. Звучить багато, але юридичний контракт на 200 сторінок, технічний звіт, книга — все це може перевищувати ліміт. І навіть якщо влізає — довгий контекст дорогий та сповільнює відповідь.
Стратегії для текстів різної довжини
Прямотекстна суммаризація — працює для текстів до 50–80K токенів. Відправляємо весь текст одним запитом, просимо суммаризувати. Просто, дешево по реалізації. Обмеження — вартість токенів та latency (модель обробляє великий контекст повільніше).
Map-Reduce — для текстів, які не влізають у контекст. Ділимо на чанки → суммаризуємо кожен → суммаризуємо суммарі:
async def map_reduce_summarize(text: str, chunk_size: int = 4000) -> str:
chunks = split_text(text, chunk_size)
# Map: суммаризуємо кожен чанк паралельно
chunk_summaries = await asyncio.gather(*[
summarize_chunk(chunk) for chunk in chunks
])
# Reduce: суммаризуємо результати
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 чанків час майже такий же, як для одного.
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)
Різні типи суммарі — різні промпти:
- Топ-менеджерське резюме: 3–5 речень, тільки ключові рішення та цифри
- Детальний переказ: структурований список з підзаголовками
- Список ключових пунктів: буллети без зв'язного тексту
- Відповідь на запитання: «що це за документ та що в ньому потрібно зробити»
На мобільному — пропонуємо користувачу вибрати тип суммарі перед запуском.
Прогрес суммаризації на мобільному
Суммаризація 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...».
Стриминг кінцевого суммарі — теж важливий. Користувач видить, як текст з'являється поступово, а не чекає кілька секунд повної відповіді.
Специфіка довгих документів
Втрата середини (Lost in the Middle). Дослідження показали: LLM гірше обробляють інформацію з середини довгого контексту порівняно з початком та кінцем. При Map-Reduce це не проблема — кожен чанк у своєму контексті. При прямотекстній суммаризації — важливо знати про обмеження.
Дублювання в суммарі. При Map-Reduce кінцева суммаризація може повторювати подібні пункти з різних чанків. Явно вказуйте в промпті: «Об'єднай подібні пункти, не повторюй одну думку двічі».
Структурований вивід. Для юридичних та фінансових документів суммарі у форматі JSON з фіксованими полями (parties, obligations, deadlines, key_figures) надійніше вільного тексту. OpenAI response_format: {"type": "json_object"} або Anthropic structured outputs.
Кешування
Суммаризація одного документа коштує грошей. Кешуйте результат за хешем вмісту документа + типом суммарі. Redis з TTL 7–30 днів — стандартний підхід. Якщо документ змінився — інвалідація кешу за document_id.
Етапи та термін
Визначення стратегії для різних розмірів документів → серверний pipeline з Map-Reduce → стриминговий API з прогресом → мобільний UI з вибором типу суммарі → кешування → тестування якості на реальних документах.
Базова суммаризація (до 100K токенів) з мобільним UI — 1–2 тижні. Повний pipeline з Map-Reduce, стримингом, кешуванням та кількома типами суммарі — 3–5 тижнів.







