이메일 자동 분류 시스템 업무 자동화 Agent
from dotenv import load_dotenv
from typing import Literal
from pydantic import BaseModel, Field
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from langchain_core.tools import tool
load_dotenv()
llm = init_chat_model(
"google_genai:gemini-2.5-flash-lite",
temperature=0
)
class EmailCategory(BaseModel):
category: Literal[
"긴급",
"업무요청",
"회의/일정",
"계약/정산",
"뉴스레터",
"광고",
"개인",
"보관",
"스팸의심"
]
priority: Literal["높음", "보통", "낮음"]
reason: str = Field(description="분류 근거")
action: Literal[
"즉시확인",
"답장필요",
"캘린더확인",
"정산폴더",
"뉴스레터폴더",
"광고폴더",
"보관",
"스팸검토"
]
@tool
def fetch_recent_emails(limit: int = 20) -> str:
"""최근 이메일 목록을 가져옵니다. 실제 서비스에서는 Gmail API와 연결합니다."""
return """
[
{"id": "m1", "from": "client@company.com", "subject": "계약서 검토 요청", "body": "오늘 중 검토 부탁드립니다."},
{"id": "m2", "from": "newsletter@ai.com", "subject": "이번 주 AI 뉴스", "body": "최신 AI 동향입니다."},
{"id": "m3", "from": "mall@shop.com", "subject": "특가 할인", "body": "오늘만 50% 할인"}
]
"""
@tool
def classify_email(subject: str, sender: str, body: str) -> dict:
"""이메일 제목, 발신자, 본문을 보고 업무 분류/우선순위/처리 액션을 결정합니다."""
structured_llm = llm.with_structured_output(EmailCategory)
prompt = f"""
다음 이메일을 업무 자동화 기준으로 분류하세요.
발신자: {sender}
제목: {subject}
본문: {body}
기준:
- 마감, 오늘 중, 긴급, 요청, 승인, 계약, 결제, 정산은 우선순위를 높게 본다.
- 뉴스레터/광고는 낮음으로 본다.
- 애매하면 보관이 아니라 업무요청으로 보수적으로 분류한다.
"""
result = structured_llm.invoke(prompt)
return result.model_dump()
@tool
def apply_email_label(email_id: str, label: str) -> str:
"""이메일에 라벨을 적용합니다. 실제 서비스에서는 Gmail label API와 연결합니다."""
return f"{email_id} 이메일에 '{label}' 라벨 적용 완료"
@tool
def archive_email(email_id: str) -> str:
"""처리 완료 또는 중요도 낮은 이메일을 보관처리합니다."""
return f"{email_id} 이메일 보관 완료"
@tool
def create_reply_task(email_id: str, reason: str) -> str:
"""답장이 필요한 이메일을 할 일 목록에 등록합니다."""
return f"{email_id} 답장 태스크 생성 완료: {reason}"
tools = [
fetch_recent_emails,
classify_email,
apply_email_label,
archive_email,
create_reply_task,
]
system_prompt = """
당신은 이메일 자동 분류 업무 자동화 Agent입니다.
목표:
- 최근 이메일을 가져온다.
- 각 이메일을 업무 중요도와 성격에 따라 분류한다.
- 적절한 라벨을 붙인다.
- 답장/확인/일정 확인이 필요한 이메일은 태스크로 만든다.
- 광고, 뉴스레터, 중요도 낮은 메일은 보관하거나 별도 라벨 처리한다.
처리 원칙:
1. 이메일 목록이 필요하면 fetch_recent_emails를 사용한다.
2. 각 이메일은 classify_email로 분류한다.
3. 분류 결과에 따라 apply_email_label을 실행한다.
4. action이 답장필요 또는 즉시확인이면 create_reply_task를 실행한다.
5. 뉴스레터/광고/보관 대상은 archive_email을 사용할 수 있다.
6. 불확실한 이메일은 삭제하지 말고 '검토필요' 성격으로 남긴다.
7. 최종 답변에는 처리 결과 요약만 제공한다.
"""
agent = create_agent(
model=llm,
tools=tools,
system_prompt=system_prompt,
)
def run_email_agent():
result = agent.invoke({
"messages": [
{
"role": "user",
"content": "최근 이메일을 자동 분류하고 필요한 후속 조치까지 처리해줘."
}
]
})
return result["messages"][-1].content
if name == "__main__":
print(run_email_agent())
김유송 · 미션 4: 업무 자동화 Agent 만들기
박수 0 · 댓글 0