에이전트 I/O 분석 & 토큰 최적화 보고서
ℹ️ [부분 구식] 이 보고서는 2026-02-27 기준 분석이다. 2026-04-17 재검증 필요 항목:
- SafetyAgent L54 (HIGH 낭비 — 재검증 TODO)
- EmotionAgent L36 (HIGH 낭비 — 재검증 TODO)
- ScriptPersonalizer emotional_journey 데드 코드 (재검증 필요)
본 페이지의 재검증은 별도 Task(계획서 범위 밖, 코드 수정 동반)로 진행된다. 본 업데이트는 상태 반영만 수행한다.
팟캐스트 파이프라인 전체 에이전트(팟캐스트 모드 전용) I/O 점검 및 토큰 최적화 보고서.
기준 테스트:
test_e2e_multi_provider.py(Ollama qwen2.5:14b, phi4:14b)
작성 시점: 2026-02-27 | 현재 프로덕션: AWS Bedrock APAC CRIS 엔드포인트 (v26 이후)
개요
LangGraph는 전체 AgentState dict를 모든 노드에 전달한다. 각 에이전트의 process()에서 필요한 필드만 읽도록 설계되어 있으나, 읽은 필드를 LLM 프롬프트에 넣을 때 불필요한 데이터까지 직렬화하는 곳이 존재한다.
토큰 낭비 요약
우선순위별 분류
| 우선순위 | 에이전트 | 문제 | 예상 절감 | 상태 |
|---|---|---|---|---|
| HIGH | SafetyAgent | intent dict 전체 직렬화 (risk_flag만 필요) | ~200-400 토큰/호출 | ⏳ 재검증 TODO (2026-04-17) |
| HIGH | EmotionAgent | intent dict 전체 직렬화 (사용 안 함) | ~200-400 토큰/호출 | ⏳ 재검증 TODO (2026-04-17) |
| HIGH | BatchValidator | script_draft 메타데이터 포함 직렬화 | ~300-500 토큰/호출 | ✅ 완료 (PR #132 score 보정, PR #159 이후 확정) |
| MEDIUM | PodcastReasoning | user_input 3회 반복 전달 | ~300-600 토큰/전체 | ✅ 완료 (user_input 3회 반복 제거) |
| MEDIUM | ScriptPersonalizer | emotional_journey 데드 코드 | 기능 결함 | ⏳ 재검증 필요 |
수정 상태 요약 (2026-04-17 기준)
| 항목 | 상태 | 비고 |
|---|---|---|
| BatchValidator | ✅ 완료 | PR #132 score 보정, PR #159 이후 확정 |
| PodcastReasoning | ✅ 완료 | user_input 3회 반복 제거 |
| SafetyAgent HIGH 낭비 | ⏳ 재검증 TODO | 2026-04-17 기준 — L54 intent dict 전체 직렬화 현황 재확인 필요 |
| EmotionAgent HIGH 낭비 | ⏳ 재검증 TODO | 2026-04-17 기준 — L36 intent dict 전체 직렬화 현황 재확인 필요 |
| ScriptPersonalizer emotional_journey 데드 코드 | ⏳ 재검증 필요 | 현행 코드 기준 데드 코드 여부 재확인 필요 |
정상 구현 (최적화 불필요)
| 에이전트 | 이유 |
|---|---|
| IntentClassifier | user_input만 전달 |
| ContentAnalyzer | _build_context_info()로 2개 필드만 선택 추출 |
| ScriptGenerator | user_input 직접 읽지 않음, 선택적 필드 사용 |
| LearningAgent | 조건부 포함 + 500자 truncation |
| VisualizationAgent | LLM에는 요약만 전달 |
에이전트별 I/O 매핑 (주요)
TIER 0: IntentClassifierAgent
- 파일:
src/agents/conversation/intent_classifier.py - 모델: Haiku
- State 읽기:
user_input,user_id,session_id - LLM에 전달:
user_input만 - State 쓰기:
intent,risk_level,risk_score,safety_flags,next_step - 토큰 효율: ✅ Clean
TIER 1: SafetyAgent (병렬)
- 파일:
src/agents/podcast/safety.py - 모델: Sonnet 4
- State 읽기:
user_input,intent - LLM에 전달:
user_input+ intent dict 전체 (L54) - 토큰 효율: ❌ HIGH 낭비 — risk_flag만 필요
TIER 1: EmotionAgent (병렬)
- 파일:
src/agents/podcast/emotion.py - 모델: Sonnet 4
- LLM에 전달:
user_input+ intent dict 전체 (L36) - 토큰 효율: ❌ HIGH 낭비 — intent 어떤 필드도 사용 안 함
TIER 1: ContentAnalyzerAgent (병렬)
- 파일:
src/agents/podcast/content_analyzer.py - 모델: Sonnet 4
- LLM에 전달: intent에서
primary_intent,complexity_score만 선택 추출 - 토큰 효율: ✅ Clean
TIER 2: ScriptGeneratorAgent
- 파일:
src/agents/podcast/script_generator.py - 모델: Sonnet 4
- LLM에 전달: 선택 추출된 필드만 (
main_theme,sub_themes등) - 토큰 효율: ✅ Clean — user_input 직접 읽지 않음
TIER 3: BatchValidatorAgent
- 파일:
src/agents/podcast/batch_validator.py - 모델: Sonnet 4
- 토큰 효율: ✅ 수정 완료 — title + full_script + segments 핵심 필드만 추출
파이프라인 전체 데이터 흐름도
[user_input, user_id, session_id]
│
▼
TIER 0: IntentClassifier
│ → intent, risk_level, risk_score, safety_flags
│
▼ (병렬 Fan-out)
TIER 1: Safety ← user_input + intent(risk_flag만 필요)
TIER 1: Emotion ← user_input + intent(불필요)
TIER 1: ContentAnalyzer ← user_input + intent(2개 필드만)
TIER 1: PodcastReasoning ← user_input + intent + execution_plan
│
▼ (Fan-in)
TIER 2: ScriptGenerator ← content_analysis + reasoning_result
TIER 2: Visualization(병렬) ← emotion_vectors + content_analysis
│
▼
TIER 3: BatchValidator ← script_draft + 4개 참조
│ └─ FAIL → TIER 2 재시도 (최대 2회)
▼
TIER 4: ScriptPersonalizer ← user_id + script_draft
│
▼ (비동기)
Learning ← 복합 데이터 → API 저장
원본: docs/reports/AGENT_IO_ANALYSIS.md | 작성일: 2026-02-27
최종 수정: 2026-04-17 17:30