Реализация AI-суммаризации текста на сайте
Суммаризация — одна из самых востребованных задач для контентных сайтов: новостные агрегаторы, юридические порталы, медицинские справочники, базы знаний. Пользователь получает краткое изложение за 2–3 секунды вместо чтения 10-страничного документа.
Подходы к суммаризации
Экстрактивная суммаризация — выбор ключевых предложений из исходного текста без изменения формулировок. Быстро, предсказуемо, не галлюцинирует. Реализуется через sumy, gensim, или алгоритм TextRank.
Абстрактивная суммаризация — генерация нового текста, передающего суть. Качество выше, но требует LLM. Используйте для коротких текстов до 4000 токенов.
Гибридный подход — сначала экстрактивный метод уменьшает текст до 20% от оригинала, затем LLM формирует финальное изложение. Работает с документами любой длины.
Интеграция через LLM API
Для большинства задач достаточно OpenAI GPT-4o-mini или Anthropic Claude Haiku — они дешевле флагманских моделей и справляются с суммаризацией хорошо.
from openai import OpenAI
client = OpenAI()
def summarize_text(text: str, max_words: int = 150, language: str = "ru") -> str:
prompt = f"""Составь краткое изложение следующего текста на {language} языке.
Максимум {max_words} слов. Сохрани ключевые факты, цифры и выводы.
Не добавляй вводных фраз типа "В данном тексте рассматривается".
Текст:
{text}"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
max_tokens=300,
temperature=0.3
)
return response.choices[0].message.content
Температура 0.3 даёт стабильные результаты без излишней вариативности.
Обработка длинных документов
Окно контекста GPT-4o-mini — 128k токенов, но отправлять туда целый документ дорого. Оптимальная схема для текстов от 5000 слов:
- Разбить документ на чанки по 1500–2000 слов с перекрытием 200 слов
- Суммаризировать каждый чанк независимо
- Объединить промежуточные саммари и суммаризировать повторно
def chunk_text(text: str, chunk_size: int = 1500, overlap: int = 200) -> list[str]:
words = text.split()
chunks = []
start = 0
while start < len(words):
end = start + chunk_size
chunks.append(" ".join(words[start:end]))
start = end - overlap
return chunks
def summarize_long_document(text: str) -> str:
chunks = chunk_text(text)
chunk_summaries = [summarize_text(chunk, max_words=100) for chunk in chunks]
combined = "\n\n".join(chunk_summaries)
return summarize_text(combined, max_words=200)
Кэширование результатов
Суммаризация одного и того же текста повторно — пустая трата денег. Кэшировать нужно по хэшу исходного текста:
import hashlib
import redis
cache = redis.Redis()
CACHE_TTL = 86400 * 7 # 7 дней
def get_summary_cached(text: str, **kwargs) -> str:
key = "summary:" + hashlib.sha256(text.encode()).hexdigest()
cached = cache.get(key)
if cached:
return cached.decode()
result = summarize_text(text, **kwargs)
cache.setex(key, CACHE_TTL, result)
return result
Варианты подачи на сайте
Кнопка "Кратко" рядом со статьёй — суммаризация по запросу, результат появляется в модальном окне или expandable блоке. Не нагружает сервер при загрузке страницы.
Автоматический анонс — при публикации контента редактором суммаризация запускается в фоне, результат сохраняется в отдельном поле и используется как meta description или превью.
Прогрессивное раскрытие — на странице категорий показывается саммари, по клику — полный текст. Ускоряет навигацию.
Локализация и тональность
Для мультиязычных сайтов важно явно указывать язык в промпте. Тон суммаризации настраивается:
- Нейтральный (новости, справочники)
- Формальный (юридические и медицинские тексты)
- Простой (переложение для широкой аудитории)
Добавьте параметр tone в функцию и меняйте соответствующую часть промпта.
Стоимость
GPT-4o-mini: input $0.15 / 1M токенов, output $0.60 / 1M токенов. Суммаризация статьи в 2000 слов (~2700 токенов input + ~300 токенов output) обходится в $0.0006. При 10 000 суммаризаций в месяц — около $6.
Сроки
Базовая интеграция с API и кнопкой "Кратко" — 2–3 дня. Автоматическая генерация при публикации с кэшем — плюс 2 дня. Обработка длинных документов с чанкингом — плюс 1–2 дня.







