AI-автоматизация подготовки презентаций
Подготовка презентации для питча или отчёта занимает 4–8 часов дизайнера и 2–3 часа аналитика. AI-система генерирует структуру, тексты слайдов, подбирает иллюстрации и собирает готовый PPTX или Google Slides за 5–15 минут по брифу или набору данных.
Генератор структуры и контента презентации
from openai import AsyncOpenAI
from dataclasses import dataclass
import json
client = AsyncOpenAI()
@dataclass
class PresentationBrief:
title: str
purpose: str # pitch, report, educational, sales, internal
audience: str # investors, clients, board, employees, students
slides_count: int # желаемое количество слайдов
key_messages: list[str]
data_points: list[dict] = None # {"metric": "...", "value": "...", "context": "..."}
company_context: str = ""
duration_minutes: int = 15
style: str = "professional" # professional, minimal, bold, corporate
async def generate_presentation_structure(brief: PresentationBrief) -> dict:
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Ты — презентационный стратег и сторителлер.
Создай структуру презентации для аудитории: {brief.audience}.
Цель: {brief.purpose}. Длительность: {brief.duration_minutes} мин (~{brief.duration_minutes // brief.slides_count * 60} сек/слайд).
ПРИНЦИПЫ:
- Один слайд = одна идея
- Заголовок слайда = вывод, а не тема ("Выручка выросла на 40%" вместо "Финансовые результаты")
- Открытие: крючок — не "добрый день, меня зовут..."
- Закрытие: конкретный следующий шаг для аудитории
Для каждого слайда:
- slide_type: title, problem, data, solution, case_study, timeline, cta
- headline: заголовок-вывод
- key_points: 2–3 тезиса
- visual_suggestion: что изобразить
- speaker_notes: 2–3 предложения для спикера
Верни JSON: {{slides: [...]}}"""
}, {
"role": "user",
"content": f"""
Тема: {brief.title}
Ключевые сообщения: {', '.join(brief.key_messages)}
Данные: {json.dumps(brief.data_points or [], ensure_ascii=False)}
Контекст компании: {brief.company_context}
Количество слайдов: {brief.slides_count}
"""
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Генерация иллюстраций для слайдов
async def generate_slide_visual(
slide_type: str,
headline: str,
data_points: list = None,
style: str = "professional"
) -> str:
"""Возвращаем либо промпт для DALL-E, либо тип chart для Chart.js"""
CHART_SLIDES = {"data", "timeline", "comparison"}
if slide_type in CHART_SLIDES and data_points:
# Для слайдов с данными — генерируем chart spec
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": "Создай Chart.js конфигурацию для визуализации данных на слайде. Верни JSON с type, data, options."
}, {
"role": "user",
"content": f"Данные: {json.dumps(data_points, ensure_ascii=False)}\nЗаголовок слайда: {headline}"
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
# Для остальных — промпт для image generation
style_map = {
"professional": "clean corporate illustration, flat design, blue palette",
"minimal": "minimalist line art, monochrome, white background",
"bold": "bold graphic design, high contrast, modern typography"
}
return f"{headline}, {style_map.get(style, style_map['professional'])}, presentation slide visual, 16:9"
Сборка PPTX через python-pptx
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
import io
class PresentationBuilder:
def __init__(self, theme: dict):
self.prs = Presentation()
self.prs.slide_width = Emu(9144000) # 16:9 widescreen
self.prs.slide_height = Emu(5143500)
self.theme = theme
def add_content_slide(self, headline: str, key_points: list[str], notes: str = "") -> None:
layout = self.prs.slide_layouts[1] # Title and Content
slide = self.prs.slides.add_slide(layout)
# Заголовок
title = slide.shapes.title
title.text = headline
title.text_frame.paragraphs[0].font.size = Pt(28)
title.text_frame.paragraphs[0].font.color.rgb = RGBColor(*self.theme["primary"])
# Контент
body = slide.placeholders[1]
tf = body.text_frame
tf.clear()
for point in key_points:
p = tf.add_paragraph()
p.text = point
p.font.size = Pt(18)
p.level = 0
# Заметки спикера
if notes:
notes_slide = slide.notes_slide
notes_slide.notes_text_frame.text = notes
def save(self) -> bytes:
buf = io.BytesIO()
self.prs.save(buf)
return buf.getvalue()
Полный pipeline
async def create_presentation(brief: PresentationBrief) -> bytes:
# 1. Генерируем структуру
structure = await generate_presentation_structure(brief)
# 2. Генерируем визуалы параллельно
visual_tasks = [
generate_slide_visual(s["slide_type"], s["headline"], brief.data_points, brief.style)
for s in structure["slides"]
]
import asyncio
visuals = await asyncio.gather(*visual_tasks)
# 3. Собираем PPTX
builder = PresentationBuilder(theme={"primary": (67, 97, 238)})
for slide_data, visual in zip(structure["slides"], visuals):
builder.add_content_slide(
headline=slide_data["headline"],
key_points=slide_data["key_points"],
notes=slide_data.get("speaker_notes", "")
)
return builder.save()
Экспорт в Google Slides
Через Google Slides API система создаёт презентацию в корпоративном аккаунте: загружает сгенерированный контент, применяет Slides Theme компании, расшаривает по email. Для компаний, работающих в Google Workspace, это удобнее, чем генерация PPTX.
Варианты автоматизации:
- Webhook из Notion/Confluence → генерация презентации по шаблону страницы
- Еженедельные отчёты из BI-систем (Metabase, Grafana) → слайды с актуальными данными
- Pitch deck из одностраничного брифа за 10 минут
Генератор презентаций с PPTX-экспортом и 3 темами оформления — 2–3 недели. Платформа с Google Slides интеграцией, базой шаблонов по отраслям и авторасписанием отчётов — 6–8 недель.







