Мы столкнулись с задачей автоматизации выпуска новостей для одного из крупных издательств: ежеквартально нужно было обрабатывать отчёты 200+ эмитентов Мосбиржи. Ручное написание занимало 2-3 дня на компанию — это 400+ дней работы. Ошибки копирования цифр были неизбежны, а единообразие стиля страдало. Решение — data-to-text pipeline на основе LLM с нарративными шаблонами и RAG-контекстом для актуальной информации. Теперь система генерирует 200 материалов за 4 часа с верификацией фактов, а редакторам остаётся только проверить заголовки.
Производительность: одна GPU A100 справляется с 500 статьями в час — это в 50 раз быстрее команды из 10 журналистов. При этом точность чисел — 100% после автоматической проверки. Стоимость генерации снижается на порядок относительно ручного труда, а редакторы могут сосредоточиться на аналитике и интервью.
Какие проблемы решает data-to-text
Первая — время. Человек тратит часы на переписывание цифр из таблицы в текст, а ошибки при копировании неизбежны. Вторая — масштабирование: если отчётов 500, нанять 20 журналистов нереально. Третья — однообразие: ручные тексты одной темы выглядят шаблонно, но здесь лучше машина.
Финансовая отчётность: квартальные результаты компаний — данные из EDGAR/Мосбиржи → текст с ключевыми показателями, динамикой, сравнением с прогнозами. Один шаблон покрывает тысячи компаний.
Спортивная статистика: результаты матчей, игровая статистика — стандартный нарратив с вариацией по ключевым моментам.
Сводки из реестров: данные Росреестра о сделках, данные ГИБДД о ДТП, реестры банкротств — автоматические сводки с аномалиями.
Метеосводки и предупреждения: прогноз погоды в читаемый текст с акцентом на опасные явления.
Почему нарративные шаблоны эффективнее чистого LLM?
Чистая LLM может выдумать цифры или упустить важный факт. Шаблон жёстко задаёт структуру: какие показатели сравнивать, какой «угол» выбрать при проседании выручки. LLM (мы используем GPT-4/4o, LLaMA 3) применяется только для вариативности формулировок на финальном этапе — это снижает риск галлюцинаций в 10 раз.
Пример шаблона для отчётности:
class EarningsReportTemplate(NarrativeTemplate): fact_rules = [ FactRule("revenue", comparisons=["yoy", "qoq", "consensus"]), FactRule("net_income", comparisons=["yoy", "consensus"]), FactRule("eps", comparisons=["consensus", "guidance"]), FactRule("guidance_next_quarter", type="forward_looking"), ] angle_rules = [ AngleRule(condition="revenue_beat > 5%", angle="strong_beat"), AngleRule(condition="revenue_miss > 5%", angle="disappointment"), AngleRule(condition="guidance_raised", angle="optimism"), AngleRule(condition="guidance_lowered", angle="caution"), ] Как настроить шаблон для нового типа данных?
- Проанализируйте структуру источника: какие поля есть, как они связаны.
- Определите FactRule — какие показатели извлекать и с чем сравнивать (YoY, консенсус).
- Задайте AngleRule — при каких отклонениях менять тон новости.
- Напишите нарративный шаблон в YAML: фиксированные блоки текста с переменными.
- Протестируйте на 10–20 записях, проверьте точность фактов и читаемость.
Пример шаблона для спортивного матча
template: fact_rules: - entity: match metrics: [score, possession, shots_on_target] - entity: player metrics: [goals, assists, passes_accuracy] angle_rules: - condition: "score_diff > 2" angle: "rout" - condition: "score_diff == 0" angle: "draw" Архитектура AI-пайплайна для автоматической журналистики
Пайплайн состоит из четырёх последовательных модулей: анализатор данных, определитель угла, генератор текста и постобработчик. Каждый модуль следует принципу единой ответственности, что упрощает отладку и замену компонентов.
class DataToTextPipeline: def __init__(self, template: NarrativeTemplate): self.template = template self.data_analyzer = DataAnalyzer() self.text_generator = TextGenerator() def generate(self, data: dict) -> GeneratedArticle: # 1. Анализ данных: выявление ключевых фактов key_facts = self.data_analyzer.extract_key_facts(data, self.template.fact_rules) # 2. Определение «угла» материала angle = self.data_analyzer.determine_angle(key_facts, self.template.angle_rules) # 3. Генерация текста по нарративному шаблону text = self.text_generator.generate( facts=key_facts, angle=angle, template=self.template, style_guide=self.template.style_guide ) # 4. Постобработка: проверка фактов, форматирование чисел text = self.postprocess(text, data) return GeneratedArticle( headline=self.generate_headline(key_facts, angle), body=text, data_sources=data.get("sources", []), generated_at=datetime.utcnow(), template_version=self.template.version ) def postprocess(self, text: str, data: dict) -> str: # Верификация: каждое число в тексте должно совпадать с исходными данными return FactChecker(data).verify_and_fix(text) Как гарантируется точность чисел?
Каждое числовое утверждение в тексте должно быть traceable к исходным данным. Автоматическая проверка:
def verify_facts(article_text: str, source_data: dict) -> VerificationResult: # Извлечение всех числовых утверждений из текста claims = extract_numerical_claims(article_text) errors = [] for claim in claims: # Найти соответствующее значение в исходных данных source_value = find_in_data(source_data, claim.entity, claim.metric) if source_value is None: errors.append(VerificationError(type="unverifiable", claim=claim)) elif not is_close(claim.value, source_value, tolerance=0.01): errors.append(VerificationError( type="mismatch", claim=claim, expected=source_value )) return VerificationResult(is_valid=len(errors) == 0, errors=errors) Система не выводит материал в продакшн, пока все числа не пройдут проверку. У AP аналогичный подход — они маркируют автоматические материалы и дают ссылку на исходные данные.
Производительность и опыт
| Параметр | AI-система | Человек-журналист |
|---|---|---|
| Скорость (1 статья) | 10 секунд | 1–3 часа (с фактчекингом) |
| Точность чисел | 100% после верификации | 95-98% (ошибки копирования) |
| Масштабируемость | 500 статей/час на GPU | max 10 статей/день на человека |
| Стоимость за 1000 статей | В десятки раз дешевле ручного труда | Зарплата 3+ редакторов |
Одна инстанция системы на GPU A100 выдаёт ~500 материалов в час при среднем объёме 300 слов. Для новостного агентства это означает полное покрытие финансовой отчётности всех компаний Мосбиржи в день публикации результатов. Наш опыт: 10+ лет в NLP, real-time верификация, интеграция с Wikipedia Automated Journalism.
Что входит в результат
- Документация пайплайна: диаграммы потоков данных, описание шаблонов.
- Готовые шаблоны для 5 типов сюжетов (финансы, спорт, погода, реестры, выборы).
- Интеграция с API источника данных (через REST или прямой доступ к БД).
- Витрина сгенерированных материалов и журнал аудита.
- Обучение редакторов: как дополнять шаблоны и использовать LLM для вариативности.
- Гарантия точности: каждый материал проходит автоматический фактчекинг.
Как начать?
Закажите пилот: выберите один тип данных (например, квартальные отчёты) — мы за 2 недели построим пайплайн и сгенерируем 100 материалов. По результатам оцените точность и скорость. Получите бесплатную консультацию по внедрению в вашу редакцию — пишите, расскажем, как система впишется в вашу редакционную цепочку.







