사용자 제공 내용을 분석·보완하여 팀 세미나 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로 실행한다.
스크립트 작성 규칙
- 템플릿 열기:
Presentation(template_path) - 기존 슬라이드 모두 삭제: XML 조작으로 sldIdLst 비우기
- 새 슬라이드 추가:
prs.slides.add_slide(prs.slide_layouts[idx]) - 텍스트 삽입: placeholder idx로 접근해
.text설정 - 스피커 노트 추가:
slide.notes_slide.notes_text_frame.text = "..."(선택) - 저장:
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}")
PYEOFSTEP 5 — 신뢰도 처리 원칙
| 상황 | 처리 방법 |
|---|---|
| 확실히 아는 내용 | 그대로 슬라이드에 작성 |
| 리서치로 확인된 내용 | 출처 슬라이드에 URL 기재 |
| 불확실하지만 논리적 추론 가능 | 슬라이드에 포함하되 “(추정)” 표시 |
| 확인 불가 / 모르는 내용 | 슬라이드 제외 + 사용자에게 별도 안내 |
절대 지어내지 않는다. 모른다면 “이 부분은 확인이 필요합니다”라고 명시한다.
STEP 6 — 완료 보고
PPT 생성 완료 후 아래를 보고한다.
- 저장 경로 (전체 경로)
- 슬라이드 수 및 각 슬라이드 요약 (제목만)
- 리서치 출처 (gemini-researcher를 사용한 경우, 사용된 URL 목록)
- 불확실/미포함 내용 (있을 경우) — 사용자가 직접 추가/수정해야 할 부분
- 스피커 노트 작성 여부
주의사항
- 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슬라이드 내외)을 기본으로 한다