Skip to main content

AI-powered lecture material generator with multilingual support using LangChain

Project description

LectureForge ๐ŸŽ“

AI-Powered Lecture Material Generator using Multi-Agent Pipeline System

Python 3.11+ Version License: MIT Status Test Coverage

๐Ÿš€ v0.6.0 | ์ด๋ฏธ์ง€ ๋ฐฐ์น˜ ์ •๋ฐ€ํ™” โ€” create ์„œ๋ธŒ์„น์…˜ ์ค‘๊ฐ„ ๋ฐฐ์น˜ยทtranslate ์›๋ฌธ y0 ์œ„์น˜ ๋ณด์กด

PDF, ์›นํŽ˜์ด์ง€, ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์—์„œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๊ณ ํ’ˆ์งˆ ๊ฐ•์˜์ž๋ฃŒ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” AI ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํ†ต๊ณ„: 12๊ฐœ ์—์ด์ „ํŠธ | 9๊ฐœ ๋„๊ตฌ | 9๊ฐœ CLI ๋ช…๋ น | 1,891+ ํ…Œ์ŠคํŠธ (~81% ์ปค๋ฒ„๋ฆฌ์ง€) | ~$0.035/60๋ถ„ ๊ฐ•์˜ | Python 3.11 ๊ถŒ์žฅ

๋ฐ์ดํ„ฐ ์œ„์น˜: ~/Documents/LectureForge/ (์ผ๋ฐ˜ ํด๋”, Finder/ํƒ์ƒ‰๊ธฐ์—์„œ ๋ฐ”๋กœ ์ ‘๊ทผ)


๐Ÿ“‹ ๋ชฉ์ฐจ


โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

์ปจํ…์ธ  ์ƒ์„ฑ

  • ๐Ÿ“š ๋ฉ€ํ‹ฐ์†Œ์Šค ์ˆ˜์ง‘: PDF, URL, ์›น ๊ฒ€์ƒ‰์„ ํ†ตํ•œ ํฌ๊ด„์  ์ •๋ณด ์ˆ˜์ง‘
  • ๐Ÿ“ Location-based ์ด๋ฏธ์ง€ ๋งค์นญ: RAG ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ž๋™ ์ด๋ฏธ์ง€ ๋ฐฐ์น˜ (+750% ํ™œ์šฉ๋ฅ )
  • ๐Ÿ–ผ๏ธ ๋Œ€ํ™”ํ˜• ์ด๋ฏธ์ง€ ํŽธ์ง‘: ์ƒ์„ฑ๋œ ๊ฐ•์˜์˜ ์ด๋ฏธ์ง€ ์‚ญ์ œ/๊ต์ฒด (Vector DB ๊ธฐ๋ฐ˜ ๋Œ€์•ˆ ๊ฒ€์ƒ‰)
  • ๐ŸŽจ ๊ตฌ์กฐํ™”๋œ HTML ์ถœ๋ ฅ: Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ, ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค, ์ฝ”๋“œ ํ•˜์ด๋ผ์ดํŒ…
  • ๐ŸŽฌ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์Šฌ๋ผ์ด๋“œ: Reveal.js ๊ธฐ๋ฐ˜ ์ž๋™ ๋ณ€ํ™˜ (--to-slides) โ€” ์„น์…˜๋ณ„ LLM ์žฌ์ž‘์„ฑ (โ‰ค35์ž, ๋ง์ค„์ž„ํ‘œ ์—†์Œ), ๋ฐœํ‘œ์ž ๋…ธํŠธ ๊ธฐ๋ณธ ํฌํ•จ (--without-notes๋กœ ์ œ์™ธ)

ํ’ˆ์งˆ ๋ณด์ฆ

  • โœ… 6์ฐจ์› ํ’ˆ์งˆ ํ‰๊ฐ€: ์™„์„ฑ๋„, ํ๋ฆ„, ์‹œ๊ฐ„, ๋‚œ์ด๋„, ์‹œ๊ฐ์ž๋ฃŒ, ์ •ํ™•์„ฑ
  • ๐Ÿ”„ ์ž๋™ ๊ฐœ์„ : ํ’ˆ์งˆ ๊ธฐ์ค€ ๋ฏธ๋‹ฌ ์‹œ ์ตœ๋Œ€ 3ํšŒ ์ž๋™ ์ˆ˜์ •
  • ๐Ÿง  RMC ์ž๊ธฐ๊ฒ€ํ†  (v0.3.8+): ์—์ด์ „ํŠธ ๋‚ด๋ถ€ 2๋‹จ๊ณ„ ์ž๊ธฐ๋ฐ˜์„ฑ (Layer 1 ๊ฒ€ํ†  + Layer 2 ๊ฒ€ํ† ์˜ ๊ฒ€ํ† )
    • CurriculumDesigner: ์„น์…˜ ์ˆœ์„œ ๋…ผ๋ฆฌ์„ฑ, ํ•™์Šต๋ชฉํ‘œ ์ปค๋ฒ„๋ฆฌ์ง€, ์„ ์ˆ˜ ๋‚ด์šฉ ์ˆœ์„œ ์ž๋™ ๊ฒ€์ฆ ๋ฐ ์ˆ˜์ •
    • ContentWriter: ๊ฐœ๋… ๋น„์•ฝ, ์„ค๋ช… ๋ชจํ˜ธ์„ฑ, ํ๋ฆ„ ๋‹จ์ ˆ ๋“ฑ ์˜๋ฏธ๋ก ์  ํ’ˆ์งˆ ๊ฒ€ํ†  ํ›„ ์ˆ˜์ •
    • QAAgent: ๊ฐ ์ฃผ์žฅ์„ ์†Œ์Šค ์ปจํ…์ŠคํŠธ์™€ ๋Œ€์กฐ โ†’ ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ ํ•ญ๋ชฉ ์ œ๊ฑฐ ๋˜๋Š” ๊ฒฝ๊ณ  ํ‘œ์‹œ
  • ๐Ÿงช ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€: 1,881+ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ (~81% ์ปค๋ฒ„๋ฆฌ์ง€)

์ง€์‹ ๊ด€๋ฆฌ

  • ๐Ÿ—„๏ธ RAG ๊ธฐ๋ฐ˜ ์ง€์‹์ฐฝ๊ณ : ChromaDB ๋ฒกํ„ฐ DB๋กœ ๋Œ€ํ™”ํ˜• Q&A ์ง€์›
  • ๐ŸŒ ๋‹ค๊ตญ์–ด ์ง€์›: ํ•œ์˜ ํ˜ผํ•ฉ PDF ์ง€์›, ์ž๋™ ์–ธ์–ด ๊ฐ์ง€, Cross-lingual ๊ฒ€์ƒ‰ (v0.3.2+)
  • ๐ŸŽฏ ๊ณ ๊ธ‰ RAG ํ’ˆ์งˆ (v0.3.5+):
    • 400๋‹จ์–ด ๊ตฌ์กฐํ™” ๋‹ต๋ณ€ (5๊ฐœ Markdown ์„น์…˜ ๊ฐ•์ œ)
    • 15+15 ๋“€์–ผ ์ฟผ๋ฆฌ ๊ฒ€์ƒ‰ (๋‹ค๊ตญ์–ด, top-12 ๊ฒฐ๊ณผ)
    • Rich Markdown ํŒจ๋„ ๋ Œ๋”๋ง (ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ฆ„๋‹ค์šด ์ถœ๋ ฅ)
    • ๋™์  ์‹ ๋ขฐ๋„ ์ ์ˆ˜ (ChromaDB L2 ๊ฑฐ๋ฆฌ ์˜ฌ๋ฐ”๋ฅธ ๋ณ€ํ™˜)
  • โšก ์ฟผ๋ฆฌ ์บ์‹ฑ: ๋™์ผ ์งˆ๋ฌธ 60% ๋น ๋ฅธ ์‘๋‹ต
  • ๐Ÿ’ฌ ์†Œ์Šค ์ธ์šฉ: ์ž๋™ ์ฐธ์กฐ ๋ฐ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ์ œ๊ณต

์•ˆ์ •์„ฑ & ์„ฑ๋Šฅ

  • ๐Ÿ”„ ์ž๋™ ์žฌ์‹œ๋„: API ์‹คํŒจ ์‹œ ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„ (์ตœ๋Œ€ 3ํšŒ)
  • ๐Ÿ’ฐ ๋น„์šฉ ์ถ”์ : ์‹ค์‹œ๊ฐ„ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋น„์šฉ ์ถ”์ •
  • ๐Ÿ”ง ํƒ€์ž… ํžŒํŠธ: ~70% ํƒ€์ž… ์•ˆ์ •์„ฑ (340/489 ํ•จ์ˆ˜)
  • ๐ŸŽฏ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ๊ตฌ์กฐํ™”๋œ ์˜ˆ์™ธ ์‹œ์Šคํ…œ (9๊ฐœ ์นดํ…Œ๊ณ ๋ฆฌ)
  • ๐Ÿ“ ํ”„๋กฌํ”„ํŠธ ๊ด€๋ฆฌ: ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ ์‹œ์Šคํ…œ
  • ๐Ÿฆ™ Ollama ์ง€์› (v0.5.5+): LLM_PROVIDER=ollama๋กœ ๋กœ์ปฌ LLM ์‚ฌ์šฉ โ€” OpenAI API ํ‚ค ์—†์ด ๊ฐ•์˜ ์ƒ์„ฑ ๊ฐ€๋Šฅ

๐Ÿš€ ์ตœ๊ทผ ๊ฐœ์„ ์‚ฌํ•ญ (v0.6.0)

  • ๐ŸŽจ create ์„œ๋ธŒ์„น์…˜ ์ด๋ฏธ์ง€ ์œ„์น˜ ๊ฐœ์„ : ์ด๋ฏธ์ง€ ํ‚ค์›Œ๋“œ ๋งค์นญ score=0 ์‹œ ์ฒซ ๋ฌธ๋‹จ ๋Œ€์‹  ์ค‘๊ฐ„ ๋ฌธ๋‹จ ๋’ค์— ๋ฐฐ์น˜ โ€” ์„œ๋ธŒ์„น์…˜ ๋„์ž…๋ถ€๊ฐ€ ์•„๋‹Œ ๋‚ด์šฉ ์ „๊ฐœ ํ›„ ์ž์—ฐ์Šค๋Ÿฌ์šด ์œ„์น˜
  • ๐ŸŽฏ translate ์ด๋ฏธ์ง€ ์œ„์น˜ ์ •๋ฐ€ํ™”: page_y0 ๊ธฐ๋ฐ˜ page_fraction ๊ณ„์‚ฐ ๋„์ž… โ€” ํŽ˜์ด์ง€ ๋‹จ์œ„ ๊ทผ์‚ฌ์—์„œ ํŽ˜์ด์ง€ ๋‚ด y0๊นŒ์ง€ ๋ฐ˜์˜ํ•œ ์ •๋ฐ€ ์œ„์น˜ ๋ณด์กด, ๊ฐ™์€ ํŽ˜์ด์ง€์˜ ์ƒ๋‹จยทํ•˜๋‹จ ์ด๋ฏธ์ง€ ๊ตฌ๋ถ„
  • ๐Ÿ“ ImageReference.page_fraction: translate ๋ชจ๋“œ ์ „์šฉ ์ฑ•ํ„ฐ ๋‚ด [0, 1] ์œ„์น˜ ํ•„๋“œ ์ถ”๊ฐ€, None ์‹œ ๊ธฐ์กด ๊ณต์‹ ํด๋ฐฑ์œผ๋กœ ํ•˜์œ„ ํ˜ธํ™˜ ์œ ์ง€

์ „์ฒด ๋ณ€๊ฒฝ ์ด๋ ฅ์€ ์•„๋ž˜ ๋ณ€๊ฒฝ ์ด๋ ฅ ์ฐธ์กฐ


๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

1๏ธโƒฃ ์„ค์น˜

๋ฐฉ๋ฒ• 1: pipx๋กœ ์„ค์น˜ (๊ฐ€์žฅ ๊ฐ„ํŽธ โญโญ)

# pipx ์„ค์น˜ (์•„์ง ์—†๋Š” ๊ฒฝ์šฐ)
pip install pipx
pipx ensurepath

# lecture-forge ์„ค์น˜ (๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์ž๋™ ์„ค์น˜)
pipx install lecture-forge

# playwright ์„ค์น˜ (pipx ํ™˜๊ฒฝ์— ์ฃผ์ž… ํ›„ ๋ธŒ๋ผ์šฐ์ € ๋‹ค์šด๋กœ๋“œ)
pipx inject lecture-forge playwright
playwright install chromium

# ์‚ฌ์šฉ
lecture-forge create

pipx์˜ ์žฅ์ :

  • โœ… ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์ž๋™ ์„ค์น˜
  • โœ… ์‹œ์Šคํ…œ ์ „์—ญ์—์„œ lecture-forge ๋ช…๋ น ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • โœ… ๋‹ค๋ฅธ Python ํ”„๋กœ์ ํŠธ์™€ ์˜์กด์„ฑ ์ถฉ๋Œ ์—†์Œ
  • โœ… conda/venv ํ™˜๊ฒฝ ๊ด€๋ฆฌ ๋ถˆํ•„์š”

๋ฐฉ๋ฒ• 2: PyPI + conda ํ™˜๊ฒฝ (๊ถŒ์žฅ โญ)

# Python 3.11 ํ™˜๊ฒฝ ์ƒ์„ฑ (๊ฐ•๋ ฅ ๊ถŒ์žฅ)
conda create -n lecture-forge python=3.11
conda activate lecture-forge

# PyPI์—์„œ ์„ค์น˜
pip install lecture-forge

# ์›น ์Šคํฌ๋ž˜ํ•‘์šฉ ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜
playwright install chromium

๋ฐฉ๋ฒ• 3: ๊ฐœ๋ฐœ ์„ค์น˜ (์†Œ์Šค ์ฝ”๋“œ ์ˆ˜์ • ์‹œ)

# Git ํด๋ก 
git clone https://github.com/bullpeng72/Lecture_forge.git
cd Lecture_forge

# Python 3.11 ํ™˜๊ฒฝ ์ƒ์„ฑ
conda create -n lecture-forge python=3.11
conda activate lecture-forge

# ๋กœ์ปฌ ์†Œ์Šค์—์„œ ์„ค์น˜
pip install -e .

# ์›น ์Šคํฌ๋ž˜ํ•‘์šฉ ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜
playwright install chromium

Python ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ:

  • โœ… Python 3.11: ๊ฐ•๋ ฅ ๊ถŒ์žฅ - ๋ชจ๋“  ์˜์กด์„ฑ ์™„๋ฒฝ ์ง€์›
  • โœ… Python 3.12: ์™„๋ฒฝ ์ง€์› - v0.3.3๋ถ€ํ„ฐ ๊ณต์‹ ์ง€์›
  • โœ… Python 3.13: ์ง€์›๋จ - v0.3.8๋ถ€ํ„ฐ ๊ฒ€์ฆ ์™„๋ฃŒ

Python 3.11, 3.12, 3.13 ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ™˜๊ฒฝ ์„ค์ •

๋ฐฉ๋ฒ• 1: ๋Œ€ํ™”ํ˜• ์„ค์ • (๊ถŒ์žฅ โญ)

# ๋Œ€ํ™”ํ˜• ์„ค์ • ๋งˆ๋ฒ•์‚ฌ ์‹คํ–‰
lecture-forge init

์ด ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  • โœ… ํ”Œ๋žซํผ๋ณ„ ์ตœ์  ์œ„์น˜์— .env ํŒŒ์ผ ์ž๋™ ์ƒ์„ฑ
    • Windows: %USERPROFILE%\Documents\LectureForge\.env
    • Mac/Linux: ~/Documents/LectureForge/.env
  • โœ… LLM ๊ณต๊ธ‰์ž ์„ ํƒ (OpenAI / Ollama) ๋ฐ API ํ‚ค ์ž…๋ ฅ ์•ˆ๋‚ด โ€” Ollama ์„ ํƒ ์‹œ OpenAI ๋ถˆํ•„์š”
  • โœ… ์„ ํƒ์  ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ API ์„ค์ • (Pexels, Unsplash)
  • โœ… ํŒŒ์ผ ๊ถŒํ•œ ์ž๋™ ์„ค์ • (Unix/Mac: 600)

๋ฐฉ๋ฒ• 2: ์ˆ˜๋™ ์„ค์ •

# .env ํŒŒ์ผ ์ƒ์„ฑ (ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์‹œ)
cp .env.example .env

.env ํŒŒ์ผ์„ ์—ด์–ด ๋‹ค์Œ ํ•ญ๋ชฉ์„ ์„ค์ •ํ•˜์„ธ์š”:

ํ•„์ˆ˜ API ํ‚ค (OpenAI ์‚ฌ์šฉ ์‹œ):

# OpenAI API (OpenAI ์‚ฌ์šฉ ์‹œ ํ•„์ˆ˜, Ollama ์‚ฌ์šฉ ์‹œ ๋ถˆํ•„์š”)
OPENAI_API_KEY=sk-proj-...

# ๊ฒ€์ƒ‰ API (ํ•„์ˆ˜)
SERPER_API_KEY=...                # ๋ฌด๋ฃŒ: 2,500ํšŒ/์›”

Ollama ๋กœ์ปฌ LLM ์‚ฌ์šฉ ์‹œ (OpenAI API ํ‚ค ๋ถˆํ•„์š”):

LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2
OLLAMA_EMBEDDING_MODEL=nomic-embed-text
SERPER_API_KEY=...                # ์›น ๊ฒ€์ƒ‰์€ ์—ฌ์ „ํžˆ ํ•„์š”

์„ ํƒ ์‚ฌํ•ญ:

# ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ API (์„ ํƒ)
PEXELS_API_KEY=...                # ๋ฌด๋ฃŒ ๋ฌด์ œํ•œ
UNSPLASH_ACCESS_KEY=...           # ๋ฌด๋ฃŒ: 50ํšŒ/์‹œ๊ฐ„

# ๊ฒ€์ƒ‰ ๋ฐ ํฌ๋กค๋ง ์„ค์ • (๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ถฉ๋ถ„)
SEARCH_NUM_RESULTS=10             # ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ˆ˜ (์ตœ๋Œ€ 100)
DEEP_CRAWLER_MAX_PAGES=10         # ํฌ๋กค๋ง ํŽ˜์ด์ง€ ์ˆ˜
IMAGE_SEARCH_PER_PAGE=10          # ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ˆ˜

# ํ’ˆ์งˆ ์„ค์ •
QUALITY_THRESHOLD=80              # ํ’ˆ์งˆ ์ž„๊ณ„๊ฐ’ (70-90)
MAX_ITERATIONS=3                  # ์ตœ๋Œ€ ๊ฐœ์„  ๋ฐ˜๋ณต ํšŸ์ˆ˜

๐Ÿ’ก ๋” ๋งŽ์€ ์„ค์ • ์˜ต์…˜์€ .env.example ํŒŒ์ผ ์ฐธ์กฐ

.env ํŒŒ์ผ ์œ„์น˜

LectureForge๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ .env ํŒŒ์ผ์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜: LECTURE_FORGE_ENV_FILE๋กœ ์ง€์ •ํ•œ ๊ฒฝ๋กœ
  2. ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ: ./.env
  3. ์‚ฌ์šฉ์ž ๋””๋ ‰ํ† ๋ฆฌ (๊ถŒ์žฅ):
    • Windows: %USERPROFILE%\Documents\LectureForge\.env
    • Mac/Linux: ~/Documents/LectureForge/.env

API ํ‚ค ํš๋“:

  • OpenAI: platform.openai.com (์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ณผ๊ธˆ)
  • Serper: serper.dev (๋ฌด๋ฃŒ 2,500ํšŒ/์›”)
  • Pexels: pexels.com/api (๋ฌด๋ฃŒ)
  • Unsplash: unsplash.com/developers (๋ฌด๋ฃŒ 50ํšŒ/์‹œ๊ฐ„)
  • Ollama: ollama.com (๋ฌด๋ฃŒ, ๋กœ์ปฌ ์‹คํ–‰) โ€” OPENAI_API_KEY ๋ถˆํ•„์š”

3๏ธโƒฃ ์ฒซ ๊ฐ•์˜ ์ƒ์„ฑ

lecture-forge create

๋Œ€ํ™”ํ˜•์œผ๋กœ ๊ฐ•์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐ•์˜์ž๋ฃŒ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰


๐Ÿ’ป ์‚ฌ์šฉ๋ฒ•

๋ช…๋ น์–ด ๊ฐœ์š”

๋ช…๋ น์–ด ์„ค๋ช… ์ฃผ์š” ์˜ต์…˜
init ์ดˆ๊ธฐ ์„ค์ • --path, --reconfigure/-r, --show/-s
create ๊ฐ•์˜ ์ƒ์„ฑ --interactive, --image-search, --quality-level, --existing-kb
translate ์˜๋ฌธ PDF โ†’ ํ•œ๊ตญ์–ด ๊ฐ•์˜์ž๋ฃŒ (v0.4.1+) --no-translate, --with-diagrams, --audience-level, --quality-level
chat Q&A ๋ชจ๋“œ --knowledge-base
edit ์›น ๊ธฐ๋ฐ˜ ๊ฐ•์˜ ํŽธ์ง‘๊ธฐ (v0.5.0+) --port, --no-browser
edit-images ์ด๋ฏธ์ง€ ํŽธ์ง‘ (CLI) --output
improve ๊ฐ•์˜ ํ–ฅ์ƒ / ์žฌํ‰๊ฐ€ --to-slides, --without-notes, --re-evaluate
cleanup ์ง€์‹๋ฒ ์ด์Šค ๊ด€๋ฆฌ --all (-a)
home ํด๋” ์—ด๊ธฐ (v0.3.1+) outputs, data, kb, env

๋น ๋ฅธ ์‹คํ–‰ ์˜ˆ์ œ

# ๐Ÿš€ ์ดˆ๊ธฐ ์„ค์ • (์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ)
lecture-forge init

# ๐ŸŽ“ ๊ฐ•์˜ ์ƒ์„ฑ (๋Œ€ํ™”ํ˜• - ๊ฐ€์žฅ ๊ฐ„๋‹จ)
lecture-forge create

# ๐ŸŽ“ ๊ณ ํ’ˆ์งˆ ๊ฐ•์˜ (์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ํฌํ•จ)
lecture-forge create --image-search --quality-level strict

# ๐Ÿ’ฌ Q&A ๋ชจ๋“œ (์ž๋™์œผ๋กœ ์ตœ์‹  ์ง€์‹๋ฒ ์ด์Šค ์„ ํƒ)
lecture-forge chat

# ๐ŸŒ ์˜๋ฌธ PDF ๋ฒˆ์—ญ (ํ•œ๊ตญ์–ด ๊ฐ•์˜์ž๋ฃŒ ์ƒ์„ฑ)
lecture-forge translate paper.pdf
lecture-forge translate paper.pdf --no-translate   # ์›๋ฌธ ๊ตฌ์กฐ ํ™•์ธ (๋ฒˆ์—ญ ์—†์Œ)

# ๐ŸŽจ ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜
lecture-forge improve outputs/lecture.html --to-slides

# ๐Ÿ–ผ๏ธ ์ด๋ฏธ์ง€ ํŽธ์ง‘
lecture-forge edit-images outputs/lecture.html

# ๐Ÿงน ์ง€์‹๋ฒ ์ด์Šค ์ •๋ฆฌ (๋Œ€ํ™”ํ˜• ์„ ํƒ)
lecture-forge cleanup

# ๐Ÿ“‚ ํด๋” ์—ด๊ธฐ (๊ฐ•์˜ ๊ฒฐ๊ณผ๋ฌผ ํ™•์ธ)
lecture-forge home outputs

๋ช…๋ น์–ด ์ƒ์„ธ ๊ฐ€์ด๋“œ

๐Ÿš€ init - ์ดˆ๊ธฐ ์„ค์ •

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge init

๋Œ€ํ™”ํ˜• ๋งˆ๋ฒ•์‚ฌ๊ฐ€ API ํ‚ค ์ž…๋ ฅ์„ ์•ˆ๋‚ดํ•˜๊ณ  ์ž๋™์œผ๋กœ .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
--path PATH ์ปค์Šคํ…€ ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ • --path /custom/path
-r, --reconfigure ๊ธฐ์กด ์„ค์ • ์œ ์ง€ํ•˜๋ฉฐ ํ•ญ๋ชฉ๋ณ„ ์ˆ˜์ • --reconfigure
-s, --show ํ˜„์žฌ ์„ค์ •๊ฐ’ ์ถœ๋ ฅ (์ˆ˜์ • ์—†์Œ) --show

๊ธฐ๋ณธ ์ €์žฅ ์œ„์น˜:

  • Windows: C:\Users\<username>\Documents\LectureForge\.env
  • Mac/Linux: ~/Documents/LectureForge/.env

์˜ˆ์ œ:

# ์ฒ˜์Œ ์„ค์ • (๊ถŒ์žฅ)
lecture-forge init

# ํŠน์ • ํ•ญ๋ชฉ๋งŒ ์ˆ˜์ • (๊ธฐ์กด API ํ‚ค ์œ ์ง€)
lecture-forge init --reconfigure

# ํ˜„์žฌ ์„ค์ • ํ™•์ธ
lecture-forge init --show

# ์ปค์Šคํ…€ ๋””๋ ‰ํ† ๋ฆฌ ์‚ฌ์šฉ
lecture-forge init --path /my/config/dir

ํ•˜๋Š” ์ผ (๊ธฐ๋ณธ ๋ชจ๋“œ):

  1. LLM ๊ณต๊ธ‰์ž ์„ ํƒ (OpenAI / Ollama)
  2. ํ•„์ˆ˜ API ํ‚ค ์ž…๋ ฅ (OpenAI, Serper) โ€” Ollama ์‚ฌ์šฉ ์‹œ OpenAI ๋ถˆํ•„์š”
  3. ํ’ˆ์งˆ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๊ฐ€๋Šฅ)
  4. ์„ ํƒ์  ์ด๋ฏธ์ง€ API ์„ค์ • (Pexels, Unsplash)
  5. .env ํŒŒ์ผ ์ž๋™ ์ƒ์„ฑ
  6. ๊ธฐ๋ณธ ์„ค์ • ๊ฐ’ ์ž๋™ ์„ค์ •
  7. ํŒŒ์ผ ๊ถŒํ•œ ๋ณด์•ˆ ์„ค์ • (Unix/Mac)

๐Ÿ“š create - ๊ฐ•์˜ ์ƒ์„ฑ

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge create

๋Œ€ํ™”ํ˜•์œผ๋กœ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐ•์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
-c, --config FILE YAML ์„ค์ • ํŒŒ์ผ ์‚ฌ์šฉ --config lecture.yaml
-i, --interactive ์ƒ์„ฑ ์ค‘ ๋Œ€ํ™”ํ˜• Q&A ๋ชจ๋“œ ํ™œ์„ฑํ™” --interactive
--image-search / --no-image-search ์›น ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ํ™œ์„ฑํ™” (Pexels ๋“ฑ, ๊ธฐ๋ณธ: ํ™œ์„ฑํ™”) --no-image-search
--quality-level LEVEL ํ’ˆ์งˆ ๊ธฐ์ค€ ์„ค์ • --quality-level strict
-o, --output FILE ์ถœ๋ ฅ ํŒŒ์ผ๋ช… ์ง€์ • (ํ™•์žฅ์ž ์ œ์™ธ) --output my_lecture
--async-mode Async I/O ์‚ฌ์šฉ (70% ๋น ๋ฆ„, ์‹คํ—˜์ ) --async-mode
--include-pdf-images PDF ์ด๋ฏธ์ง€ ์ถ”์ถœ ๋ฐ location-based ์ž๋™ ๋ฐฐ์น˜ (๊ธฐ๋ณธ ํ™œ์„ฑํ™”) --no-include-pdf-images
--auto-describe-images PDF ์ด๋ฏธ์ง€ GPT-4o-mini ์„ค๋ช… ์ž๋™ ์ƒ์„ฑ (๊ธฐ๋ณธ ํ™œ์„ฑํ™”) --no-auto-describe-images
--existing-kb PATH ๊ธฐ์กด ์ง€์‹๋ฒ ์ด์Šค ์žฌ์‚ฌ์šฉ ๋˜๋Š” ํ™•์žฅ --existing-kb data/vector_db/...
--kb-mode MODE KB ์‚ฌ์šฉ ๋ฐฉ์‹: reuse_only(์ฝ๊ธฐ ์ „์šฉ, ๊ธฐ๋ณธ๊ฐ’) / extend(ํ™•์žฅ) --kb-mode extend

ํ’ˆ์งˆ ๋ ˆ๋ฒจ:

  • lenient (70์ ): ๋น ๋ฅธ ์ดˆ์•ˆ
  • balanced (80์ ): ๊ธฐ๋ณธ๊ฐ’ โœ…
  • strict (90์ ): ๊ณ ํ’ˆ์งˆ

์˜ˆ์ œ:

# ๊ธฐ๋ณธ ์ƒ์„ฑ
lecture-forge create

# ๊ณ ํ’ˆ์งˆ + ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰
lecture-forge create --image-search --quality-level strict

# Async ๋ชจ๋“œ (70% ๋น ๋ฆ„, ์‹คํ—˜์ )
lecture-forge create --async-mode

# YAML ์„ค์ • ์‚ฌ์šฉ
lecture-forge create --config my_config.yaml

๐Ÿ’ฌ chat - Q&A ๋ชจ๋“œ

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge chat

์ž๋™์œผ๋กœ ์ตœ์‹  ์ง€์‹๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
--knowledge-base PATH ํŠน์ • ์ง€์‹๋ฒ ์ด์Šค ์ง€์ • -kb ./data/vector_db/AI_xxx

๋Œ€ํ™”ํ˜• ๋ช…๋ น์–ด:

  • /help: ๋„์›€๋ง ํ‘œ์‹œ
  • /exit, /quit: ์ข…๋ฃŒ
  • Ctrl+C: ๊ฐ•์ œ ์ข…๋ฃŒ

์˜ˆ์ œ:

# ์ž๋™ ์„ ํƒ
lecture-forge chat

# ํŠน์ • ์ง€์‹๋ฒ ์ด์Šค ์‚ฌ์šฉ
lecture-forge chat -kb ./data/vector_db/lecture_20260209_123456

โœ๏ธ edit - ์›น ๊ธฐ๋ฐ˜ ๊ฐ•์˜ ํŽธ์ง‘๊ธฐ (v0.5.0+)

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge edit outputs/lecture.html

๋กœ์ปฌ Flask ์„œ๋ฒ„(๊ธฐ๋ณธ ํฌํŠธ 5757)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค.

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
--port INTEGER ์„œ๋ฒ„ ํฌํŠธ ์ง€์ • (๊ธฐ๋ณธ: 5757) --port 8080
--no-browser ๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์˜คํ”ˆ ์—†์ด ์„œ๋ฒ„๋งŒ ์‹คํ–‰ --no-browser

3-ํŒจ๋„ ์—๋””ํ„ฐ ๊ตฌ์„ฑ:

  • ์™ผ์ชฝ ํŒจ๋„: ์„น์…˜ ๋ชฉ๋ก โ€” ์„น์…˜ ์ถ”๊ฐ€ยท์‚ญ์ œยท์ˆœ์„œ ๋ณ€๊ฒฝ
  • ์ค‘์•™ ํŒจ๋„: Markdown ํŽธ์ง‘๊ธฐ (EasyMDE) โ€” HTML โ†” Markdown ์ž๋™ ๋ณ€ํ™˜
  • ์˜ค๋ฅธ์ชฝ ํŒจ๋„: ์ด๋ฏธ์ง€ ๊ฐค๋Ÿฌ๋ฆฌ โ€” ๋Œ€์•ˆ ๊ฒ€์ƒ‰ (Vector DB), ๊ต์ฒด, ์—…๋กœ๋“œ

์˜ˆ์ œ:

# ๊ธฐ๋ณธ ์‹คํ–‰ (ํฌํŠธ 5757, ๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์˜คํ”ˆ)
lecture-forge edit outputs/my_lecture.html

# ์ปค์Šคํ…€ ํฌํŠธ
lecture-forge edit outputs/my_lecture.html --port 8080

# ์„œ๋ฒ„๋งŒ ์‹œ์ž‘ (์›๊ฒฉ ์ ‘์† ๋“ฑ)
lecture-forge edit outputs/my_lecture.html --no-browser

โš ๏ธ Reveal.js ์Šฌ๋ผ์ด๋“œ ํŒŒ์ผ(*_slides.html)์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ–ผ๏ธ edit-images - ์ด๋ฏธ์ง€ ํŽธ์ง‘

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge edit-images outputs/lecture.html

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
--output FILE ์ถœ๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ -o outputs/edited.html

๋Œ€ํ™”ํ˜• ๋ช…๋ น์–ด:

๋ช…๋ น์–ด ์„ค๋ช… ์˜ˆ์‹œ
d <๋ฒˆํ˜ธ> ์ด๋ฏธ์ง€ ์‚ญ์ œ d 3
u <๋ฒˆํ˜ธ> ์‚ญ์ œ ์ทจ์†Œ u 3
r <๋ฒˆํ˜ธ> ์ด๋ฏธ์ง€ ๊ต์ฒด (Vector DB ๊ฒ€์ƒ‰) r 5
s ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ s
/exit, /quit (๋˜๋Š” q) ์ข…๋ฃŒ (์ €์žฅ ์•ˆ ํ•จ) /exit
h ๋„์›€๋ง h

์˜ˆ์ œ:

# ๊ธฐ๋ณธ (์›๋ณธ_edited.html๋กœ ์ €์žฅ)
lecture-forge edit-images outputs/my_lecture.html

# ์ถœ๋ ฅ ํŒŒ์ผ ์ง€์ •
lecture-forge edit-images outputs/my_lecture.html -o outputs/final.html

๐ŸŒ translate - ์˜๋ฌธ PDF โ†’ ํ•œ๊ตญ์–ด ๊ฐ•์˜์ž๋ฃŒ (v0.4.1+)

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge translate paper.pdf

์˜์–ด PDF์—์„œ ์ฑ•ํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•˜์—ฌ HTML ๊ฐ•์˜์ž๋ฃŒ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
--output FILE ์ถœ๋ ฅ ํŒŒ์ผ๋ช… ์ง€์ • (ํ™•์žฅ์ž ์ œ์™ธ) -o my_lecture_ko
--quality-level LEVEL ํ’ˆ์งˆ ๊ธฐ์ค€: lenient(70) / balanced(80) / strict(90) --quality-level strict
--audience-level LEVEL ๋Œ€์ƒ ์ˆ˜์ค€: beginner / intermediate / advanced --audience-level beginner
--no-translate ๋ฒˆ์—ญ ์—†์ด ์›๋ฌธ ๊ตฌ์กฐ๋งŒ ์ถ”์ถœ (๊ตฌ์กฐ ๋””๋ฒ„๊น…์šฉ, ๋น ๋ฆ„) --no-translate
--with-slides ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜๋„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ --with-slides
--with-diagrams Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ ์ž๋™ ์ƒ์„ฑ (๊ธฐ๋ณธ OFF) --with-diagrams

๊ตฌ์กฐ ์ถ”์ถœ ์šฐ์„ ์ˆœ์œ„:

  1. PDF TOC โ€” ๊ฐ€์žฅ ์ •ํ™•, ํ•™์ˆ  PDF 80%+ ์ ์šฉ
  2. ํฐํŠธ ํฌ๊ธฐ ๋ถ„์„ โ€” ๋ณธ๋ฌธ๋ณด๋‹ค ํฐ ํฐํŠธ ์ž๋™ ๊ฐ์ง€
  3. ํŽ˜์ด์ง€ ๊ทธ๋ฃน (ํด๋ฐฑ) โ€” ๊ท ๋“ฑ ํŽ˜์ด์ง€ ๋ฒ”์œ„ ๋ถ„ํ• 

๋ฒˆ์—ญ ํŠน์ง•:

  • ๊ธฐ์ˆ  ์šฉ์–ด: ํ•œ๊ตญ์–ด(English) ํ˜•์‹ ์œ ์ง€ (์˜ˆ: ์‹ ๊ฒฝ๋ง(Neural Network))
  • ์ฝ”๋“œ ๋ธ”๋ก: __CODE_BLOCK_N__ ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋กœ ์›๋ฌธ ๋ณด์กด
  • AI/ML ํ‘œ์ค€ ์šฉ์–ด ์‚ฌ์ „ 25๊ฐœ ์ ์šฉ (์ผ๊ด€๋œ ๋ฒˆ์—ญ)
  • PDF ์•„ํ‹ฐํŒฉํŠธ ์ž๋™ ์ œ๊ฑฐ (ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ, ์›Œํ„ฐ๋งˆํฌ ๋“ฑ)

์˜ˆ์ œ:

# ๊ธฐ๋ณธ ๋ฒˆ์—ญ (โ†’ paper_ko.html)
lecture-forge translate paper.pdf

# ์ถœ๋ ฅ ํŒŒ์ผ๋ช… ์ง€์ •
lecture-forge translate paper.pdf -o my_lecture_ko

# ์›๋ฌธ ๊ตฌ์กฐ ํ™•์ธ (๋ฒˆ์—ญ ์—†์Œ, ๋น ๋ฆ„)
lecture-forge translate paper.pdf --no-translate

# ๊ณ ํ’ˆ์งˆ + ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜
lecture-forge translate paper.pdf --quality-level strict --with-slides

# ์ดˆ๊ธ‰ ๋Œ€์ƒ ๋ฒˆ์—ญ
lecture-forge translate paper.pdf --audience-level beginner

# Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ ์ƒ์„ฑ ํฌํ•จ (๊ธฐ๋ณธ OFF)
lecture-forge translate paper.pdf --with-diagrams

๐ŸŽจ improve - ๊ฐ•์˜ ํ–ฅ์ƒ

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge improve outputs/lecture.html --to-slides

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
--to-slides Reveal.js ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜ (*_slides.html) โ€” ์„น์…˜๋ณ„ LLM ์žฌ์ž‘์„ฑ ๊ธฐ๋ณธ ํฌํ•จ (โ‰ค35์ž, ๋ง์ค„์ž„ํ‘œ ์—†์Œ) --to-slides
--without-notes ๋ฐœํ‘œ์ž ๋…ธํŠธ ์—†์ด ์Šฌ๋ผ์ด๋“œ ์ƒ์„ฑ (--to-slides ์‹œ ๋…ธํŠธ๋Š” ๊ธฐ๋ณธ ํฌํ•จ) --to-slides --without-notes
--re-evaluate KB ๊ธฐ๋ฐ˜ ํ’ˆ์งˆ ์žฌํ‰๊ฐ€ + ๋ฏธ๋ฐ˜์˜ ๋‚ด์šฉ ๋ณด์ถฉ ์ถ”๊ฐ€ (*_enhanced.html) --re-evaluate
--quality-level LEVEL ์žฌํ‰๊ฐ€ ํ’ˆ์งˆ ๊ธฐ์ค€: lenient(70) / balanced(80) / strict(90) --quality-level strict
--kb PATH KB ๊ฒฝ๋กœ ์ˆ˜๋™ ์ง€์ • (HTML ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—†๋Š” ๊ธฐ์กด ํŒŒ์ผ์šฉ fallback) --kb /path/to/vector_db/...

์˜ˆ์ œ:

# ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜ (๊ธฐ๋ณธ)
lecture-forge improve outputs/lecture.html --to-slides

# ๋ฐœํ‘œ์ž ๋…ธํŠธ ์—†์ด ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜
lecture-forge improve outputs/lecture.html --to-slides --without-notes

# KB ๊ธฐ๋ฐ˜ ํ’ˆ์งˆ ์žฌํ‰๊ฐ€ + ๋ณด์ถฉ (โ†’ *_enhanced.html)
lecture-forge improve outputs/lecture.html --re-evaluate

# ์—„๊ฒฉํ•œ ๊ธฐ์ค€์œผ๋กœ ์žฌํ‰๊ฐ€
lecture-forge improve outputs/lecture.html --re-evaluate --quality-level strict

# ๊ธฐ์กด ํŒŒ์ผ (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—†์Œ) โ€” KB ๊ฒฝ๋กœ ์ˆ˜๋™ ์ง€์ •
lecture-forge improve outputs/lecture.html --re-evaluate --kb ~/Documents/LectureForge/data/vector_db/MyTopic_...

# ์žฌํ‰๊ฐ€ + ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜ ๋™์‹œ ์ ์šฉ
lecture-forge improve outputs/lecture.html --re-evaluate --to-slides

๐Ÿงน cleanup - ์ง€์‹๋ฒ ์ด์Šค ๊ด€๋ฆฌ

๊ธฐ๋ณธ ์‚ฌ์šฉ:

lecture-forge cleanup

๋Œ€ํ™”ํ˜•์œผ๋กœ ์‚ญ์ œํ•  ์ง€์‹๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
-a, --all ๋ชจ๋“  ์ง€์‹๋ฒ ์ด์Šค ์‚ญ์ œ (โš ๏ธ ์ฃผ์˜!) --all

์˜ˆ์ œ:

# ๋Œ€ํ™”ํ˜• ์„ ํƒ (์•ˆ์ „)
lecture-forge cleanup

# ์ „์ฒด ์‚ญ์ œ (๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅ!)
lecture-forge cleanup --all

๐Ÿ“ค ์ถœ๋ ฅ ๊ฒฐ๊ณผ

๊ฐ•์˜ ์ƒ์„ฑ ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

outputs/
โ”œโ”€โ”€ [์ฃผ์ œ]_[๋‚ ์งœ์‹œ๊ฐ„].html           # ๐Ÿ“„ HTML ๊ฐ•์˜์ž๋ฃŒ
โ””โ”€โ”€ [์ฃผ์ œ]_[๋‚ ์งœ์‹œ๊ฐ„]_slides.html   # ๐ŸŽฌ ์Šฌ๋ผ์ด๋“œ (--to-slides ์‚ฌ์šฉ ์‹œ)

data/
โ””โ”€โ”€ vector_db/
    โ””โ”€โ”€ [์ฃผ์ œ]_[๋‚ ์งœ์‹œ๊ฐ„]/           # ๐Ÿ—„๏ธ ์ง€์‹๋ฒ ์ด์Šค (Q&A์šฉ)
        โ”œโ”€โ”€ chroma.sqlite3
        โ””โ”€โ”€ ...

ํฌํ•จ ๋‚ด์šฉ:

  • โœ… HTML ๊ฐ•์˜์ž๋ฃŒ: ์ด๋ฏธ์ง€, Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ, ์ฝ”๋“œ ํ•˜์ด๋ผ์ดํŒ…, ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค
  • โœ… ์ง€์‹๋ฒ ์ด์Šค: ChromaDB ๋ฒกํ„ฐ DB (๋Œ€ํ™”ํ˜• Q&A ์ง€์›)
  • โœ… ํ†ต๊ณ„ ์ •๋ณด: ํ’ˆ์งˆ ์ ์ˆ˜, ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰, ์˜ˆ์ƒ ๋น„์šฉ
  • โœ… ์Šฌ๋ผ์ด๋“œ: Reveal.js ํ”„๋ ˆ์  ํ…Œ์ด์…˜ (์„ ํƒ ์‚ฌํ•ญ)

๐Ÿ”ง ๊ณ ๊ธ‰ ์„ค์ • (.env ํŒŒ์ผ)

๋” ๋งŽ์€ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ .env ํŒŒ์ผ์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ๊ฒ€์ƒ‰ ๋ฐ ํฌ๋กค๋ง
SEARCH_NUM_RESULTS=20              # ๊ธฐ๋ณธ: 10, ์ตœ๋Œ€: 100
DEEP_CRAWLER_MAX_PAGES=30          # ๊ธฐ๋ณธ: 10
DEEP_CRAWLER_MAX_DEPTH=3           # ๊ธฐ๋ณธ: 2

# ์ด๋ฏธ์ง€
IMAGE_SEARCH_PER_PAGE=15           # ๊ธฐ๋ณธ: 10
MAX_IMAGES_PER_SEARCH=20           # ๊ธฐ๋ณธ: 10

# ํ’ˆ์งˆ
QUALITY_THRESHOLD=90               # ๊ธฐ๋ณธ: 80 (70-90)
MAX_ITERATIONS=5                   # ๊ธฐ๋ณธ: 3

# ์„ฑ๋Šฅ
CHUNK_SIZE=800                     # ๊ธฐ๋ณธ: 1000 (์ž‘์„์ˆ˜๋ก ์ •๋ฐ€)
WEB_SCRAPER_TIMEOUT=60             # ๊ธฐ๋ณธ: 30์ดˆ

๐Ÿ’ก ์ „์ฒด ์„ค์ • ๋ชฉ๋ก: .env.example ํŒŒ์ผ ์ฐธ์กฐ (15+ ํ™˜๊ฒฝ๋ณ€์ˆ˜)


๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

Multi-Agent ํŒŒ์ดํ”„๋ผ์ธ (12๊ฐœ ์ „๋ฌธ ์—์ด์ „ํŠธ)

flowchart TD
    CLI["๐Ÿ–ฅ๏ธ CLI Interface<br/>์ž…๋ ฅ ์ˆ˜์ง‘, ์ง„ํ–‰ ์ƒํ™ฉ, Q&A ์ธํ„ฐ๋ž™์…˜"]
    Orchestrator["โš™๏ธ Pipeline Orchestrator<br/>์—์ด์ „ํŠธ ์กฐ์œจ ๋ฐ ํƒœ์Šคํฌ ๊ด€๋ฆฌ"]
    Phase12["๐Ÿ“š Phase 1-2<br/>Collection & Analysis"]
    KB["๐Ÿ—„๏ธ Knowledge Base<br/>Vector DB + RAG Caching"]
    Phase34["โœ๏ธ Phase 3-4<br/>Generation & Quality QA"]
    Output["๐Ÿ“ค Output<br/>HTML + Slides"]

    CLI --> Orchestrator
    Orchestrator --> Phase12
    Orchestrator --> KB
    Phase12 -->|์ €์žฅ| KB
    KB -->|RAG Query| Phase34
    Phase34 -->|RAG Query| KB
    Phase34 --> Output

    style CLI fill:#e1f5ff
    style Orchestrator fill:#fff4e1
    style Phase12 fill:#e8f5e9
    style KB fill:#f3e5f5
    style Phase34 fill:#fff9c4
    style Output fill:#ffebee

12๊ฐœ ์ „๋ฌธ ์—์ด์ „ํŠธ

# ์—์ด์ „ํŠธ ์—ญํ•  ํŒŒ์ผ
1 Content Collector ๐Ÿ“š ํ…์ŠคํŠธ ์ˆ˜์ง‘ ๋ฐ ๋ฒกํ„ฐํ™” content_collector.py
2 Image Collector ๐Ÿ–ผ๏ธ ์ด๋ฏธ์ง€ ์ˆ˜์ง‘ ๋ฐ Vision AI ๋ถ„์„ image_collector.py
3 Content Analyzer ๐Ÿ” ๋‚ด์šฉ ๋ถ„์„ ๋ฐ ํ† ํ”ฝ ํด๋Ÿฌ์Šคํ„ฐ content_analyzer.py
4 Curriculum Designer ๐Ÿ“‹ ๊ฐ•์˜ ๊ตฌ์กฐ ์„ค๊ณ„ curriculum_designer.py
5 Content Writer โœ๏ธ RAG ๊ธฐ๋ฐ˜ ์ปจํ…์ธ  ์ƒ์„ฑ content_writer.py
6 Content Enhancer ๐Ÿ”ง KB ๊ธฐ๋ฐ˜ ์ฝ˜ํ…์ธ  ๋ณด๊ฐ•ยท์žฌํ‰๊ฐ€ content_enhancer.py
7 Diagram Generator ๐Ÿ“Š Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ ์ƒ์„ฑ diagram_generator.py
8 Quality Evaluator โœ… 6์ฐจ์› ํ’ˆ์งˆ ํ‰๊ฐ€ quality_evaluator.py
9 Revision Agent ๐Ÿ”„ ์ž๋™/๋ฐ˜์ž๋™ ์ˆ˜์ • revision_agent.py
10 Q&A Agent ๐Ÿค– ์ง€์‹์ฐฝ๊ณ  ๊ธฐ๋ฐ˜ ๋Œ€ํ™” (RAG ์บ์‹ฑ) qa_agent.py
11 HTML Assembler ๐ŸŽจ ์ตœ์ข… HTML ์ƒ์„ฑ html_assembler.py
12 PDF Translator ๐ŸŒ ์˜๋ฌธ PDF โ†’ ํ•œ๊ตญ์–ด ๊ฐ•์˜์ž๋ฃŒ pdf_translator.py

9๊ฐœ ๋„๊ตฌ (Tools)

# ๋„๊ตฌ ์—ญํ•  ํŒŒ์ผ
1 PDF Parser ๐Ÿ“„ PDF ํ…์ŠคํŠธ ์ถ”์ถœ pdf_parser.py
2 Image Extractor ๐Ÿ–ผ๏ธ PDF/HTML ์ด๋ฏธ์ง€ ์ถ”์ถœ image_extractor.py
3 Web Scraper ๐ŸŒ ์›น ํŽ˜์ด์ง€ ์Šคํฌ๋ž˜ํ•‘ web_scraper.py
4 Playwright Crawler ๐ŸŽญ ๋™์  ์›น ํฌ๋กค๋ง playwright_crawler.py
5 Deep Web Crawler ๐Ÿ•ท๏ธ ๋‹ค์ธต ์›น ํฌ๋กค๋ง (Hada.io) deep_web_crawler.py
6 Search Tool ๐Ÿ” Serper ๊ฒ€์ƒ‰ API search_tool.py
7 Image Search ๐ŸŽจ Pexels/Unsplash ๊ฒ€์ƒ‰ image_search.py
8 PDF Image Describer ๐Ÿ“ GPT-4o Vision ์ด๋ฏธ์ง€ ์„ค๋ช… pdf_image_describer.py
9 Image Editor โœ‚๏ธ ๋Œ€ํ™”ํ˜• ์ด๋ฏธ์ง€ ํŽธ์ง‘ image_editor.py

ํ’ˆ์งˆ ํ‰๊ฐ€ ์‹œ์Šคํ…œ (6์ฐจ์›)

%%{init: {'theme':'base', 'themeVariables': { 'pie1':'#e8f5e9', 'pie2':'#bbdefb', 'pie3':'#fff9c4', 'pie4':'#f8bbd0', 'pie5':'#ffccbc', 'pie6':'#d1c4e9'}}}%%
pie title ํ’ˆ์งˆ ํ‰๊ฐ€ ๊ฐ€์ค‘์น˜ ๋ถ„ํฌ
    "๋‚ด์šฉ ์™„์„ฑ๋„ (ํ•™์Šต ๋ชฉํ‘œ)" : 25
    "๋…ผ๋ฆฌ์  ํ๋ฆ„ (์—ฐ๊ฒฐ์„ฑ)" : 20
    "๋‚œ์ด๋„ ์ ํ•ฉ์„ฑ (๋ ˆ๋ฒจ)" : 20
    "์‹œ๊ฐ์ž๋ฃŒ ํ’ˆ์งˆ (์ด๋ฏธ์ง€)" : 15
    "์‹œ๊ฐ„ ์ ํ•ฉ์„ฑ (๋ถ„๋Ÿ‰)" : 10
    "๊ธฐ์ˆ ์  ์ •ํ™•์„ฑ (๊ฒ€์ฆ)" : 10
์ฐจ์› ๊ฐ€์ค‘์น˜ ํ‰๊ฐ€ ๊ธฐ์ค€ ์„ธ๋ถ€ ํ•ญ๋ชฉ
๐Ÿ“ ๋‚ด์šฉ ์™„์„ฑ๋„ 25% ํ•™์Šต ๋ชฉํ‘œ ๋‹ฌ์„ฑ๋„ ์ฃผ์ œ ์ปค๋ฒ„๋ฆฌ์ง€, ๊นŠ์ด, ์˜ˆ์ œ
๐Ÿ”— ๋…ผ๋ฆฌ์  ํ๋ฆ„ 20% ์„น์…˜ ๊ฐ„ ์—ฐ๊ฒฐ์„ฑ ๊ตฌ์กฐ, ์ „๊ฐœ, ์‘์ง‘์„ฑ
๐ŸŽฏ ๋‚œ์ด๋„ ์ ํ•ฉ์„ฑ 20% ์ˆ˜๊ฐ•์ƒ ๋ ˆ๋ฒจ ์ผ์น˜ ์šฉ์–ด, ๋ณต์žก๋„, ์‚ฌ์ „ ์ง€์‹
๐Ÿ–ผ๏ธ ์‹œ๊ฐ์ž๋ฃŒ ํ’ˆ์งˆ 15% ์ด๋ฏธ์ง€/๋‹ค์ด์–ด๊ทธ๋žจ ์ถฉ๋ถ„์„ฑ ๊ด€๋ จ์„ฑ, ํ’ˆ์งˆ, ๋ฐฐ์น˜
โฑ๏ธ ์‹œ๊ฐ„ ์ ํ•ฉ์„ฑ 10% ๊ฐ•์˜ ์‹œ๊ฐ„ vs ๋ถ„๋Ÿ‰ ๋‹จ์–ด ์ˆ˜, ๋ฐ€๋„, ํŽ˜์ด์‹ฑ
โœ… ๊ธฐ์ˆ ์  ์ •ํ™•์„ฑ 10% ์‚ฌ์‹ค ๊ด€๊ณ„ ๊ฒ€์ฆ ์ฝ”๋“œ, ๊ฐœ๋…, ์šฉ์–ด

ํ•ฉ๊ฒฉ ๊ธฐ์ค€: 80์  ์ด์ƒ (์ž๋™ ๋ฐ˜๋ณต ๊ฐœ์„ , ์ตœ๋Œ€ 3ํšŒ)


โ“ FAQ

์„ค์น˜ ๋ฐ ์„ค์ •

Q: ์–ด๋–ค Python ๋ฒ„์ „์ด ํ•„์š”ํ•œ๊ฐ€์š”?

A: Python 3.11, 3.12, 3.13 ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • โœ… Python 3.11: ์™„๋ฒฝ ์ง€์› (๊ถŒ์žฅ)
  • โœ… Python 3.12: ์™„๋ฒฝ ์ง€์› (v0.3.3+)
  • โœ… Python 3.13: ์ง€์›๋จ (v0.3.8+, ๊ฒ€์ฆ ์™„๋ฃŒ)
# ๋ฒ„์ „ ํ™•์ธ
python --version

# Python 3.11 ํ™˜๊ฒฝ ์ƒ์„ฑ (๊ถŒ์žฅ)
conda create -n lecture-forge python=3.11
conda activate lecture-forge
pip install lecture-forge
Q: API ํ‚ค๊ฐ€ ๊ผญ ํ•„์š”ํ•œ๊ฐ€์š”?

A:

  • OpenAI ๋ชจ๋“œ โ€” ํ•„์ˆ˜: OpenAI API, Serper API
  • Ollama ๋ชจ๋“œ (๋กœ์ปฌ LLM, LLM_PROVIDER=ollama) โ€” ํ•„์ˆ˜: Serper API๋งŒ (OpenAI API ๋ถˆํ•„์š”)
  • ์„ ํƒ: Pexels API, Unsplash API (์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰์šฉ)

์ด๋ฏธ์ง€ API(Pexels, Unsplash) ์—†์ด๋„ PDF/์›น ์ด๋ฏธ์ง€๋งŒ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Q: ๋น„์šฉ์ด ์–ผ๋งˆ๋‚˜ ๋“œ๋‚˜์š”?

A: ์‹ค์ œ ์ธก์ • ๋น„์šฉ (OpenAI GPT-4o-mini ์‚ฌ์šฉ ์‹œ):

  • 60๋ถ„ ๊ฐ•์˜: ์•ฝ $0.035
  • 180๋ถ„ ๊ฐ•์˜: ์•ฝ $0.105

(๋ณด์ˆ˜์  ์ด๋ก  ์ถ”์ •: $0.22/180๋ถ„)

๐Ÿ’ก Ollama ์‚ฌ์šฉ ์‹œ: LLM_PROVIDER=ollama๋กœ ๋กœ์ปฌ LLM์„ ์‚ฌ์šฉํ•˜๋ฉด LLM ๋น„์šฉ ๋ฌด๋ฃŒ (ํ•˜๋“œ์›จ์–ด๋งŒ ํ•„์š”)

์ƒ์„ฑ ์™„๋ฃŒ ํ›„ ์ •ํ™•ํ•œ ๋น„์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Q: .env ํŒŒ์ผ ์„ค์ •์„ ๋ฐ”๊พธ๋ ค๋ฉด?

A: .env ํŒŒ์ผ์„ ์—ด์–ด ์›ํ•˜๋Š” ๊ฐ’์„ ์ˆ˜์ •ํ•˜์„ธ์š”:

# ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ฆ๊ฐ€
SEARCH_NUM_RESULTS=20

# ํฌ๋กค๋ง ๋ฒ”์œ„ ํ™•๋Œ€
DEEP_CRAWLER_MAX_PAGES=30

# ํƒ€์ž„์•„์›ƒ ์ฆ๊ฐ€
WEB_SCRAPER_TIMEOUT=60

๋ณ€๊ฒฝ ํ›„ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ๋ฐ”๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

Q: ์˜คํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

A:

  • Ollama ์‚ฌ์šฉ ์‹œ (LLM_PROVIDER=ollama): ๊ฐ•์˜ ์ƒ์„ฑ๋„ ์˜คํ”„๋ผ์ธ ๊ฐ€๋Šฅ (์›น ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ œ์™ธ)
  • OpenAI ์‚ฌ์šฉ ์‹œ: ์ƒ์„ฑ ์‹œ API ํ•„์š” (OpenAI, Serper)
  • ์ƒ์„ฑ ํ›„: HTML ํŒŒ์ผ๊ณผ ์ง€์‹์ฐฝ๊ณ ๋Š” ์–ด๋А ๋ชจ๋“œ์—์„œ๋“  ์˜คํ”„๋ผ์ธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Chat ๋ชจ๋“œ: Ollama๋ผ๋ฉด ์™„์ „ ์˜คํ”„๋ผ์ธ ๊ฐ€๋Šฅ, OpenAI๋ผ๋ฉด LLM API ํ•„์š”
Q: ํ’ˆ์งˆ ๋ ˆ๋ฒจ์˜ ์ฐจ์ด๋Š”?

A:

๋ ˆ๋ฒจ ์ž„๊ณ„๊ฐ’ ์šฉ๋„ ์‹œ๊ฐ„
lenient 70์  ๋น ๋ฅธ ์ดˆ์•ˆ ์งง์Œ
balanced 80์  ๊ธฐ๋ณธ๊ฐ’ โœ… ๋ณดํ†ต
strict 90์  ๊ณ ํ’ˆ์งˆ ํ”„๋กœ๋•์…˜ ๊น€

์ž„๊ณ„๊ฐ’ ๋ฏธ๋‹ฌ ์‹œ ์ตœ๋Œ€ 3ํšŒ ์ž๋™ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

Q: Chat ๋ชจ๋“œ ์ข…๋ฃŒ ๋ฐฉ๋ฒ•์€?

A: ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜ ์‚ฌ์šฉ:

  • /exit ๋˜๋Š” /quit (๊ถŒ์žฅ)
  • Ctrl+C (๊ฐ•์ œ ์ข…๋ฃŒ)
Q: ์ด๋ฏธ์ง€๊ฐ€ ์ œ๋Œ€๋กœ ๋งค์นญ๋˜์ง€ ์•Š์œผ๋ฉด?

A: v0.2.0์˜ Location-based ๋งค์นญ์ด ์ž๋™์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

  1. PDF ์ด๋ฏธ์ง€: 85% ์ž๋™ ๋งค์นญ (ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜)
  2. ์›น ์ด๋ฏธ์ง€: ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ๋ณด์™„
  3. ์ˆ˜๋™ ํŽธ์ง‘: lecture-forge edit-images๋กœ ๊ต์ฒด ๊ฐ€๋Šฅ

๊ธฐ์ˆ ์  ์งˆ๋ฌธ

Q: ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋‚˜์š”?
# ์ „์ฒด ํ…Œ์ŠคํŠธ
pytest tests/ -v

# ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•์ธ
pytest tests/ --cov=lecture_forge --cov-report=html

# ํŠน์ • ํ…Œ์ŠคํŠธ
pytest tests/unit/agents/test_content_writer.py -v

# ํŠน์ • ์—์ด์ „ํŠธ๋งŒ
pytest tests/unit/agents/ -v
Q: API ํ˜ธ์ถœ์ด ์‹คํŒจํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

A: v0.2.0๋ถ€ํ„ฐ ์ž๋™ ์žฌ์‹œ๋„ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ตœ๋Œ€ 3ํšŒ ์žฌ์‹œ๋„
  • ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„: 2์ดˆ โ†’ 4์ดˆ โ†’ 10์ดˆ
  • ์ผ์‹œ์  ์˜ค๋ฅ˜ ์ž๋™ ๋ณต๊ตฌ
  • OpenAI, Serper, Pexels, Unsplash ๋ชจ๋‘ ์ง€์›
Q: RAG ์ฟผ๋ฆฌ ์บ์‹ฑ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

A:

  • ์ฟผ๋ฆฌ์™€ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜๋ฅผ MD5 ํ•ด์‹œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ
  • ๋™์ผ ์งˆ๋ฌธ์€ 60% ๋น ๋ฅธ ์‘๋‹ต
  • ์บ์‹œ ํžˆํŠธ/๋ฏธ์Šค ํ†ต๊ณ„ ์ž๋™ ์ถ”์ 
  • ์„ธ์…˜ ๋™์•ˆ ์œ ์ง€ (ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ์ดˆ๊ธฐํ™”)
Q: ์„ค์ •์„ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋ ค๋ฉด?

A: .env ํŒŒ์ผ์„ ํ™˜๊ฒฝ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์„ธ์š”:

# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
.env.development

# ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ
.env.production

# ์‚ฌ์šฉ
cp .env.production .env
lecture-forge create

๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ

v0.6.0 (2026-04-21) โ€” ๐Ÿ–ผ ์ด๋ฏธ์ง€ ๋ฐฐ์น˜ ์ •๋ฐ€ํ™” + HTML ํ’ˆ์งˆ ๊ฐœ์„  + gpt-5-nano ๊ธฐ๋ณธ ๋ชจ๋ธ

  • ๐ŸŽจ create ์„œ๋ธŒ์„น์…˜ ์ด๋ฏธ์ง€ ์œ„์น˜ ๊ฐœ์„  (html_assembler.py): _find_best_paragraph() score=0 ํด๋ฐฑ์„ paragraphs[0](์ฒซ ๋ฌธ๋‹จ)์—์„œ paragraphs[mid](์ค‘๊ฐ„ ๋ฌธ๋‹จ)์œผ๋กœ ๋ณ€๊ฒฝ โ€” ์„œ๋ธŒ์„น์…˜ ๋„์ž…๋ถ€๊ฐ€ ์•„๋‹Œ ๋‚ด์šฉ ์ „๊ฐœ ํ›„ ์ž์—ฐ์Šค๋Ÿฌ์šด ์œ„์น˜์— ์ด๋ฏธ์ง€ ๋ฐฐ์น˜
  • ๐ŸŽฏ translate ์ด๋ฏธ์ง€ ์œ„์น˜ ์ •๋ฐ€ํ™” (pdf_translator.py, html_assembler.py): page_y0 / ํŽ˜์ด์ง€ ๋†’์ด ๊ธฐ๋ฐ˜ page_fraction [0,1] ๊ณ„์‚ฐ ๋„์ž… โ€” ํŽ˜์ด์ง€ ๋‹จ์œ„ ๊ทผ์‚ฌ์น˜์—์„œ ํŽ˜์ด์ง€ ๋‚ด y0๊นŒ์ง€ ๋ฐ˜์˜ํ•œ ์ •๋ฐ€ ์œ„์น˜๋กœ ๊ฐœ์„ , ๊ฐ™์€ ํŽ˜์ด์ง€์˜ ์ƒ๋‹จยทํ•˜๋‹จ ์ด๋ฏธ์ง€ ์œ„์น˜ ๊ตฌ๋ถ„ ๊ฐ€๋Šฅ
  • ๐Ÿ“ ImageReference.page_fraction (models/lecture.py): translate ๋ชจ๋“œ ์ „์šฉ ์ฑ•ํ„ฐ ๋‚ด ์œ„์น˜ ํ•„๋“œ ์ถ”๊ฐ€ (Optional[float]) โ€” None ์‹œ ๊ธฐ์กด ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ๋น„๋ก€ ๊ณต์‹์œผ๋กœ ํด๋ฐฑ, ํ•˜์œ„ ํ˜ธํ™˜ ์œ ์ง€
  • ๐Ÿ› edit ๊ฐค๋Ÿฌ๋ฆฌ ๋ผ์ดํŠธ๋ฐ•์Šค ํ™•๋Œ€๋ณด๊ธฐ ์˜ค๋ฅ˜ ์ˆ˜์ •: ๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€ ํด๋ฆญ ์‹œ ๋ผ์ดํŠธ๋ฐ•์Šค ํ™•๋Œ€๋ณด๊ธฐ ๋™์ž‘ ์ˆ˜์ •
  • ๐Ÿงช ํ…Œ์ŠคํŠธ ๊ฐ•ํ™”: Vision Describer ํ†ตํ•ฉ + translate/create ๊ฐœ์„  ํ…Œ์ŠคํŠธ (1,891+ ํ…Œ์ŠคํŠธ, ~81% ์ปค๋ฒ„๋ฆฌ์ง€)
  • ๐ŸŽฏ create ์ด๋ฏธ์ง€ ์œ„์น˜ ์ •๋ฐ€ํ™” (image_selector.py): section_position ๊ธฐ๋ฐ˜ Phase 2 ์ด๋ฏธ์ง€ ํ•„ํ„ฐ๋ง (ยฑ30%), ์ตœ์†Œ ์ด๋ฏธ์ง€ ํด๋ฐฑ
  • ๐Ÿ”„ create ํ•™์Šต๋ชฉํ‘œ ์žฌ์ •๋ ฌ (curriculum_designer.py): ์„น์…˜ ํ™•์ • ํ›„ ์‹ค์ œ ์ œ๋ชฉ ๋ฐ˜์˜ ์žฌ์ƒ์„ฑ
  • ๐Ÿ”’ translate CODE_BLOCK ๋ณต์› ๊ฐ•ํ™” (pdf_translator.py): ใ€ŒCODEBLK:Nใ€ ํ˜•์‹ + fuzzy restore
  • ๐ŸŒ translate h4 ๋ฒˆ์—ญ + ํ•œ์ž ์ œ๊ฑฐ: #### ์ œ๋ชฉ ๋ฒˆ์—ญ + _strip_non_korean_cjk() ์ž๋™ ์ œ๊ฑฐ
  • ๐Ÿงน translate ์ค‘๋ณต ํ—ค๋”ฉ ์ œ๊ฑฐ + ํŽ˜์ด์ง€ ๋ฒ”์œ„ ๊ฒ€์ฆ ๊ฒฝ๊ณ  ๋กœ๊ทธ
  • โ™ฟ Alt ํ…์ŠคํŠธ 125์ž ์ œํ•œ (html_assembler.py): Vision AI ์„ค๋ช…์„ alt ์†์„ฑ์— ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋˜ ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ ์ˆ˜์ • โ€” [:125] ์ œํ•œ, ์ „์ฒด ์„ค๋ช…์€ figcaption์— ์œ ์ง€
  • ๐Ÿ› heading ์ด์ค‘ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ๋ฒ„๊ทธ ์ˆ˜์ • (html_assembler.py): _cleanup_content h2โ†’h3ยทh3โ†’h4 ์ฒ˜๋ฆฌ ์ˆœ์„œ ์˜ค๋ฅ˜๋กœ LLM ##์ด <h4>๋กœ ์ด์ค‘ ๊ฐ•๋“ฑ๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • (h3โ†’h4 ๋จผ์ €, h2โ†’h3 ์ˆœ์„œ๋กœ ๋ณ€๊ฒฝ)
  • ๐Ÿ“ ํ”„๋กฌํ”„ํŠธ heading ํ˜•์‹ ์ˆ˜์ • (templates/prompts/content_generation.txt): ์ฃผ ์„œ๋ธŒ์„น์…˜ ###โ†’##, #### ๊ธˆ์ง€ โ€” ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ํ›„ ์˜ฌ๋ฐ”๋ฅธ <h3> ๊ณ„์ธต ์ƒ์„ฑ
  • ๐Ÿšซ ์„น์…˜ ๊ฐ„ ์ด๋ฏธ์ง€ ๋ˆ„์ˆ˜ ์ฐจ๋‹จ (content_writer/image_selector.py): Phase 3 ํ’ˆ์งˆ ํด๋ฐฑ ์ œ๊ฑฐ โ€” ๊ฒฐ๋ก  ์„น์…˜์ด ๋ฌด๊ด€ํ•œ ์•ž ์ฑ•ํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ๐Ÿ”ข ์„น์…˜ ์ด๋ฏธ์ง€ ์ƒํ•œ ๊ฐ•์ œ (content_writer/agent.py): max_section_images ์บก์„ ์„œ๋ธŒ์„น์…˜ ๋ฃจํ”„์—์„œ ์กฐ๊ธฐ break๋กœ ๊ฐ•์ œ โ€” ๊ฒฐ๋ก  ์„น์…˜ 9+์žฅ ๊ณผ๋‹ค ๋ฐฐ์น˜ ๋ฐฉ์ง€
  • ๐Ÿ’ฐ gpt-5-nano ๊ธฐ๋ณธ ๋ชจ๋ธ (config.py, token_tracker.py, init_helpers.py): DEFAULT_MODEL ยท VISION_MODEL ๋ชจ๋‘ gpt-5-nano โ€” ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ง€์›, gpt-4o-mini ๋Œ€๋น„ 2.5ร— ๋น„์šฉ ์ ˆ๊ฐ ($0.05/1M ์ž…๋ ฅ)

v0.5.9 (2026-04-17) - ๐Ÿ“ฆ ์ด๋ฏธ์ง€ ๋‹จ์ผ ์ €์žฅ & ๋ฐฐํฌ ๊ตฌ์กฐ ๊ฐœ์„  + ๐Ÿ”ญ Vision AI ์ด๋ฏธ์ง€ ์„ค๋ช…

  • ๐Ÿ”ญ Vision AI ์ด๋ฏธ์ง€ ์„ค๋ช… (tools/pdf_image_describer.py): PDFImageDescriber๊ฐ€ Vision LLM์œผ๋กœ PDF ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ์„ค๋ช… โ€” base64 multimodal ๋ฐฉ์‹. _vision_available ํ”Œ๋ž˜๊ทธ๋กœ ๋‚™๊ด€์  ์‹คํ–‰, ์ฒซ ์‹คํŒจ ์‹œ ํ…์ŠคํŠธ ์ถ”๋ก  ์ž๋™ ํด๋ฐฑ
  • ๐Ÿ”ญ Vision ๋ชจ๋ธ ๋ผ์šฐํŒ… (config.py): get_vision_model() โ€” OpenAI: VISION_MODEL(gpt-4o), Ollama: OLLAMA_VISION_MODEL(๋ฏธ์„ค์ • ์‹œ OLLAMA_MODEL ์‚ฌ์šฉ)
  • ๐Ÿ”ง init Vision ์„ค์ •: Ollama ๋ธŒ๋žœ์น˜ OLLAMA_VISION_MODEL, OpenAI ๋ธŒ๋žœ์น˜ VISION_MODEL ์ž…๋ ฅ ์ถ”๊ฐ€
  • ๐Ÿ“ฆ ์ด๋ฏธ์ง€ ๋‹จ์ผ ์ €์žฅ: ImageCollectorAgent์— output_dir ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€ โ€” data/images/ ์ž„์‹œ ๊ฒฝ๋กœ ์—†์ด outputs/{stem}_images/์— ์ง์ ‘ ์ €์žฅ, _bundle_images() ๋ณต์‚ฌ ๋‹จ๊ณ„ ์™„์ „ ์ œ๊ฑฐ
  • ๐Ÿ—‚๏ธ ๋ฐฐํฌ ์šฉ์ด์„ฑ: HTML ํŒŒ์ผ๊ณผ ์ด๋ฏธ์ง€ ํด๋”๊ฐ€ ํ•ญ์ƒ ๊ฐ™์€ outputs/ ์œ„์น˜ โ€” ํด๋” ํ•˜๋‚˜๋งŒ ๋ณต์‚ฌํ•ด๋„ ์™„์ „ ๋ฐฐํฌ ๊ฐ€๋Šฅ
  • ๐Ÿ”ง create / translate / create_async: output_stem Phase 1 ์ „ ์กฐ๊ธฐ ๊ฒฐ์ •, ์ด๋ฏธ์ง€ยทHTML ๊ฒฝ๋กœ ์ผ๊ด€์„ฑ ํ™•๋ณด
  • ๐ŸŽจ _render_image_html ๊ฐœ์„ : OUTPUT_DIR ๋‚ด ์ด๋ฏธ์ง€ ์šฐ์„  ์ฒ˜๋ฆฌ, ๋ ˆ๊ฑฐ์‹œ DATA_DIR ๊ฒฝ๋กœ fallback ์œ ์ง€
  • ๐Ÿ” image_selector ๋งต ํƒ์ƒ‰ ํ™•์žฅ: outputs/*_images/image_page_map.json๋„ ๊ฒ€์ƒ‰
  • ๐Ÿงน cleanup ๊ฐœ์„ : ๋ ˆ๊ฑฐ์‹œ data/images/ ์ž”์กด ์„ธ์…˜ ๊ฐ์ง€ยท์‚ญ์ œ ์ถ”๊ฐ€

v0.5.8 (2026-04-16) - ๐Ÿ–ผ ์ด๋ฏธ์ง€ ๋ฒˆ๋“ค๋ง & ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฐœ์„ 

  • ๐Ÿ“ฆ ์ด๋ฏธ์ง€ ๋ฒˆ๋“ค๋ง (html_assembler.py): _bundle_images() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ โ€” HTML ์ƒ์„ฑ ์‹œ ์ฐธ์กฐ ์ด๋ฏธ์ง€๋ฅผ {๊ฐ•์˜๋ช…}_images/ ํด๋”๋กœ ๋ณต์‚ฌ, cleanup ํ›„์—๋„ ์ด๋ฏธ์ง€ ๋ณด์กด
  • ๐Ÿ” ํ† ํ”ฝ ์ถ”์ถœ ๊ท ํ˜• ๋ฐฐ๋ถ„ (content_analyzer.py): _extract_key_topics ํ”„๋กฌํ”„ํŠธ์— ๋ฌธ์„œ ์ „์ฒด ๊ท ํ˜• ๋ฐฐ๋ถ„ ๊ทœ์น™ ๋ช…์‹œ โ€” ์ดˆ๋ฐ˜ยท์ค‘๋ฐ˜ยทํ›„๋ฐ˜ ์„น์…˜ ๋ชจ๋‘ ํฌํ•จ ์š”๊ตฌ
  • ๐Ÿ” probe query ํ™•์žฅ: 10๊ฐœ โ†’ 14๊ฐœ โ€” optimization/evaluation, deployment/production, fine-tuning/training, safety/alignment ์ฟผ๋ฆฌ ์ถ”๊ฐ€๋กœ PDF ํ›„๋ฐ˜๋ถ€ ์ƒ˜ํ”Œ๋ง ๊ฐ•ํ™”

v0.5.7 (2026-04-15) - ๐Ÿงน ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 

  • ๐Ÿงน ๋ฏธ์‚ฌ์šฉ import 20๊ฐœ ํŒŒ์ผ ์ •๋ฆฌ: slides/notesยทsection_rewriterยทutils, tools/async_web_scraperยทimage_extractor, utils/language_utilsยทprompt_manager, agents/content_writerยทcurriculum_designerยทqa_agent, models/curriculum, cli/commands ์ „์ฒด โ€” ๋ถˆํ•„์š”ํ•œ typing/rich/pathlib import ์ œ๊ฑฐ (๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์—†์Œ)

v0.5.6 (2026-04-15) - ๐Ÿ› Ollama ํ˜ธํ™˜ ๋ฒ„๊ทธ์ˆ˜์ • & ๋ฌธ์„œ ์ •ํ™•๋„

  • ๐Ÿ› PDFImageDescriber Ollama ํ˜ธํ™˜: translate ์‹คํ–‰ ์‹œ LLM_PROVIDER=ollama์ด๋ฉด pdf_image_describer.py๊ฐ€ OpenAI API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด 401 ์—๋Ÿฌ ๋ฐœ์ƒํ•˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • โ€” create_llm() ํŒฉํ† ๋ฆฌ๋กœ ๊ต์ฒด (ํ…์ŠคํŠธ ์ „์šฉ, ๋ชจ๋“  ํ”„๋กœ๋ฐ”์ด๋” ํ˜ธํ™˜)
  • ๐Ÿ› ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ Ollama ๋ชจ๋ธ๋ช… ์˜คํ‘œ์‹œ ์ˆ˜์ •: Ollama ๋ชจ๋ธ(qwen3.5:9b, llama3.2 ๋“ฑ)์ด gpt-4o-mini๋กœ ์ž˜๋ชป ํ‘œ์‹œ๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • โ€” ์›๋ณธ ๋ชจ๋ธ๋ช… ์œ ์ง€, ๋น„์šฉ $0.00, ๋กœ์ปฌ LLM โ€” API ๋น„์šฉ ์—†์Œ ํ‘œ์‹œ
  • ๐Ÿ“ README FAQ ์ˆ˜์ •: "API ํ‚ค ํ•„์ˆ˜" ํ•ญ๋ชฉ์„ OpenAI/Ollama ๋ชจ๋“œ๋กœ ๊ตฌ๋ถ„, ๋น„์šฉ FAQ์— Ollama ๋ฌด๋ฃŒ ์•ˆ๋‚ด, ์˜คํ”„๋ผ์ธ FAQ์— Ollama ์ƒ์„ฑ ์˜คํ”„๋ผ์ธ ๊ฐ€๋Šฅ ๋ฐ˜์˜
  • ๐Ÿ“ docs/ ํ˜„ํ–‰ํ™”: api/cli.md ToC ์žฌ๊ตฌ์„ฑ, select_pdf_files ๋ฌธ์„œ ์ถ”๊ฐ€, generate_lecture() ๋ฐ˜ํ™˜๊ฐ’ ๋ฌธ์„œํ™”, init 3๋ชจ๋“œ ๋ฐ˜์˜

v0.5.5 (2026-04-13) - ๐Ÿ”ง CLI ์•ˆ์ •์„ฑ & ๋„์›€๋ง ํ˜„ํ–‰ํ™” & Ollama ์ง€์›

  • ๐Ÿฆ™ Ollama LLM ์ง€์›: LLM_PROVIDER=ollama๋กœ ๋กœ์ปฌ LLM ์‚ฌ์šฉ โ€” create_llm() ํŒฉํ† ๋ฆฌ ์ถ”์ƒํ™”, BaseAgent/EmbeddingManager/slides/language_utils ์ „์ฒด ์ ์šฉ, OpenAI API ํ‚ค ์—†์ด ๊ฐ•์˜ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๐Ÿฆ™ Ollama Thinking ๋ชจ๋“œ: OLLAMA_THINKING=auto (qwen3/qwq/deepseek-r1 ์ž๋™ ๊ฐ์ง€), reasoning= ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ •, qwen3.5:9b ๊ธฐ๋ณธ๊ฐ’
  • ๐Ÿ› Ollama reasoning ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ •: ChatOllama์—์„œ think= ๋Œ€์‹  reasoning= ์‚ฌ์šฉ โ€” thinking์ด ๊บผ์ง€์ง€ ์•Š์•„ ๋นˆ ์‘๋‹ต ์ƒ์„ฑ๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •
  • ๐Ÿ› gpt-4o-mini 404 ์ˆ˜์ •: language_utils.translate_text(model=None) โ€” Ollama ๋ชจ๋“œ์—์„œ OpenAI ๋ชจ๋ธ๋ช…์œผ๋กœ ChatOllama ํ˜ธ์ถœํ•˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •
  • โšก 5๊ฐœ ์—์ด์ „ํŠธ thinking=False: ContentAnalyzerยทDiagramGeneratorยทHTMLAssemblerยทRevisionAgentยทPDFTranslator โ€” deep reasoning ๋ถˆํ•„์š”ํ•œ ์—์ด์ „ํŠธ ์‘๋‹ต ์†๋„ ๊ฐœ์„ 
  • ๐Ÿ”ง init LLM-first ์„ค์ • ์ˆœ์„œ: Phase 1=LLM, Phase 2=API ํ‚ค (Ollama ๋ชจ๋“œ๋Š” OpenAI ํ‚ค ์Šคํ‚ต), Phase 3=ํ’ˆ์งˆ
  • ๐Ÿ”ง init ๋ช…๋ น์–ด 3๋ชจ๋“œ: --reconfigure/-r (๊ธฐ์กด ๊ฐ’ ์œ ์ง€ํ•˜๋ฉฐ ํ•ญ๋ชฉ๋ณ„ ์ˆ˜์ •), --show/-s (์„ค์ • ์ถœ๋ ฅ)
  • โœ๏ธ improve --to-slides ๋…ธํŠธ ๊ธฐ๋ณธ ํฌํ•จ: --with-notes ์ œ๊ฑฐ, ๋ฐœํ‘œ์ž ๋…ธํŠธ ๊ธฐ๋ณธ ON โ€” --without-notes๋กœ opt-out
  • ๐Ÿ› AuthenticationError ์ฆ‰์‹œ ์‹คํŒจ: tenacity retry์—์„œ ์ธ์ฆยท๊ถŒํ•œยท404 ์˜ค๋ฅ˜๋Š” ์žฌ์‹œ๋„ ์—†์ด ์ฆ‰์‹œ ์‹คํŒจ (reraise=True)
  • ๐Ÿ–ฅ๏ธ create Progress ๊ฐœ์„ : Phase 4a ์„น์…˜๋ณ„ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ, RichHandler Console ๊ณต์œ ๋กœ ์ด์ค‘ ๋ Œ๋”๋ง ์ œ๊ฑฐ
  • ๐Ÿ“ ๋„์›€๋ง ํ˜„ํ–‰ํ™”: --help ํ†ต๊ณ„ ์ˆ˜์ • (12 Agents, 1,870+ Tests), init --reconfigure/--show ๋ฐ˜์˜
  • ๐Ÿงช ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€: retry ์ •์ฑ… 8๊ฐœ, init_helpers 43๊ฐœ (์ด 1,877๊ฐœ)
  • ๐Ÿ› slides ๋ชจ๋“ˆ thinking=False: section_rewriterยทnotesยทutils โ€” num_predict=800~1000์—์„œ qwen3.5 thinking์ด ์ „์ฒด ํ† ํฐ ์†Œ๋น„ โ†’ empty result ํ›„ ์›๋ฌธ ์‚ฌ์šฉ ๋ฒ„๊ทธ ์ˆ˜์ •
  • ๐Ÿ› language_utils.translate_text thinking=False: max_tokens=2000์—์„œ thinking phase๊ฐ€ ํ† ํฐ ์ „๋ถ€ ์†Œ๋น„ โ†’ ๋ฒˆ์—ญ ๊ฒฐ๊ณผ ๋นˆ ๋ฌธ์ž์—ด ๋ฒ„๊ทธ ์ˆ˜์ •
  • ๐Ÿ”ง 4๊ฐœ ์—์ด์ „ํŠธ thinking=False ๋ฐฉ์–ด์  ๊ณ ์ •: ContentCollectorยทImageCollectorยทAsyncBaseยทContentExpander โ€” invoke_llm ๋ฏธ์‚ฌ์šฉ์ด์ง€๋งŒ ์ผ๊ด€์„ฑ ํ™•๋ณด

v0.5.4 (2026-04-03) - ๐Ÿงช ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฐ•ํ™”

  • ๐Ÿงช ํ…Œ์ŠคํŠธ 401๊ฐœ ์ถ”๊ฐ€: editorยทslidesยทutilsยทserverยทenhancerยทcurriculumยทpdf_translatorยทCLI ์ „์ฒด ์ปค๋ฒ„ โ†’ 1,837๊ฐœ (~81%)
  • ๐Ÿ”ง utils/json_utils.py: strip_json_fence() / parse_json_response() โ€” 4๊ฐœ ์—์ด์ „ํŠธ ์ค‘๋ณต ํŒจํ„ด ํ†ตํ•ฉ
  • ๐ŸŒ ์—๋””ํ„ฐ UX: '์„น์…˜ ์ €์žฅ' ๋ฒ„ํŠผ ํ•ญ์ƒ ํ‘œ์‹œ, ํŽธ์ง‘ ์˜์—ญ ๋ฐฐ๊ฒฝ์ƒ‰, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋ง CSS

v0.5.x (2026-02-26 ~ 2026-03-05) - ๐ŸŒ ์›น ํŽธ์ง‘๊ธฐ ยท ์•ˆ์ •์„ฑ & ๋น„์šฉ ๊ฐœ์„ 

  • ๐Ÿ› edit TemplateNotFound ์žฌ๋ฐœ ๋ฐฉ์ง€ (v0.5.3): server.py์—์„œ Path(__file__) ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ index.html ์ง์ ‘ ์ฝ๊ธฐ
  • ๐ŸŽจ ์Šฌ๋ผ์ด๋“œ ํƒ€์ดํ‹€ ๊ฐœ์„  (v0.5.3): ์ƒ์„ฑ์ผ ํ‘œ์‹œ + ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  • ๐Ÿ”’ PyPI ๋ฐฐํฌ ๊ฒ€์ฆ ๊ฐ•ํ™” (v0.5.3): wheel ๋‚ด์šฉ ํ•„์ˆ˜ ํ™•์ธ ์ ˆ์ฐจ ์ถ”๊ฐ€ (unzip -l dist/*.whl | grep templates/editor)
  • ๐ŸŒ ์›น ๊ธฐ๋ฐ˜ ๊ฐ•์˜ ํŽธ์ง‘๊ธฐ (edit ๋ช…๋ น์–ด, v0.5.0): 3-ํŒจ๋„ SPA ์—๋””ํ„ฐ (ํฌํŠธ 5757) โ€” ์„น์…˜ CRUD, Markdown ํŽธ์ง‘ (EasyMDE), ์ด๋ฏธ์ง€ ๊ฐค๋Ÿฌ๋ฆฌยท๋Œ€์•ˆ ๊ฒ€์ƒ‰
  • ๐Ÿ“ฆ ์˜์กด์„ฑ ์ถ”๊ฐ€: flask>=3.0.0, markdownify>=0.12.1 ยท CLI ๋ช…๋ น์–ด 8๊ฐœ โ†’ 9๊ฐœ
  • ๐Ÿ› ๋ฒ„๊ทธ์ˆ˜์ • (v0.5.1): edit TemplateNotFound, improve --to-slides IndexError
  • ๐Ÿ”ง BaseAgent max_tokens ์ „์—ญํ™” (v0.5.2): MAX_LLM_TOKENS (๊ธฐ๋ณธ 4096) ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ œ์–ด
  • ๐Ÿ”’ RMC ๋ฃจํ”„ ์ƒํ•œ (v0.5.2): MAX_RMC_ROUNDS (๊ธฐ๋ณธ 1) โ€” ๋ฌดํ•œ ๋ฐ˜๋ณต ๋ฐฉ์ง€
  • โšก ๋‹ค์ด์–ด๊ทธ๋žจ ๋ณ‘๋ ฌ ์ƒ์„ฑ (v0.5.2): ThreadPoolExecutor๋กœ ์„น์…˜๋‹น ๋‹ค์ค‘ ๋‹ค์ด์–ด๊ทธ๋žจ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
  • ๐Ÿ†” HTML ์„น์…˜ ID ์ค‘๋ณต ๋ฐฉ์ง€ (v0.5.2): ์ƒ์„ฑ ์‹œ์  ์ค‘๋ณต ์ œ๊ฑฐ (_2, _3 suffix)

v0.4.x (2026-02-22 ~ 2026-02-25) - ๐Ÿ” ๋ณด๊ฐ•ยท๋ฒˆ์—ญยท์•„ํ‚คํ…์ฒ˜ ์ •๋ฆฌ

  • ๐Ÿ” ๊ฒ€์ƒ‰ ์ปค๋ฒ„๋ฆฌ์ง€ (v0.4.0): ์„น์…˜ ์ „์ฒด ์ธ๋ฑ์‹ฑ, --re-evaluate HTML ํ†ต๊ณ„ ์ž๋™ ์—…๋ฐ์ดํŠธ, --to-slides ๊ธฐ๋ณธ LLM ์žฌ์ž‘์„ฑ (โ‰ค35์ž)
  • ๐ŸŒ translate ๋ช…๋ น์–ด (v0.4.1): PDF ์•„ํ‹ฐํŒฉํŠธ ์ œ๊ฑฐ, TOC ๊ฐ์ง€, AI/ML ์šฉ์–ด์‚ฌ์ „ 25๊ฐœ, --with-diagrams opt-in
  • ๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ์ •๋ฆฌ (v0.4.3): agents/ โ†’ cli/ import ์œ„๋ฐ˜ ์ œ๊ฑฐ, config ์•ˆ์ „ ํŒŒ์‹ฑ, ํ…Œ์ŠคํŠธ 36๊ฐœ ์ถ”๊ฐ€

v0.3.x (2026-02-12 ~ 2026-02-20) - ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ๊ตฌ์ถ•

  • ๐Ÿง  RMC ์ž๊ธฐ๊ฒ€ํ†  (v0.3.8): CurriculumDesignerยทContentWriterยทQAAgent 2๋‹จ๊ณ„ ์ž๊ธฐ๋ฐ˜์„ฑ, ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ ํ•ญ๋ชฉ ์ œ๊ฑฐ, Python 3.13 ๊ฒ€์ฆ
  • ๐Ÿ–ผ๏ธ UI & ์Šฌ๋ผ์ด๋“œ (v0.3.7): Lightbox ํด๋ฆญ ํ™•๋Œ€, ํ•œ๊ตญ์–ด ์„œ๋ธŒ์ŠคํŠธ๋ง ๊ฒ€์ƒ‰, Mermaid ์ „์ฒด ๋„ˆ๋น„, API ์ˆ˜์ •
  • ๐Ÿ”ง ์ฝ”๋“œ ํ’ˆ์งˆ (v0.3.6): make_api_retry() ํŒฉํ† ๋ฆฌ, BaseImageSearchTool, RAG ํŒŒ๋ผ๋ฏธํ„ฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜ํ™”, Chat ๋กœ๊ทธ
  • ๐ŸŽฏ RAG ํ’ˆ์งˆ (v0.3.5): 400๋‹จ์–ด ๊ตฌ์กฐํ™” ๋‹ต๋ณ€, 15+15 ๋“€์–ผ์ฟผ๋ฆฌ(top-12), ChromaDB ์‹ ๋ขฐ๋„ ์ˆ˜์ •, Rich ๋ Œ๋”๋ง
  • โšก Async I/O (v0.3.4): --async-mode, httpx ๋ณ‘๋ ฌ ์ˆ˜์ง‘ 70% ํ–ฅ์ƒ
  • โŒจ๏ธ ์ž…๋ ฅ ์‹œ์Šคํ…œ (v0.3.3): prompt-toolkit, ํ•œ๊ตญ์–ด ์™„๋ฒฝ ์ง€์›, ํžˆ์Šคํ† ๋ฆฌยท์ž๋™์™„์„ฑ
  • ๐ŸŒ ๋‹ค๊ตญ์–ด (v0.3.2): langdetect, Cross-lingual ๋“€์–ผ์ฟผ๋ฆฌ, ์ง€๋Šฅํ˜• ์žฌ๋žญํ‚น
  • ๐Ÿ“‚ ๋””๋ ‰ํ† ๋ฆฌ (v0.3.1): ~/Documents/LectureForge/, home ์ปค๋งจ๋“œ, ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • ๐ŸŽจ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ (v0.3.0): Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ(9๊ฐœ), ์Šฌ๋ผ์ด๋“œ ์ตœ์ ํ™”

v0.2.x (2026-02-09 ~ 2026-02-12) - ํ’ˆ์งˆยท์•ˆ์ •์„ฑ

  • โšก RAG ์ฟผ๋ฆฌ ์บ์‹ฑ(60%), ์ž๋™ API ์žฌ์‹œ๋„(์ง€์ˆ˜ ๋ฐฑ์˜คํ”„), Config ๋ฆฌํŒฉํ† ๋ง(15+ ํ™˜๊ฒฝ๋ณ€์ˆ˜)
  • ๐Ÿ› ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋ฒ„๊ทธ ์ˆ˜์ •(์›๋ณธ ๋ณด์กด), Visual scoreยท์Šฌ๋ผ์ด๋“œ ๋ฒ„๊ทธ ์ˆ˜์ •, Full HD WebP ์ง€์›
  • ๐Ÿงช 77+ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํƒ€์ž… ํžŒํŠธ 40% โ†’ 75%

v0.1.0 (2026-02-08) - ๐ŸŽ‰ Initial Release

  • 10๊ฐœ ์ „๋ฌธ ์—์ด์ „ํŠธ, ๋ฉ€ํ‹ฐ์†Œ์Šค ์ˆ˜์ง‘ (PDFยทURLยท๊ฒ€์ƒ‰)
  • Location-based ์ด๋ฏธ์ง€ ๋งค์นญ (+750%), ChromaDB ์ง€์‹์ฐฝ๊ณ 
  • 6์ฐจ์› ํ’ˆ์งˆ ํ‰๊ฐ€, HTML ์ถœ๋ ฅ, Reveal.js ์Šฌ๋ผ์ด๋“œ ๋ณ€ํ™˜

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ผ์ฃผ์„ธ์š”:

  1. ์ด์Šˆ ์ƒ์„ฑ: ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋จผ์ € ๋…ผ์˜
  2. ํฌํฌ & ๋ธŒ๋žœ์น˜: feature ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
  3. ํ…Œ์ŠคํŠธ ์ž‘์„ฑ: ์ƒˆ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
  4. PR ์ œ์ถœ: ๋ณ€๊ฒฝ์‚ฌํ•ญ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์ œ์ถœ

์ž์„ธํ•œ ๋‚ด์šฉ์€ CONTRIBUTING.md๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


๐Ÿ“„ ๋ผ์ด์„ ์Šค

MIT License - ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ์ฐธ์กฐ


๐Ÿ“ž ์ง€์› ๋ฐ ๋ฌธ์˜


๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋“ค์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • LangChain - Multi-Agent ํ”„๋ ˆ์ž„์›Œํฌ
  • ChromaDB - ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • OpenAI - GPT-4o ๋ชจ๋ธ
  • Serper - ๊ฒ€์ƒ‰ API
  • Pexels & Unsplash - ์ด๋ฏธ์ง€ API

Made with โค๏ธ by Sungwoo Kim
โญ ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด GitHub Star๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lecture_forge-0.6.0.tar.gz (374.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lecture_forge-0.6.0-py3-none-any.whl (361.6 kB view details)

Uploaded Python 3

File details

Details for the file lecture_forge-0.6.0.tar.gz.

File metadata

  • Download URL: lecture_forge-0.6.0.tar.gz
  • Upload date:
  • Size: 374.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for lecture_forge-0.6.0.tar.gz
Algorithm Hash digest
SHA256 bea90304bb81c343a78de236e7cfa341db5a5a7196260da27cd0392037bbf2d0
MD5 975e9d6b5e021d82986dd5fdeca336a6
BLAKE2b-256 ae89cef5a0d0beda06575b5a3949dc242fdf1f5eff1667863117ad2922cd0f5e

See more details on using hashes here.

File details

Details for the file lecture_forge-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: lecture_forge-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 361.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for lecture_forge-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c81d85599805e019d71a5158ed045e1060cd44b03f145849a9b599770420bd7f
MD5 347a90be62ab812233c41109f962d382
BLAKE2b-256 9cc49a35a10e8802c1c601864317562313b510f931991bd64c3815ee213f214c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page