AI-автоматизація підготовки презентацій
Підготовка презентації для pitch або звіту займає 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)
# Для інших — промпт для генерації зображень
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, ділиться електронною поштою. Для компаній, які працюють у Google Workspace, це зручніше, ніж генерація PPTX.
Варіанти автоматизації:
- Webhook з Notion/Confluence → генерація презентації за шаблоном сторінки
- Щотижневі звіти з BI-систем (Metabase, Grafana) → слайди з актуальними даними
- Pitch deck з односторінкового брифу за 10 хвилин
Генератор презентацій з PPTX-експортом та 3 темами оформлення — 2–3 тижні. Платформа з Google Slides інтеграцією, базою шаблонів за галузями та авторозписанням звітів — 6–8 тижнів.







