【效率】邮件分类与自动回复智能体

1. 需求分析与技术架构

1.1 核心需求

邮件分类与自动回复智能体需要具备以下核心能力:

  • 邮件读取:自动读取和解析邮件内容
  • 邮件分类:根据邮件内容自动分类(工作、个人、促销等)
  • 优先级识别:识别邮件的紧急程度和重要性
  • 信息提取:从邮件中提取关键信息(日期、时间、任务等)
  • 自动回复:根据邮件内容生成合适的自动回复
  • 个性化回复:根据发件人和内容生成个性化的回复
  • 任务提醒:基于邮件内容创建任务提醒
  • 批量处理:支持批量处理多封邮件

1.2 技术架构

我们将采用以下技术栈构建邮件分类与自动回复智能体:

┌─────────────────────┐
│     用户界面层      │
│  Gradio Web界面     │
└──────────┬──────────┘
           │
┌──────────▼──────────┐
│     智能体核心层     │
│  LangChain + LLM    │
└──────────┬──────────┘
           │
┌──────────▼──────────┐
│     工具与数据层     │
│ 1. 邮件读取工具      │
│ 2. 分类模型         │
│ 3. 信息提取工具     │
│ 4. 回复生成器       │
│ 5. 任务管理工具     │
└─────────────────────┘

2. 环境搭建与依赖配置

首先,我们需要创建项目并安装必要的依赖:

# 创建项目目录
mkdir email-classification-agent
cd email-classification-agent

# 初始化Python环境
python -m venv venv
venv\Scripts\activate  # Windows
# 或 source venv/bin/activate  # macOS/Linux

# 安装依赖
pip install langchain langchain-openai gradio pandas numpy scikit-learn

3. 核心功能实现

3.1 配置文件管理

创建 config.py 文件管理配置信息:

# config.py
import os
from dotenv import load_dotenv

load_dotenv()

# API密钥配置
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# 系统配置
SYSTEM_PROMPT = """你是一个专业的邮件处理助手,负责分类邮件并生成合适的回复。

你的职责包括:
1. 分析邮件内容,确定邮件类型和优先级
2. 从邮件中提取关键信息
3. 根据邮件内容生成专业、礼貌的回复
4. 识别需要后续跟进的任务
5. 确保回复符合上下文和邮件的正式程度

请保持专业的沟通风格,根据邮件的内容和语气调整回复的风格和内容。"""

# 邮件分类配置
EMAIL_CATEGORIES = {
    "工作": ["工作", "项目", "会议", "任务", "截止日期"],
    "个人": ["个人", "家庭", "朋友", "聚会", "邀请"],
    "促销": ["促销", "优惠", "折扣", "活动"],
    "垃圾邮件": ["垃圾", "广告", "不需要"],
    "重要": ["紧急", "重要", "立即", "必须"]
}

# 优先级配置
PRIORITY_LEVELS = {
    "高": "需要立即处理的紧急邮件",
    "中": "需要在近期处理的邮件",
    "低": "可以稍后处理的邮件"
}

# 回复模板配置
REPLY_TEMPLATES = {
    "默认": "感谢您的邮件。我会尽快处理您的请求并回复您。",
    "确认": "已收到您的邮件,我确认会按照您的要求处理。",
    "追问": "感谢您的邮件。为了更好地帮助您,我需要了解更多关于...",
    "拒绝": "感谢您的邮件。很遗憾,我无法满足您的请求,因为...",
    "接受": "非常感谢您的邮件。我很高兴接受您的邀请/提议。"
}

3.2 邮件处理工具

创建 email_processor.py 文件处理邮件:

# email_processor.py
import re
from langchain_openai import ChatOpenAI
from config import OPENAI_API_KEY, EMAIL_CATEGORIES, PRIORITY_LEVELS

class EmailProcessor:
    """邮件处理类"""
    
    def __init__(self):
        self.llm = ChatOpenAI(
            api_key=OPENAI_API_KEY,
            model="gpt-3.5-turbo",
            temperature=0.3
        )
    
    def parse_email(self, email_content):
        """解析邮件内容"""
        # 提取发件人
        sender_match = re.search(r'发件人[::]\s*(.+)', email_content)
        sender = sender_match.group(1).strip() if sender_match else "未知"
        
        # 提取主题
        subject_match = re.search(r'主题[::]\s*(.+)', email_content)
        subject = subject_match.group(1).strip() if subject_match else "无主题"
        
        # 提取日期
        date_match = re.search(r'日期[::]\s*(.+)', email_content)
        date = date_match.group(1).strip() if date_match else "未知"
        
        # 提取正文
        body_match = re.search(r'正文[::]\s*(.+)$', email_content, re.DOTALL)
        body = body_match.group(1).strip() if body_match else ""
        
        return {
            "sender": sender,
            "subject": subject,
            "date": date,
            "body": body
        }
    
    def classify_email(self, email_content):
        """分类邮件"""
        prompt = f"""
请分析以下邮件内容,确定其分类和优先级:

邮件内容:
{email_content}

分类选项:
{EMAIL_CATEGORIES}

优先级选项:
{PRIORITY_LEVELS}

请返回:
1. 主要分类
2. 优先级
3. 分类理由
        """
        
        response = self.llm.invoke(prompt)
        return response.content
    
    def extract_info(self, email_content):
        """提取邮件中的关键信息"""
        prompt = f"""
请从以下邮件内容中提取关键信息:

邮件内容:
{email_content}

需要提取的信息包括:
1. 任务或请求
2. 截止日期
3. 会议时间和地点
4. 联系人信息
5. 其他重要信息

请以结构化格式返回提取的信息。
        """
        
        response = self.llm.invoke(prompt)
        return response.content
    
    def generate_reply(self, email_content, style="专业"):
        """生成邮件回复"""
        prompt = f"""
请根据以下邮件内容生成一个{style}风格的回复:

邮件内容:
{email_content}

回复要求:
1. 开头礼貌问候
2. 针对邮件内容作出回应
3. 提供必要的信息或追问
4. 结尾礼貌结束语
5. 保持专业、简洁的语言风格

请直接生成回复内容,不要包含其他无关信息。
        """
        
        response = self.llm.invoke(prompt)
        return response.content
    
    def identify_tasks(self, email_content):
        """识别邮件中的任务"""
        prompt = f"""
请从以下邮件内容中识别需要后续跟进的任务:

邮件内容:
{email_content}

任务识别要求:
1. 提取需要完成的具体任务
2. 确定任务的截止日期(如果有)
3. 评估任务的优先级
4. 提供完成任务的建议步骤

请以结构化格式返回识别的任务。
        """
        
        response = self.llm.invoke(prompt)
        return response.content
    
    def process_batch_emails(self, emails):
        """批量处理邮件"""
        results = []
        
        for i, email in enumerate(emails):
            print(f"处理邮件 {i+1}/{len(emails)}")
            try:
                # 解析邮件
                parsed = self.parse_email(email)
                
                # 分类邮件
                classification = self.classify_email(email)
                
                # 提取信息
                info = self.extract_info(email)
                
                # 生成回复
                reply = self.generate_reply(email)
                
                # 识别任务
                tasks = self.identify_tasks(email)
                
                results.append({
                    "index": i+1,
                    "parsed": parsed,
                    "classification": classification,
                    "extracted_info": info,
                    "reply": reply,
                    "tasks": tasks
                })
            except Exception as e:
                results.append({
                    "index": i+1,
                    "error": str(e)
                })
        
        return results

3.3 智能体构建

创建 agent.py 文件构建智能体:

# agent.py
from langchain_openai import ChatOpenAI
from langchain.agents import AgentType, initialize_agent
from langchain.memory import ConversationBufferMemory
from email_processor import EmailProcessor
from config import OPENAI_API_KEY, SYSTEM_PROMPT

# 初始化LLM
llm = ChatOpenAI(
    api_key=OPENAI_API_KEY,
    model="gpt-3.5-turbo",
    temperature=0.7
)

# 初始化记忆
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# 初始化工具类
email_processor = EmailProcessor()

# 定义智能体工具
from langchain.tools import tool

@tool

def process_email(email_content: str) -> str:
    """处理单封邮件,包括分类、信息提取和回复生成"""
    try:
        # 解析邮件
        parsed = email_processor.parse_email(email_content)
        
        # 分类邮件
        classification = email_processor.classify_email(email_content)
        
        # 提取信息
        info = email_processor.extract_info(email_content)
        
        # 生成回复
        reply = email_processor.generate_reply(email_content)
        
        # 识别任务
        tasks = email_processor.identify_tasks(email_content)
        
        return f"邮件处理完成:\n\n解析结果:{parsed}\n\n分类结果:{classification}\n\n提取信息:{info}\n\n生成回复:{reply}\n\n识别任务:{tasks}"
    except Exception as e:
        return f"处理邮件时出错:{str(e)}"

@tool

def process_batch_emails(emails: str) -> str:
    """批量处理多封邮件"""
    try:
        # 解析邮件列表
        email_list = emails.strip().split('\n\n=== 邮件分隔符 ===\n\n')
        email_list = [e.strip() for e in email_list if e.strip()]
        
        # 批量处理
        results = email_processor.process_batch_emails(email_list)
        
        # 生成摘要
        summary = f"批量处理完成,共处理 {len(results)} 封邮件\n\n"
        for result in results:
            if "error" in result:
                summary += f"邮件 {result['index']}:处理失败 - {result['error']}\n"
            else:
                summary += f"邮件 {result['index']}:\n"
                summary += f"  发件人:{result['parsed']['sender']}\n"
                summary += f"  主题:{result['parsed']['subject']}\n"
                summary += f"  分类:{result['classification'].split('\n')[0]}\n"
                summary += f"  优先级:{result['classification'].split('\n')[1]}\n"
                summary += "\n"
        
        return summary
    except Exception as e:
        return f"批量处理邮件时出错:{str(e)}"

@tool

def generate_custom_reply(email_content: str, style: str, instructions: str) -> str:
    """生成自定义风格的邮件回复"""
    try:
        # 构建提示词
        prompt = f"""
请根据以下邮件内容生成一个{style}风格的回复,并遵循以下特别说明:

邮件内容:
{email_content}

特别说明:
{instructions}

回复要求:
1. 开头礼貌问候
2. 针对邮件内容作出回应
3. 遵循特别说明中的要求
4. 结尾礼貌结束语
5. 保持符合风格要求的语言表达

请直接生成回复内容,不要包含其他无关信息。
        """
        
        response = llm.invoke(prompt)
        return response.content
    except Exception as e:
        return f"生成自定义回复时出错:{str(e)}"

# 定义工具列表
tools = [
    process_email,
    process_batch_emails,
    generate_custom_reply
]

# 初始化智能体
email_agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    system_message=SYSTEM_PROMPT,
    verbose=True
)

3.4 Web界面构建

创建 app.py 文件构建Gradio Web界面:

# app.py
import gradio as gr
from agent import email_agent

# 处理单封邮件
def handle_process_email(email_content):
    # 调用智能体处理邮件
    result = email_agent.invoke(f"处理以下邮件:\n{email_content}")
    return result['output']

# 处理批量邮件
def handle_process_batch_emails(emails):
    # 调用智能体批量处理邮件
    result = email_agent.invoke(f"批量处理以下邮件:\n{emails}")
    return result['output']

# 生成自定义回复
def handle_generate_custom_reply(email_content, style, instructions):
    # 调用智能体生成自定义回复
    result = email_agent.invoke(f"生成{style}风格的回复,特别说明:{instructions},邮件内容:\n{email_content}")
    return result['output']

# 创建Gradio界面
with gr.Blocks(title="邮件处理智能助手") as demo:
    gr.Markdown("""
    # 邮件处理智能助手
    自动分类邮件、提取信息并生成回复,提高邮件处理效率!
    """)
    
    # 标签页
    with gr.Tabs():
        # 单封邮件处理标签页
        with gr.TabItem("单封邮件处理"):
            email_input = gr.Textbox(label="输入邮件内容", lines=15, placeholder="请输入邮件内容,格式如下:\n发件人:xxx\n主题:xxx\n日期:xxx\n正文:xxx")
            process_btn = gr.Button("处理邮件")
            result_output = gr.Textbox(label="处理结果", lines=20)
            
            process_btn.click(
                fn=handle_process_email,
                inputs=[email_input],
                outputs=[result_output]
            )
        
        # 批量邮件处理标签页
        with gr.TabItem("批量邮件处理"):
            batch_input = gr.Textbox(label="输入多封邮件", lines=20, placeholder="请输入多封邮件,每封邮件之间用 '=== 邮件分隔符 ===' 分隔")
            batch_btn = gr.Button("批量处理")
            batch_output = gr.Textbox(label="处理结果", lines=15)
            
            batch_btn.click(
                fn=handle_process_batch_emails,
                inputs=[batch_input],
                outputs=[batch_output]
            )
        
        # 自定义回复标签页
        with gr.TabItem("自定义回复"):
            reply_email_input = gr.Textbox(label="输入邮件内容", lines=10, placeholder="请输入需要回复的邮件内容")
            style_input = gr.Dropdown(label="回复风格", choices=["专业", "友好", "正式", "非正式", "简洁", "详细"])
            instructions_input = gr.Textbox(label="特别说明", lines=5, placeholder="请输入回复的特别要求或说明")
            reply_btn = gr.Button("生成回复")
            reply_output = gr.Textbox(label="生成的回复", lines=15)
            
            reply_btn.click(
                fn=handle_generate_custom_reply,
                inputs=[reply_email_input, style_input, instructions_input],
                outputs=[reply_output]
            )

# 启动应用
if __name__ == "__main__":
    demo.launch(share=True)

4. 部署与使用

4.1 本地部署

# 运行应用
python app.py

4.2 Docker容器化

创建 Dockerfile 文件:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 7860

CMD ["python", "app.py"]

创建 requirements.txt 文件:

langchain
langchain-openai
gradio
pandas
numpy
scikit-learn
python-dotenv

4.3 使用流程

  1. 单封邮件处理

    • 在"单封邮件处理"标签页输入邮件内容
    • 点击"处理邮件"按钮
    • 查看智能体的处理结果,包括分类、信息提取、回复和任务识别
  2. 批量邮件处理

    • 在"批量邮件处理"标签页输入多封邮件,每封邮件之间用"=== 邮件分隔符 ==="分隔
    • 点击"批量处理"按钮
    • 查看批量处理的摘要结果
  3. 自定义回复生成

    • 在"自定义回复"标签页输入需要回复的邮件内容
    • 选择回复风格
    • 输入特别说明或要求
    • 点击"生成回复"按钮
    • 查看智能体生成的自定义回复

5. 功能测试与优化

5.1 测试场景

  1. 单封邮件处理测试

    • 输入不同类型的邮件(工作、个人、促销)
    • 验证智能体的分类准确性
    • 检查信息提取的完整性
    • 评估自动回复的质量
  2. 批量邮件处理测试

    • 输入多封不同类型的邮件
    • 验证智能体的批量处理能力
    • 检查处理结果的一致性
    • 评估处理速度和效率
  3. 自定义回复测试

    • 为同一邮件生成不同风格的回复
    • 验证回复风格的准确性
    • 检查特别说明的执行情况
    • 评估回复的专业性和相关性
  4. 边界情况测试

    • 测试处理空邮件或格式不正确的邮件
    • 测试处理非常长的邮件
    • 测试处理包含特殊内容的邮件

5.2 优化建议

  1. 邮件读取优化

    • 增加对不同邮件格式的支持(Outlook、Gmail等)
    • 实现与邮件客户端的集成(如通过IMAP/POP3协议)
    • 支持附件处理和解析
  2. 分类能力增强

    • 训练专门的邮件分类模型,提高分类准确性
    • 实现用户自定义分类标签
    • 支持基于历史分类的学习和优化
  3. 回复质量提升

    • 增加更多回复风格选项
    • 实现回复模板的自定义和管理
    • 支持多语言回复生成
  4. 功能扩展

    • 增加邮件提醒和跟进功能
    • 实现与日历系统的集成
    • 支持邮件归档和检索
  5. 用户体验优化

    • 增加邮件处理历史记录
    • 实现回复的编辑和修改功能
    • 优化界面设计,提高操作流畅性

6. 总结与展望

6.1 项目总结

本实战案例成功构建了一个邮件分类与自动回复智能体,具备以下核心功能:

  • ✅ 邮件自动分类和优先级识别
  • ✅ 关键信息提取
  • ✅ 智能自动回复生成
  • ✅ 任务识别和提醒
  • ✅ 批量邮件处理
  • ✅ 自定义回复风格
  • ✅ Web界面交互
  • ✅ Docker容器化部署

6.2 未来展望

  1. 智能化升级

    • 引入更先进的自然语言处理模型,提高理解能力
    • 实现基于用户历史邮件的个性化学习
    • 开发邮件意图识别系统,更准确地理解用户需求
  2. 功能扩展

    • 支持团队邮件协作处理
    • 实现邮件数据分析和可视化
    • 增加邮件安全性检查
    • 支持多语言邮件处理
  3. 集成能力

    • 与主流邮件客户端(Outlook、Gmail、QQ邮箱等)集成
    • 与任务管理工具(Todoist、TickTick等)集成
    • 与日历系统(Google Calendar、Outlook Calendar等)集成
  4. 技术创新

    • 探索使用本地大模型进行邮件处理,保护隐私
    • 实现邮件处理的自动化工作流
    • 开发邮件智能助手的移动应用版本

通过本项目的实践,我们不仅掌握了AI智能体在邮件处理领域的应用方法,也了解了从邮件解析到自动回复的完整技术流程。随着技术的不断进步,邮件分类与自动回复智能体将在提高工作效率、减少信息过载方面发挥越来越重要的作用,成为现代办公环境中不可或缺的助手。

« 上一篇 【营销】竞品分析智能体:爬取网页,生成对比表格与策略 下一篇 » 【多媒体】视频脚本转图文短视频的智能体