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







