AI가 매일 새벽 1시에 혼자 일한다 — dream_loop.py 야간 합성 시스템
잠든 사이 AI가 그날의 학습을 정리하고 내일 할 일을 도출한다. JARVIS 야간 합성 시스템 구축 과정.
아이디어
하루 종일 봇들과 작업하면서 배운 것들이 쌓입니다. growth_log.md에 기록합니다.
근데 낮 동안은 바빠서 이걸 정리할 시간이 없었습니다.
“자는 동안 AI가 오늘 것 정리하고 내일 방향을 잡아주면 어떨까?”
동작 방식
매일 새벽 1시, Windows Task Scheduler가 dream_loop.py를 실행합니다.
흐름:
1. growth_log.md 읽기 (오늘 추가된 항목)
2. 최근 봇회의 기록 읽기 (debates/)
3. LLM에게 종합 분석 요청
4. 드림 리포트 생성 → dreams/YYYY-MM-DD.md
5. goal_state.json 갱신 (우선순위 업데이트)
6. Telegram으로 결과 보고 (아침에 일어나면 확인)
실제 리포트 예시 (개인정보 제거)
# Dream Report 2026-05-19
## 오늘의 핵심 인사이트
- 봇 타임아웃 문제: 큰 모델(24B+)은 실시간 회의에 부적합
- JSON 파싱 실패율 30%: 재시도 로직 필수
- Telegram MCP 세션 끊김: 세션 상태 파일로 보완
## 내일 우선순위
1. gemma3:12b로 회의 봇 교체 (타임아웃 해결)
2. JSON 파싱 retry 로직 추가
3. JARVIS_STATE.md 자동 갱신 스크립트
## 중장기 방향
Pearl Finder 품질보다 실제 경험 기록 콘텐츠가 더 가치 있을 듯
코드 핵심 구조
import schedule
import time
def run_dream_loop():
# 오늘 growth_log 항목 추출
today_learnings = read_recent_learnings("D:/knowledge/learnings/growth_log.md")
# 최근 봇회의 기록
recent_debates = read_latest_debate("D:/knowledge/debates/")
# LLM 합성
synthesis_prompt = f"""
오늘의 학습:
{today_learnings}
최근 회의 결론:
{recent_debates}
위 내용을 바탕으로:
1. 핵심 인사이트 3가지
2. 내일 우선 순위 액션 3가지
3. 중장기 방향 제안
을 마크다운으로 정리해줘.
"""
report = ask_ollama(synthesis_prompt, model="qwen3:14b")
# 저장
date_str = datetime.now().strftime("%Y-%m-%d")
save_report(f"D:/knowledge/dreams/{date_str}.md", report)
# goal_state 갱신
update_goal_state(report)
# Telegram 보고
send_telegram(f"🌙 Dream Report {date_str}\n\n{report[:500]}...")
schedule.every().day.at("01:00").do(run_dream_loop)
겪었던 문제들
문제 1: LLM이 새벽에 멈춤
새벽 1시에 Ollama 컨테이너가 응답 안 하는 경우가 있었습니다. 모델이 VRAM에서 언로드된 후 재로딩 중 타임아웃.
해결: 타임아웃 180초로 늘리고, 실패 시 더 작은 모델(gemma3:4b)로 폴백.
def ask_with_fallback(prompt: str) -> str:
try:
return ask_ollama(prompt, model="qwen3:14b", timeout=180)
except TimeoutError:
return ask_ollama(prompt, model="gemma3:4b", timeout=60)
문제 2: growth_log에 아무것도 없는 날
아무 작업 안 한 날은 growth_log에 새 항목이 없습니다. LLM이 빈 내용으로 허황된 리포트를 만들었습니다.
해결: 오늘 항목 없으면 스킵. 대신 “오늘은 휴식일” 간단 로그만 남김.
문제 3: 봇회의 직후 드림루프 중복 실행
봇회의(bot_meeting.py)가 끝나면 dream_loop도 트리거합니다. 그런데 01:00 스케줄도 있어서 하루에 두 번 실행될 수 있었습니다.
해결: 당일 리포트가 이미 있으면 스킵.
def run_dream_loop():
date_str = datetime.now().strftime("%Y-%m-%d")
report_path = f"D:/knowledge/dreams/{date_str}.md"
if os.path.exists(report_path):
print(f"오늘 리포트 이미 있음: {report_path}")
return
# ... 나머지 로직
실제로 도움이 됐나
아침에 일어나면 Telegram에 전날 밤 리포트가 와 있습니다. 오늘 뭘 먼저 해야 할지 정리돼 있어서 좋습니다.
정확도는 50% 정도입니다. 엉뚱한 우선순위를 잡을 때도 있습니다. 하지만 “어제 뭘 했더라”를 상기시켜주는 역할로는 충분합니다.
Task Scheduler 등록
$trigger = New-ScheduledTaskTrigger -Daily -At "01:00"
$action = New-ScheduledTaskAction `
-Execute "python" `
-Argument "D:\bots\dream_loop.py" `
-WorkingDirectory "D:\bots"
Register-ScheduledTask `
-TaskName "JARVIS\DreamLoop" `
-Trigger $trigger `
-Action $action `
-RunLevel Highest