[AI 에이전트 파이프라인 #2] 무엇을 생성할 것인가

5 minute read

지난 편에서는 왜 학습 앱을 직접 만들게 되었는지 이야기했습니다.

이번 편에서는 생성할 콘텐츠를 어떻게 정의했는지 다룹니다.

1. 자동화할 대상 정의

지난 편에서 “LLM에 질문하고 노션에 정리하는 과정을 자동화하겠다”고 결정했습니다.

자동화를 하려면 뭘 자동화할지 먼저 정해야 합니다. 에이전트에게 “무엇을 생성할지”를 어떻게 전달할 것인가?

이 고민의 결과물이 토픽 문서입니다.


2. 토픽 문서 구조

토픽 문서는 대주제 > 카테고리 > 토픽 3단계 구조입니다.

docs/topic/
├── javascript-core-concepts.md  ← 대주제 (파일명)
├── javascript-browser-concepts.md
├── css-core-concepts.md
├── ...
└── nextjs-advanced-concepts.md

실제 예시: javascript-core-concepts.md

# JavaScript 핵심 개념           ← 대주제 제목

## 📋 상세 개념 목록

### 1. 변수 완전 정복              ← 카테고리 (01-variables)
1. **var를 사용하면 어떤 문제가 발생할까?** - 함수 스코프와 호이스팅 문제  ← 토픽
2. **let은 var와 뭐가 다를까?** - 블록 스코프와 TDZ                      ← 토픽
3. **const는 정말 상수일까?** - 재할당 금지 vs 불변성                     ← 토픽
...
10. **변수 선언을 강제하는 방법은?** - strict mode와 변수                 ← 토픽

### 2. JavaScript 타입 시스템      ← 카테고리 (02-type-system)
1. **JavaScript에는 몇 가지 타입이 있을까?** - 7가지 원시 타입과 객체    ← 토픽
2. **숫자는 왜 소수점 계산이 이상할까?** - 부동소수점과 정밀도           ← 토픽
...

3단계 구조 정리

단계 예시 설명
대주제 javascript-core-concepts 파일명. 10개 문서
카테고리 1. 변수 완전 정복 대주제당 21~42개
토픽 var를 사용하면 어떤 문제가… 카테고리당 10개. 약 1,400줄 콘텐츠로 확장

각 토픽은 질문 형태의 제목 + 한 줄 설명입니다. 이 한 줄이 약 1,400줄의 콘텐츠로 확장됩니다.


3. 전체 규모

주제 문서 카테고리 토픽 (×10)
javascript-core-concepts 42 420
javascript-browser-concepts 30 300
css-core-concepts 21 210
css-advanced-concepts 30 300
html-core-concepts 21 210
html-advanced-concepts 25 250
합계 169 + α 1,690 + α

전체 규모는 10개 대주제, 169 + α개 카테고리, 1,690 + α개 토픽입니다. 각 토픽이 약 1,400줄의 콘텐츠로 확장됩니다.


4. 메타데이터 파이프라인: 첫 번째 자동화

토픽 문서는 마크다운입니다. 사람이 읽고 편집하기 쉽습니다. 하지만 앱은 구조화된 데이터(YAML)와 빈 콘텐츠 파일이 필요합니다.

169 + α개 카테고리 × 10개 토픽 = 1,690 + α개를 수동으로 만들 수 없습니다. 첫 번째 자동화 대상이었습니다.

파이프라인 구조

flowchart TB
    subgraph Input
        A[토픽 문서<br/>docs/topic/*.md]
    end

    subgraph Shell["generate-metadata.sh"]
        B[1. metadata-parser 호출]
        C[2. metadata-generator 호출]
        D[3. 빈 마크다운 파일 생성]
    end

    subgraph Temp["/tmp/metadata/"]
        JSON[JSON 파일]
    end

    subgraph Output["public/content/ko/{주제}/{카테고리}/"]
        E[category.yaml]
        F[01-topic-a.md]
        G[02-topic-b.md]
        H[...]
    end

    A --> B
    B --> JSON
    JSON --> C
    C --> E
    E --> D
    D --> F
    D --> G
    D --> H

metadata-parser 에이전트

토픽 문서에서 특정 카테고리의 10개 토픽을 추출합니다.

프롬프트 전문:

---
name: metadata-parser
description: When topic definition files need parsing to extract structured metadata
tools: Read, Write, Bash
model: sonnet
---

You are a metadata parser that creates JSON files with topic metadata.

## Input Format
"Parse topics for {majorSubject}, category {categoryId}"

## Process
1. Read `docs/topic/{majorSubject}.md`
2. Find the category section matching {categoryId}
3. Parse the 10 topics
4. Save the JSON result to `/tmp/metadata/{majorSubject}-{categoryId}.json`

## JSON File Format
{
  "success": true,
  "majorSubject": "...",
  "categoryId": "...",
  "totalTopics": 10,
  "topics": [
    {
      "number": 1,
      "id": "01-topic-name",
      "title": "Korean Title?",
      "description": "Korean Description"
    }
  ]
}

## ID Generation Rules
- "React는 무엇이고..." → "01-what-is-react"
- "Virtual DOM은..." → "02-virtual-dom"
- Use zero-padded numbers and kebab-case

출력 예시:

{
  "success": true,
  "majorSubject": "javascript-core-concepts",
  "categoryId": "01-variables",
  "totalTopics": 10,
  "topics": [
    {
      "number": 1,
      "id": "01-var-problems",
      "title": "var를 사용하면 어떤 문제가 발생할까?",
      "description": "함수 스코프와 호이스팅 문제"
    },
    ...
  ]
}

프롬프트가 짧습니다. 입력과 출력이 명확하고, 작업이 단순하기 때문입니다.

metadata-generator 에이전트

JSON을 읽어서 앱이 사용할 category.yaml을 생성합니다.

프롬프트 전문:

---
name: metadata-generator
description: When category.yaml files need complete metadata generation for learning topics
tools: Read, Write, MultiEdit, Bash
model: sonnet
---

You are a metadata generator that creates comprehensive category.yaml files for learning content.

## Single Purpose
Transform parsed topic data into complete, well-structured category.yaml files with all required metadata fields.

## Input

**필수**: metadata-parser가 저장한 JSON 파일을 반드시 읽어서 처리해야 합니다.

**파일 경로**: `/tmp/metadata/{majorSubject}-{categoryId}.json`

**프롬프트 형식**:
"Generate category.yaml for {majorSubject}/{categoryId}"

**필수 처리 순서**:
1. 프롬프트에서 majorSubject와 categoryId 추출
2. **Read tool로** `/tmp/metadata/{majorSubject}-{categoryId}.json` 파일 읽기
3. JSON 파싱하여 topics 배열 추출
4. `"success": true`인 경우 category.yaml 생성
5. `"success": false`인 경우 에러 메시지 출력
6. **Write tool로** category.yaml 파일 저장

## Category Metadata Generation

### 1. Extract Category Information
From the categoryId (e.g., "01-variables"):
- **id**: Semantic ID 생성 규칙
  - 번호 제거 + 의미있는 접미사
  - 01-variables → variables-basics
- **path**: 원본 categoryId 유지 (e.g., "01-variables")
- **title**: order 번호를 포함한 한국어 제목 (e.g., "1. JavaScript 변수 완전 정복")
- **order**: 접두 번호 추출 (01 → 1)

## Topic Metadata Enhancement

### For Each Topic, Generate:

1. **Expand Description**
   - Input: "함수 스코프와 호이스팅 문제"
   - Output: "var 키워드의 함수 스코프와 호이스팅으로 인한 문제점을 이해하고 해결 방법을 학습합니다"

2. **Extract Meaningful Tags**
   From title "var를 사용하면 어떤 문제가 발생할까?":
   - Extract: ["var", "호이스팅", "함수 스코프", "문제점"]

3. **Assign Difficulty**
   - beginner: 기초, 소개, 기본
   - intermediate: 비교, 차이점, 활용
   - advanced: 최적화, 패턴, 고급

4. **Set Estimated Time**
   - Default: 15 minutes per topic

## File Operations

### 필수 작업 순서:

1. **JSON 파일 읽기** (Read tool 사용)
2. **디렉토리 생성** (Bash tool 사용):
   mkdir -p public/content/ko/{majorSubject}/{categoryId}/
3. **category.yaml 생성** (Write tool 사용):
   경로: `public/content/ko/{majorSubject}/{categoryId}/category.yaml`

**중요**: docs/topic/*.md 파일을 직접 읽지 마세요. 반드시 JSON 파일에서 데이터를 가져와야 합니다.

출력 예시:

id: variables-basics
path: 01-variables
title: 1. 변수 완전 정복
description: JavaScript 변수의 모든 것을 마스터합니다
order: 1
difficulty: beginner
estimatedTime: 150
topics:
  - id: 01-var-problems
    title: var를 사용하면 어떤 문제가 발생할까?
    description: var 키워드의 함수 스코프와 호이스팅 문제점을 학습합니다
    order: 1
    difficulty: beginner
    tags: [var, 호이스팅, 함수 스코프]
  ...

이 프롬프트도 길지 않습니다. 입력(JSON)과 출력(YAML)이 명확하고, 변환 규칙이 단순합니다.

쉘스크립트: 빈 콘텐츠 파일 생성

쉘스크립트가 category.yaml을 읽어서 10개의 빈 마크다운 파일을 생성합니다. 각 파일에는 frontmatter와 Work Status Markers(WSM)가 포함됩니다.

---
id: 01-var-problems
title: var를 사용하면 어떤 문제가 발생할까?
description: 함수 스코프와 호이스팅 문제
difficulty: beginner
estimatedTime: 15
category: javascript-core-concepts
subcategory: 01-variables
order: 1
tags:
  - var
  - 호이스팅
---

<!--
CURRENT_AGENT: overview-writer
STATUS: IN_PROGRESS
STARTED: 2024-10-10T10:30:00+09:00
HANDOFF LOG:
[START] pipeline | Content generation started
[DONE] content-initiator | File initialized
-->

결과: 잘 동작함

이 파이프라인은 문제없이 작동했습니다.

  • 2개 에이전트 + 1개 쉘스크립트
  • 각 에이전트는 단순한 입출력 (마크다운 → JSON → YAML)
  • 쉘스크립트가 에이전트 호출 순서와 파일 생성 담당

169 + α개 카테고리의 메타데이터와 빈 파일들이 자동으로 생성되었습니다. “간단한 작업은 간단한 파이프라인으로 해결된다”는 걸 확인했습니다.

다음 편에서는 학습 콘텐츠 파이프라인에서 단일 프롬프트가 왜 안 됐는지 다룹니다.


이 시리즈는 AI-DLC(AI-assisted Document Lifecycle) 방법론을 실제 프로젝트에 적용한 경험을 공유합니다. AI-DLC에 대한 자세한 내용은 경제지표 대시보드 개발기 시리즈를 참고해주세요.