본문으로 건너뛰기

에이전트 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 프롬프트에 넣을 때 불필요한 데이터까지 직렬화하는 곳이 존재한다.


토큰 낭비 요약

우선순위별 분류

우선순위에이전트문제예상 절감상태
HIGHSafetyAgentintent dict 전체 직렬화 (risk_flag만 필요)~200-400 토큰/호출⏳ 재검증 TODO (2026-04-17)
HIGHEmotionAgentintent dict 전체 직렬화 (사용 안 함)~200-400 토큰/호출⏳ 재검증 TODO (2026-04-17)
HIGHBatchValidatorscript_draft 메타데이터 포함 직렬화~300-500 토큰/호출✅ 완료 (PR #132 score 보정, PR #159 이후 확정)
MEDIUMPodcastReasoninguser_input 3회 반복 전달~300-600 토큰/전체✅ 완료 (user_input 3회 반복 제거)
MEDIUMScriptPersonalizeremotional_journey 데드 코드기능 결함⏳ 재검증 필요

수정 상태 요약 (2026-04-17 기준)

항목상태비고
BatchValidator✅ 완료PR #132 score 보정, PR #159 이후 확정
PodcastReasoning✅ 완료user_input 3회 반복 제거
SafetyAgent HIGH 낭비⏳ 재검증 TODO2026-04-17 기준 — L54 intent dict 전체 직렬화 현황 재확인 필요
EmotionAgent HIGH 낭비⏳ 재검증 TODO2026-04-17 기준 — L36 intent dict 전체 직렬화 현황 재확인 필요
ScriptPersonalizer emotional_journey 데드 코드⏳ 재검증 필요현행 코드 기준 데드 코드 여부 재확인 필요

정상 구현 (최적화 불필요)

에이전트이유
IntentClassifieruser_input만 전달
ContentAnalyzer_build_context_info()로 2개 필드만 선택 추출
ScriptGeneratoruser_input 직접 읽지 않음, 선택적 필드 사용
LearningAgent조건부 포함 + 500자 truncation
VisualizationAgentLLM에는 요약만 전달

에이전트별 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