AI-система автоматической журналистики: генерация новостей из данных

Мы столкнулись с задачей автоматизации выпуска новостей для одного из крупных издательств: ежеквартально нужно было обрабатывать отчёты 200+ эмитентов Мосбиржи. Ручное написание занимало 2-3 дня на компанию — это 400+ дней работы. Ошибки копирования цифр были неизбежны, а единообразие стиля страдало

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

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

Как настроить шаблон для нового типа данных?

  1. Проанализируйте структуру источника: какие поля есть, как они связаны.
  2. Определите FactRule — какие показатели извлекать и с чем сравнивать (YoY, консенсус).
  3. Задайте AngleRule — при каких отклонениях менять тон новости.
  4. Напишите нарративный шаблон в YAML: фиксированные блоки текста с переменными.
  5. Протестируйте на 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 материалов. По результатам оцените точность и скорость. Получите бесплатную консультацию по внедрению в вашу редакцию — пишите, расскажем, как система впишется в вашу редакционную цепочку.