AI summarization pipeline в n8n: как делать краткие summary без потери смысла и фактов ¶
Обновлено: 2026-05-29
Короткий ответ ¶
AI summarization pipeline нужен, когда нужно сжать длинный текст до полезного формата: summary тикета, протокол встречи, executive brief, digest писем, recap звонка, карточка клиента или краткий отчёт по инциденту. Надёжный pipeline не просто “делает кратко”, а заранее определяет тип summary, аудиторию, запрещённые потери, source anchors, формат output, проверку фактов и правила human review. Хорошее summary должно быть короче исходника, но не беднее по важным решениям, датам, суммам, рискам и next steps.
Почему summarization сложнее, чем кажется ¶
Суммаризация кажется простой: отправить текст в LLM и попросить “кратко пересказать”. В production это быстро ломается. Модель может опустить важный caveat, перепутать говорящих, обобщить спорное утверждение как факт, скрыть uncertainty или добавить вывод, которого не было в источнике. Для заметок это терпимо. Для поддержки, продаж, юридических документов и инцидентов — нет.
Summary — это не один универсальный формат. Для CEO нужен risk/impact/decision. Для инженера — symptoms/logs/actions. Для менеджера продаж — потребность, бюджет, возражения и next step. Для поддержки — проблема, что уже пробовали, текущий статус и что ответить клиенту. Поэтому pipeline должен начинаться с выбора summary type.
Типы summary ¶
| Тип | Что включает | Где использовать |
|---|---|---|
| Executive summary | impact, decision, risk, next action | отчёты руководству |
| Support summary | issue, attempted steps, customer impact, next action | тикеты и handover |
| Meeting recap | decisions, owners, deadlines, open questions | встречи и созвоны |
| Incident summary | timeline, impact, mitigation, root cause | postmortem/runbook |
| Sales summary | need, budget, objections, buying stage | CRM |
| Document abstract | тема, тезисы, ограничения, ссылки | база знаний |
Не смешивайте эти форматы. Если один workflow обслуживает разные каналы, добавьте classifier или явный параметр summary_type.
Архитектура workflow ¶
Production workflow:
- Trigger: новый тикет, завершённая встреча, email thread, uploaded document, incident log.
- Source loader: получить текст, transcript, thread или документ.
- Cleaning: убрать мусор, подписи, дубли, service messages.
- Segmentation: разделить по сообщениям, говорящим, времени или секциям.
- Summary type selector: определить аудиторию и формат.
- Fact extraction: отдельно извлечь даты, суммы, имена, decisions, blockers.
- Chunk summaries: если текст длинный, сделать summary по chunks.
- Merge summary: объединить chunks без потери facts.
- Validation: проверить обязательные поля, forbidden inference и source coverage.
- Human review: для high-risk summary.
- Publish/write: CRM, Slack, Notion, Google Docs, email.
- Log/evaluate: source_id, model, prompt version, summary length, review status.
Факт extraction лучше делать отдельно от creative summary. Так проще проверить, что ключевые даты и суммы не потерялись.
Формат output ¶
Пример schema для support summary:
{
"type": "object",
"required": ["issue", "customer_impact", "attempted_steps", "current_status", "next_action"],
"properties": {
"issue": { "type": "string" },
"customer_impact": { "type": "string" },
"attempted_steps": { "type": "array", "items": { "type": "string" } },
"current_status": { "type": "string" },
"next_action": {
"type": "object",
"required": ["owner", "action", "deadline"],
"properties": {
"owner": { "type": ["string", "null"] },
"action": { "type": "string" },
"deadline": { "type": ["string", "null"] }
}
},
"open_questions": { "type": "array", "items": { "type": "string" } },
"source_refs": { "type": "array", "items": { "type": "string" } }
}
}
Схема заставляет summary быть пригодным для workflow. Downstream node может создать задачу, заполнить CRM или отправить handover без ручного копирования.
Source anchors и проверяемость ¶
Для важных summary нужно хранить source anchors: message id, timestamp, paragraph id, page number или chunk id. Без anchors невозможно проверить спорное утверждение.
Пример:
{
"claim": "Клиент сообщил, что оплата прошла, но чек не пришёл",
"source_anchor": "email_thread_182#message_4",
"confidence": 0.92
}
Если summary публикуется руководству, не обязательно показывать anchors в тексте. Но они должны быть в логе.
Chunking для длинных документов ¶
Длинный документ нельзя просто обрезать до context window. Нужно разделить текст на смысловые блоки. Для встреч — по темам и говорящим. Для тикетов — по chronology. Для инцидентов — по времени. Для документов — по заголовкам.
Схема map-reduce:
- Разбить текст на chunks.
- Для каждого chunk получить local summary + facts + open questions.
- Объединить local summaries.
- Сверить global facts с исходными extracted facts.
- Проверить, что high-priority facts не потеряны.
Плохой merge-summary может стереть детали. Поэтому перед merge задайте “must preserve facts”.
Prompt для точной summarization ¶
Сделай support summary. Не добавляй факты, которых нет в источнике. Если данных нет, пиши null или "не указано". Не скрывай неопределённость. Сохрани даты, суммы, имена систем, error codes и next steps. Не пересказывай эмоциональные фразы, если они не влияют на решение.
Верни JSON по schema:
- issue
- customer_impact
- attempted_steps
- current_status
- next_action
- open_questions
- source_refs
Запрет inference должен быть явным. Иначе модель может “додумать” причину проблемы.
Validation summary ¶
Проверяйте:
- есть ли обязательные поля;
- не превышена ли максимальная длина;
- есть ли source_refs для ключевых claims;
- не появились ли даты/суммы, которых нет в source facts;
- не потерян ли decision/next action;
- нет ли forbidden phrases;
- не скрыта ли uncertainty.
Пример проверки дат:
const sourceDates = new Set($json.source_facts?.dates || []);
const summary = JSON.stringify($json.summary || {});
const foundDates = summary.match(/\b\d{4}-\d{2}-\d{2}\b/g) || [];
const unsupported = foundDates.filter(d => !sourceDates.has(d));
return [{ json: { ...$json, unsupported_dates: unsupported, valid: unsupported.length === 0 } }];
Такой простой тест ловит часть hallucination.
Ошибки summarization ¶
| Симптом | Причина | Решение |
|---|---|---|
| Summary красивое, но не полезное | нет аудитории и формата | выбрать summary_type |
| Потерялись next steps | prompt просит “кратко” | schema с next_action |
| Добавлены несуществующие выводы | нет запрета inference | требовать source_refs/null |
| Длинная встреча сжата неправильно | нет chunking | map-reduce summary |
| В CRM попал неверный статус | нет validation | facts extraction + checks |
| Summary не принимают операторы | нет evidence | показывать anchors |
Human review ¶
Review обязателен, если summary будет использоваться для:
- юридического документа;
- финансового решения;
- публичного ответа;
- отчёта руководству по инциденту;
- медицинских/финансовых данных;
- увольнения, штрафов, блокировок;
- автоматического изменения CRM стадии.
Оператор должен видеть исходник, summary, подсвеченные risky claims и список open questions. Review должен быть быстрым: approve, edit, reject.
Evals и метрики ¶
Метрики:
- factual consistency;
- coverage of required facts;
- compression ratio;
- hallucinated claim rate;
- missing next action rate;
- human edit distance;
- time saved;
- user/operator rating.
Eval case:
{
"case_id": "support_long_thread_receipt_missing",
"expected_must_include": ["чек не пришел", "payment succeeded", "проверить webhook receipt"],
"expected_must_not_include": ["возврат выполнен"],
"summary_type": "support"
}
После изменения prompt прогоняйте старые кейсы. Summary может стать короче, но хуже по фактам.
Production checklist ¶
- [ ] Определены summary types.
- [ ] Есть schema под каждый тип.
- [ ] Long docs обрабатываются через chunking.
- [ ] Facts extraction отделён от final summary.
- [ ] Ключевые claims имеют source anchors.
- [ ] Есть validation против unsupported facts.
- [ ] Есть human review для high-risk summary.
- [ ] Есть eval dataset.
- [ ] Логируются source_id, prompt_version, model.
- [ ] Есть policy: что делать с PII.