사용자 제공 내용을 분석·보완하여 팀 세미나 PPT를 생성한다. $ARGUMENTS에 주제, 발표자(--presenter), 날짜(--date), 장소(--location), 발표 시간(--time), 저장 경로(--path)를 지정할 수 있다.

템플릿 경로: D:\00_GSIM\8_세미나준비\템플릿\[초안] 팀세미나_마스터슬라이드_1차.pptx


STEP 1 — 입력 분석

사용자 메시지와 $ARGUMENTS에서 아래를 추출한다.

항목추출 방법기본값
주제/제목메시지에서 직접 추출사용자에게 확인
발표자--presenter 또는 메시지”발표자” (나중에 수정 가능)
날짜--date 또는 메시지오늘 날짜 (YYYY. MM. DD.)
장소--location 또는 메시지공란
발표 시간--time 또는 메시지10분 (= 약 7~8슬라이드)
저장 경로--path 또는 메시지{현재 프로젝트 루트}/ai_history/ppt/
내용 MD첨부된 마크다운 또는 설명없으면 리서치 필요

슬라이드 수 가이드 (발표 시간 기준):

  • 5분 → 4~5슬라이드
  • 10분 → 7~9슬라이드
  • 15분 → 11~13슬라이드
  • 20분+ → 15~18슬라이드

STEP 2 — 내용 충분성 판단 및 리서치

충분성 기준

아래 중 하나라도 해당하면 gemini-researcher 에이전트를 실행한다.

  • 사용자 제공 내용만으로 슬라이드 분량을 채우기 어렵다 (내용이 단편적)
  • 기술·도구·제도·논문 등 사실 확인이 필요한 내용이 포함됨
  • 최신 동향, 버전, 통계 등 현재 시점 정보가 필요함
  • 사용자가 “잘 모르겠어”, “찾아봐줘” 등을 명시한 경우

리서치 요청 시 gemini-researcher에게 전달할 내용

주제: {주제명}
목적: 팀 세미나 발표 자료 작성
조사 항목:
  1. 주제의 정의 및 배경
  2. 핵심 개념 3~5가지 (각각 설명 포함)
  3. 주요 특징, 장단점, 한계
  4. 실제 활용 사례 또는 예시
  5. 결론/시사점에 쓸 수 있는 핵심 메시지 1~2개
  6. 신뢰할 수 있는 참고 자료 URL
확인 사항: 불확실한 정보는 명시하고, 최신 출처(공식 문서, 논문, 뉴스) 우선

⚠️ 중요 원칙: 리서치 결과에서 확인되지 않은 내용은 슬라이드에 포함하지 않는다. 확인할 수 없는 내용은 “추가 확인 필요” 표시 후 사용자에게 알린다.


STEP 3 — 슬라이드 구조 설계

수집된 내용을 바탕으로 슬라이드 아웃라인을 작성한다.

레이아웃 선택 기준

레이아웃 idx이름사용 시점
0인트로 슬라이드맨 앞 표지 (1장)
1목차 슬라이드전체 목차 (1장, 선택)
2개인인트로 슬라이드발표자 소개 슬라이드 (1장)
3개인목차 슬라이드개인 발표 목차 (1장)
4간지 슬라이드각 섹션 시작 구분선
5내용 슬라이드본문 내용 (대부분)
6빈 슬라이드이미지/도표 중심 슬라이드
7아웃트로 슬라이드마지막 마무리 (1장)

기본 구조 (최소)

1. 인트로 슬라이드 (표지)
2. 개인인트로 슬라이드 (발표자 소개 + 섹션 목록)
3. 개인목차 슬라이드 (상세 목차)
4. 간지 슬라이드 (섹션 1 시작)
5. 내용 슬라이드 × N (섹션 내용)
6. [간지 + 내용] × M (추가 섹션, 있을 경우)
7. 내용 슬라이드 (결론 및 시사점)
8. 내용 슬라이드 (참고 자료)
9. 아웃트로 슬라이드

아웃라인 확인

아웃라인을 사용자에게 먼저 보여주고 승인을 받은 후 PPT를 생성한다.

📋 슬라이드 구조 (총 N장)
──────────────────────────
[1] 인트로  — {발표 제목}
[2] 개인인트로 — {발표자} / {섹션 목록}
[3] 개인목차 — {세부 목차}
[4] 간지 — {섹션명 1}
[5] 내용 — {슬라이드 제목}
...
[N] 아웃트로
──────────────────────────
이 구조로 PPT를 생성할까요?

STEP 3.5 — Mermaid 다이어그램 → PNG 변환 (선택)

슬라이드 내용에 흐름도, 시퀀스 다이어그램, 아키텍처 구조 등 시각적 다이어그램이 필요하다고 판단되는 경우 이 단계를 실행한다.

판단 기준 (아래 중 하나면 Mermaid 생성)

  • 단계별 흐름/프로세스 설명이 있는 슬라이드
  • 컴포넌트 간 관계/아키텍처 설명
  • 시스템 동작 순서가 있는 내용
  • 사용자가 “다이어그램”, “도식”, “흐름도” 등을 명시

Mermaid 작성 규칙

  • 방향: 세로(graph TD) 권장, 가로는 슬라이드 폭이 부족할 수 있으므로 주의
  • 한 슬라이드에 다이어그램 1개
  • 노드 텍스트는 간결하게 (15자 이내 권장)
  • 색상은 지정하지 않음 (배경색과 충돌 방지)

변환 명령

# 임시 .mmd 파일 작성 후 PNG 변환
cat > /tmp/diagram_{슬라이드번호}.mmd << 'MMDEOF'
{mermaid 코드}
MMDEOF
 
npx -y @mermaid-js/mermaid-cli \
  -i /tmp/diagram_{슬라이드번호}.mmd \
  -o {프로젝트루트}/ai_history/ppt/img/diagram_{슬라이드번호}.png \
  --backgroundColor white

변환 성공 시 PNG 경로를 기록해두고 STEP 4 Python 스크립트에서 prs.slides[n].shapes.add_picture()로 삽입한다.

Python 스크립트에서 이미지 삽입 방법 (레이아웃 5 기준)

from pptx.util import Inches, Emu
 
# 내용 슬라이드에 이미지 삽입 (오른쪽 영역 기준)
slide.shapes.add_picture(
    image_path,
    left=Inches(7.2),    # 슬라이드 오른쪽 절반
    top=Inches(1.5),
    width=Inches(5.5),
    height=Inches(4.5)
)

이미지가 있는 슬라이드는 레이아웃 5(내용) 또는 레이아웃 6(빈) 을 사용하고, 텍스트(idx=10, 12)는 왼쪽, 이미지는 오른쪽에 배치하는 것이 기본 구성이다.


STEP 4 — PPT 생성 Python 스크립트 작성 및 실행

아웃라인이 확정되면 Python 스크립트를 생성하고 Bash로 실행한다.

스크립트 작성 규칙

  1. 템플릿 열기: Presentation(template_path)
  2. 기존 슬라이드 모두 삭제: XML 조작으로 sldIdLst 비우기
  3. 새 슬라이드 추가: prs.slides.add_slide(prs.slide_layouts[idx])
  4. 텍스트 삽입: placeholder idx로 접근해 .text 설정
  5. 스피커 노트 추가: slide.notes_slide.notes_text_frame.text = "..." (선택)
  6. 저장: prs.save(output_path)

레이아웃별 Placeholder 인덱스 참조

레이아웃 0 — 인트로 슬라이드

  • idx=0: 발표 제목 (CENTER_TITLE)
  • idx=10: 발표자 이름/직책 (예: 홍길동 연구원)
  • idx=11: 날짜 및 장소 (예: 2025. 12. 19. 한맥빌딩 옥상 파고라)
  • idx=12: “발표 인원” 레이블 → 그대로 유지
  • idx=13: “발표 장소 및 일정” 레이블 → 그대로 유지

레이아웃 1 — 목차 슬라이드

  • idx=11: 전체 목차 텍스트 (줄바꿈으로 구분)

레이아웃 2 — 개인인트로 슬라이드

  • idx=0: {섹션번호}__{발표 제목} / {발표자이름} (예: 01__HTMX 검토안 / 홍길동 연구원)
  • idx=12: 섹션 목록 (줄바꿈 구분, 예: 01__HTMX 정의\n02__HTMX 개념\n...)

레이아웃 3 — 개인목차 슬라이드

  • idx=10: 섹션 목록 (개인인트로와 동일 내용)
  • idx=0: {섹션번호}__{발표 제목} (예: 01__HTMX 검토안)
  • idx=11: 발표자 이름 (예: 홍길동 연구원)

레이아웃 4 — 간지 슬라이드

  • idx=0: 현재 섹션명 (예: 01__HTMX 정의)
  • idx=11: 상위 발표 제목 (예: 01__HTMX 검토안)
  • idx=12: 발표자 이름
  • idx=13: 하위 소제목 (예: HTMX란?)

레이아웃 5 — 내용 슬라이드

  • idx=0: 슬라이드 제목
  • idx=10: 핵심 본문 내용
  • idx=12: 보조 설명 (선택, 없으면 공란)
  • idx=13: 이미지 캡션 (선택, 없으면 공란)
  • idx=14: 브레드크럼 (현재 섹션명, 예: 01__HTMX 정의)

레이아웃 6 — 빈 슬라이드

  • idx=0: 제목
  • idx=14: 텍스트 (자유 형식)

레이아웃 7 — 아웃트로 슬라이드

  • placeholder 없음 (그대로 사용)

스크립트 실행 방법

python - << 'PYEOF'
import sys
sys.stdout.reconfigure(encoding='utf-8')
from pptx import Presentation
from pptx.util import Pt
from lxml import etree
import copy
 
TEMPLATE_PATH = r"D:\00_GSIM\8_세미나준비\템플릿\[초안] 팀세미나_마스터슬라이드_1차.pptx"
OUTPUT_PATH = r"{프로젝트루트}\ai_history\ppt\{파일명}.pptx"
 
prs = Presentation(TEMPLATE_PATH)
 
# 기존 슬라이드 모두 삭제 (마스터/레이아웃은 유지)
sldIdLst = prs.slides._sldIdLst
for sId in list(sldIdLst):
    sldIdLst.remove(sId)
 
def add_slide(layout_idx):
    layout = prs.slide_layouts[layout_idx]
    return prs.slides.add_slide(layout)
 
def set_ph(slide, idx, text):
    """placeholder idx로 텍스트 설정. 없으면 무시."""
    for shape in slide.placeholders:
        if shape.placeholder_format.idx == idx:
            shape.text = text
            return
 
def add_notes(slide, text):
    """스피커 노트 추가."""
    notes_slide = slide.notes_slide
    notes_slide.notes_text_frame.text = text
 
# ============================================================
# 슬라이드 생성 (아래 내용을 아웃라인에 맞게 채워 넣음)
# ============================================================
 
# 예시: 인트로 슬라이드
slide = add_slide(0)
set_ph(slide, 0, "{발표 제목}")
set_ph(slide, 10, "{발표자} {직책}")
set_ph(slide, 11, "{날짜} {장소}")
 
# ... (각 슬라이드 추가)
 
# 아웃트로
add_slide(7)
 
prs.save(OUTPUT_PATH)
print(f"저장 완료: {OUTPUT_PATH}")
PYEOF

STEP 5 — 신뢰도 처리 원칙

상황처리 방법
확실히 아는 내용그대로 슬라이드에 작성
리서치로 확인된 내용출처 슬라이드에 URL 기재
불확실하지만 논리적 추론 가능슬라이드에 포함하되 “(추정)” 표시
확인 불가 / 모르는 내용슬라이드 제외 + 사용자에게 별도 안내

절대 지어내지 않는다. 모른다면 “이 부분은 확인이 필요합니다”라고 명시한다.


STEP 6 — 완료 보고

PPT 생성 완료 후 아래를 보고한다.

  1. 저장 경로 (전체 경로)
  2. 슬라이드 수 및 각 슬라이드 요약 (제목만)
  3. 리서치 출처 (gemini-researcher를 사용한 경우, 사용된 URL 목록)
  4. 불확실/미포함 내용 (있을 경우) — 사용자가 직접 추가/수정해야 할 부분
  5. 스피커 노트 작성 여부

주의사항

  • python-pptx가 설치되어 있어야 한다 (pip install python-pptx)
  • Mermaid 변환은 npx @mermaid-js/mermaid-cli를 사용한다 (Node.js 필요, npx로 자동 설치)
  • Mermaid PNG는 {프로젝트루트}/ai_history/ppt/img/ 에 저장하고, PPT 저장 후 삭제하지 않는다
  • 이미지 삽입이 필요하나 Mermaid로 표현하기 어려운 경우(사진, 스크린샷 등), 이미지 캡션(idx=13)으로 대체하고 사용자에게 안내한다
  • 슬라이드 내 텍스트가 너무 길면 가독성이 떨어진다 → 한 슬라이드당 핵심 내용 3~5줄 권장
  • 발표 시간이 명시되지 않은 경우 10분(8슬라이드 내외)을 기본으로 한다