Мы столкнулись с задачей автоматизации выпуска новостей для одного из крупных издательств: ежеквартально нужно было обрабатывать отчёты 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 материалов. По результатам оцените точность и скорость. Получите бесплатную консультацию по внедрению в вашу редакцию — пишите, расскажем, как система впишется в вашу редакционную цепочку.







