서론
매일 업무를 하면서 자신의 활동이나 진척 상황을 일일 보고서(日報)로 기록하는 분들이 많지 않을까요. 하지만 이러한 일일 보고서를 수동으로 요약하여 관계자들과 공유하는 작업은 생각보다 많은 시간과 노력을 필요로 합니다. 특히 여러 프로젝트에 관여하거나 자유 형식(free form)으로 기록할 경우, 핵심 내용을 추출하는 것은 매우 어려운 작업입니다. 저의 에이전트 운영 업무에서도 매일 AI 에이전트의 동작이나 개선점을 기록한 로그를 주간 단위로 모아서 보고해야 했습니다. 이 수고를 AI로 자동화할 수 없을까 생각하다가, Claude Code와 Python, 그리고 macOS의 launchd를 조합한 자동화에 도달했습니다.
본 글에서는 Claude Code를 활용하여 일일 보고서 텍스트를 자동으로 요약하고, 이를 Python 스크립트로 Slack에 알림을 보내는 시스템 구축 방법을 실질적인 절차로 설명합니다. 매일의 보고 업무 부담을 줄이고 더 생산적인 활동에 시간을 할애하고 싶은 분들에게 분명 도움이 될 것입니다.
문제 제기: 일일 보고서 요약의 수고와 보고 지연
저는 평소 13개의 AI 에이전트를 운영하며, 이들의 활동 로그나 발생한 과제, 수행한 개선 사항 등을 일일 보고서로 기록하고 있습니다. 이러한 기록은 단순한 메모가 아니라 미래 에이전트 개선을 위한 귀중한 데이터 원천입니다. 하지만 이 일일 보고서는 자유 형식으로 작성되어 있어, 월말이나 주간 보고 시 과거의 일일 보고서를 다시 읽고 핵심 내용을 추출하여 보고서를 만드는 작업은 매우 오랜 시간이 걸렸습니다.
수동 작업은 다음과 같은 문제를 야기했습니다.
- 시간적 비용: 일일 보고서 읽기와 요약에 몇 시간까지 소요되기도 했습니다.
- 보고 지연: 작업이 미뤄져 보고가 늦어지는 경우가 있었습니다.
- 누락: 중요한 과제나 문제 기록을 놓칠 위험이 있었습니다.
이러한 문제를 해결하기 위해, AI에게 일일 보고서 요약을 맡기고 관계자 공유까지 자동화하는 것을 구상했습니다. 이를 통해 저의 소중한 시간을 확보하고, 더 고도한 의사결정이나 에이전트 튜닝에 집중할 수 있게 됩니다.
구현 절차: Claude Code로 일일 보고서 요약, Python으로 자동 알림, launchd로 상주화
여기서는 일일 보고서 텍스트 파일을 읽고, Claude Code로 요약하며, Python으로 Slack에 알리고, 최종적으로 launchd를 통해 매일 자동으로 실행하는 구체적인 절차를 설명합니다.
1. 구성 개요
이번 자동화의 주요 컴포넌트는 다음과 같습니다.
- 일일 보고서 파일: 일일 업무 내용을 기록한 텍스트 파일.
- Python 스크립트: 일일 보고서 파일 읽기, Claude API 호출, Slack API 호출을 담당합니다.
- Claude Code (API): 자연어 처리 능력을 활용하여 일일 보고서에서 핵심 내용을 추출하고 요약합니다.
- Slack Webhook: 요약된 내용을 특정 Slack 채널에 알림으로 전송합니다.
- launchd: macOS 상에서 Python 스크립트를 주기적으로 실행하기 위한 스케줄러입니다.
2. Python 스크립트 작성
먼저, 일일 보고서 파일을 읽고, Claude Code로 요약하며, Slack에 알리는 Python 스크립트를 만듭니다. Claude API 키와 Slack Webhook URL은 환경 변수에서 가져오도록 합니다. pip install anthropic requests python-dotenv
으로 필요한 라이브러리를 설치해 주세요.
daily_report_summarizer.py
import os
import glob
from datetime import datetime, timedelta
...
이 스크립트는 실행일의 전날짜 일일 보고서 파일 (YYYY-MM-DD.txt)을 ./daily_reports 디렉토리에서 읽도록 설계되었습니다. Claude Code 모델은 claude-3-opus-20240229를 지정했지만, 비용이나 속도를 고려하여 sonnet나 haiku로 변경하는 것도 가능합니다.
.env 파일에 API 키와 Webhook URL, 리포트 디렉토리를 설정해 주세요.
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
CLAUDE_API_KEY="sk-ant-***"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
REPORT_DIR="/Users/youruser/Documents/daily_reports" # 당신의 일보 파일 경로로 수정
3. launchd로 스크립트를 상주화(常駐化)
macOS에서 Python 스크립트를 매일 자동으로 실행시키기 위해 launchd를 이용합니다. 다음 내용으로 plist 파일을 작성하고, ~/Library/LaunchAgents/ 디렉토리에 저장합니다. 파일명은 com.ahic.dailyreportsummarizer.plist와 같이 고유한 것으로 지정해 주세요.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
주의사항: ProgramArguments의 Python 경로와 스크립트 경로, WorkingDirectory, StandardOutPath, StandardErrorPath, REPORT_DIR는 본인의 환경에 맞게 수정해 주세요. EnvironmentVariables에서 API 키 등을 직접 기재할 수도 있지만, 보안을 고려하여 .env 파일을 이용하고 동시에 python3의 경로가 .env를 적절하게 읽어오는지 확인하거나, 키를 안전한 방법으로 관리하는 것을 권장합니다. 이번에는 .env 파일을 읽는 스크립트이므로, EnvironmentVariables에는 PATH만 기재하고 나머지는 .env 파일에 맡기는 운영도 가능합니다.
4. launchd 설정 로드
plist 파일을 작성했다면, 다음 명령어로 launchd에 로드합니다.
launchctl load ~/Library/LaunchAgents/com.ahic.dailyreportsummarizer.plist
설정을 언로드(unload)할 때는 launchctl unload, 로드된 작업 목록을 확인할 때는 launchctl list를 사용합니다.
막히는 부분과 대처법 (ハマりどころと対処法)
1. Claude API의 토큰 상한 및 비용
Claude Code는 매우 고성능이지만, API 이용에는 토큰 수에 따른 비용이 발생합니다. 긴 일보를 빈번하게 요약할 경우, 비용이 많이 들 수 있습니다. 또한, 한 번에 전송 가능한 토큰 수에도 상한이 있습니다.
대처법:
- 프롬프트 조정: 불필요한 정보를 덜어내고, 요약에 필요한 정보만 Claude에게 전달하도록 프롬프트를 고안합니다. - 모델 선택:
claude-3-opus는 가장 고성능이지만 비쌉니다. 일상적인 요약에는 claude-3-sonnet이나 claude-3-haiku와 같이 더 저렴하고 빠른 모델을 고려해 주세요. - 일보 작성 규칙: 일보를 작성할 때, AI가 요약하기 쉽도록 어느 정도 구조화나 키워드 사용을 의식하는 것도 효과적입니다.
2. launchd의 경로 및 환경 변수
launchd로 스크립트를 실행할 때는 셸 환경과는 다른 경로와 환경 변수로 실행되기 때문에, 예상치 못한 오류에 직면할 수 있습니다.
대처법:
- 절대 경로 지정: Python 실행 파일이나 스크립트의 경로는 반드시 절대 경로로 지정합니다. -
which python3 명령어로 Python의 정확한 경로를 확인할 수 있습니다.
- 스크립트가 파일을 읽고 쓰기 할 때 올바른 디렉토리를 참조할 수 있도록,
WorkingDirectory 설정을 합니다. - 로그 확인: StandardOutPath와 StandardErrorPath로 지정한 로그 파일을 자주 확인하고, 오류 메시지를 분석합니다.
3. 프롬프트 엔지니어링의 시행착오
Claude Code의 요약 정확도는 제공하는 프롬프트에 크게 의존합니다. 처음부터 완벽한 요약을 얻을 수 있는 것은 아닙니다.
대처법:
- 구체적인 지시: 어떤 정보를 추출하고, 어떤 형식으로 출력받고 싶은지를 구체적으로 지시합니다. 이번 스크립트처럼 '수행한 태스크', '달성한 성과' 등의 제목을 지정하면 구조화된 출력을 얻기 쉽습니다. - Few-shot Learning: 가능하다면 몇 가지 일일 보고서와 그 요약 예시를 프롬프트에 포함함으로써 Claude의 이해도를 높이고 기대하는 출력을 얻기 쉬워집니다. - 단계적 개선: 우선 간단한 프롬프트로 작동시켜보고, 출력 결과를 보면서 조금씩 개선해 나가는 것이 효율적입니다.
요약
이 글에서는 Claude Code와 Python, 그리고 launchd를 결합하여 일일 보고서의 자동 요약 및 Slack 알림 시스템을 구축하는 실질적인 방법을 소개했습니다.
저 자신도 이 시스템을 도입한 이후로 매일의 보고 업무에 소요되던 시간과 정신적 부담이 극적으로 줄었습니다. 수동 요약 작업에서 해방됨으로써, 더 전략적인 업무나 AI 에이전트 최적화에 집중할 수 있게 되었습니다. 이는 말 그대로 AI 에이전트와 인간이 협력하여 일하는 모습의 한 예라고 할 수 있습니다.
이번에 소개한 방법은 일일 보고서 요약뿐만 아니라, 다양한 텍스트 기반 업무(예를 들어, 고객 문의 이메일 요약, 웹사이트 업데이트 정보 추출, 회의록 요약 작성 등)에도 응용 가능합니다. 꼭 본인의 업무에서 '비효율'을 찾아내어 Claude Code와 Python의 힘으로 자동화에 도전해 보세요. 당신의 생산성을 향상시키는 강력한 도구가 될 것입니다.
토론