메일함을 대신 지키는 자율 에이전트를 만들었다.
도착한 메일을 스스로 읽고 분류해, 봐야 할 것만 받은편지함에 남기고 답장 초안까지 준비한다.
받은 메일을 한 줄로 요약해 주는 도구가 아닙니다. 읽지 않아도 될 메일을 스스로 읽음 처리하고, 업무 메일이면 답장 초안을 만들고, 고객사 프로젝트 폴더에 아카이브하고, 피드백을 받으면 규칙으로 학습하는 — 사람 옆에서 메일을 정리해 주는 유능한 담당자에 가깝습니다.
이 에이전트의 핵심 가치는 자동 읽음 처리 — 이른바 트리아지(triage)입니다.
하루에도 수십 통씩 쌓이는 뉴스레터·자동 알림·시스템 메일이 정작 중요한 메일을 파묻습니다.
에이전트는 각 메일이 직접 읽거나 조치해야 하는 메일인지를 판단해, 그렇지 않은 메일은 스스로 읽음 처리합니다. 받은편지함에는 사람이 봐야 할 메일만 남습니다. (언제든 되돌리기 가능)
대부분의 도구는 "발신자/키워드 → 라벨/필터"의 고정 규칙 — MailAgent는 에이전트이기에 다릅니다.
키워드 매칭이 아니라, 메일 본문 전체를 LLM이 읽고 "읽을 필요가 있는지"를 판단합니다.
업무 메일이면 내 문체를 학습해 답장 초안을 임시보관함에 넣어 둡니다. (발송은 사람이)
"이런 메일은 무시해줘" 한마디가 영속 규칙이 되어 다음 폴링부터 반영됩니다.
cron이 몇 분마다 받은편지함을 폴링하고, 각 스레드를 LLM이 한 번에 분류·조치합니다.
cron이 받은편지함을 주기적으로 확인 (멱등성 커서로 중복 방지)
카테고리·읽을 필요·답장 필요·초안을 JSON으로 한 번에 판단
불필요 메일 읽음 처리 · 업무 메일 답장 초안 · 프로젝트 Drive 저장
웹 대시보드·채팅에서 결과를 보고, 발송은 사람이 Gmail에서
모든 상태(스레드·초안·규칙·읽음/복원)는 로컬 DB와 AuditLog에 영속 기록 — 되돌리기와 추적이 가능합니다.
카테고리는 "이 메일을 어떻게 처리할지"의 출발점 — 카테고리에 얽매이지 않고 내용으로 읽을 필요를 판단합니다.
| 카테고리 | 어떤 메일 | 처리 |
|---|---|---|
| onboarding | 도입 신청·셋업 등 신규 고객 진입 메일 | 답장 초안 + Drive 아카이브 |
| dev | 고객↔개발 왕래 (버그·요청·QA) | 답장 초안 + Drive 아카이브 |
| internal | 내부 알림·요약 대상 | 일일 요약에 포함 (초안 없음) |
| ignore | 스팸·뉴스레터·자동 메일 | 무시 (읽음 처리 후보) |
고객사별 대화가 흩어지지 않도록, 업무 메일을 프로젝트 Drive 폴더에 Google Doc으로 저장합니다.
웹 검토 채팅이 학습의 창구 — 자연어 피드백이 영속 규칙이 되어 다음 배치 분류에 주입됩니다.
검토 에이전트는 LangGraph tool-loop — 규칙은 DB 구조화 메모리로 저장되고 LLM이 해석·적용합니다 (키워드 매칭 없음).
한 번 알려준 기준이 규칙으로 축적되어, 같은 판단을 다시 묻지 않습니다.
| 규칙 종류 | 학습하는 것 |
|---|---|
| sender_rule | 특정 발신자·도메인 처리 (카테고리 고정, 무시 등) |
| category_rule | 분류 기준 보정 |
| read_rule | 안 읽어도 되는(자동 읽음 처리) 메일 조건 — 트리아지의 핵심 |
| draft_rule | 초안 작성 여부·포함할 내용 |
| tone_rule | 답장 문체·어투 |
규칙은 공유 메모리(SoT)로 저장되고, 모든 변경은 AuditLog에 출처와 함께 추적됩니다.
| 능력 | 도구 | 하는 일 |
|---|---|---|
| 👁 조회 | list_recent_classifications · get_thread_detail | 최근 분류 결과·읽음 상태 확인 |
| 🧠 학습 | write_rule / update_rule / delete_rule | 규칙 저장·갱신·비활성화 (upsert·soft-delete) |
| ✂ 교정 | set_thread_category | 특정 스레드 한 건만 일회성 교정 (일반화 금지) |
| 📥 읽음 | mark_thread_read / mark_thread_unread | 개별 스레드 읽음 처리 / 안읽음 복원 |
| 🗂 아카이브 | list_projects · list_pending_archive · archive_thread_to_project | 보류된 메일을 사람이 프로젝트 지정해 저장 |
초안까지만 만들고 실제 발송·최종 판단은 사람이. 오발송 리스크 0. 읽기+초안 스코프만 사용(발송 스코프 미사용).
자동 읽음 처리는 안읽음 복원이 가능하고, 모든 읽음/복원·규칙 변경은 AuditLog에 남습니다.
멱등성 커서로 이미 본 스레드는 skip, 초안 상한(--max-drafts)으로 첫 실행의 대량 생성을 차단(초과분은 다음 실행에서).
프로젝트 매칭이 불확실하면 억지로 저장하지 않고 pending으로, 읽을 필요가 불확실하면 보수적으로 "읽어야 함" 처리.
하루 수십~수백 통의 받은편지함 기준, 수동 처리 대비 절감 효과 (메일량에 따라 변동).
| 업무 항목 | 이전 (수동) | 이후 (MailAgent) | 절감 |
|---|---|---|---|
| 불필요 메일 훑기·정리 | 매일 20~40분 | 자동 읽음 처리 | 대부분 자동화 |
| 답장 초안 작성 | 5~15분/건 | 검토·수정 2~3분 | 약 70% |
| 고객 메일 아카이브 | 3~5분/건 | 자동 저장 | 100% 자동화 |
| 중요 메일 놓침 | 파묻혀 지연 | 받은편지함에 상시 노출 | 누락 위험 ↓ |
cron + Django management command (poll_inbox) — 브로커 없는 최경량 배치
OpenRouter (OpenAI 호환) · anthropic/claude-sonnet-4 — 키 하나로 모델 교체
LangGraph tool-loop (StateGraph · 도구 바인딩) · LangChain · LangSmith 추적
Django · Django admin 감독 콘솔 · 웹 검토 채팅 UI
PostgreSQL — 스레드·초안·규칙·감사로그 영속 (로컬 DB = SoT)
Gmail·Drive·Docs (standarda-core 클라이언트) · OAuth gmail.modify
설계 원칙 — "발송하지 않는 자율성": 사람의 최종 판단을 남긴 채, 그 앞단의 반복 노동을 걷어낸다
신뢰가 쌓인 카테고리부터 초안을 넘어 자동 발송으로 승격.
규칙이 늘어나면 관련 규칙만 선별해 프롬프트에 주입.
메일이 쌓일수록 더 잘 걸러 주는 에이전트