基于大模型与邮件协议构建AI法律助手:从原理到工程实践
最近在技术圈里Perplexity AI 这家以“答案引擎”闻名的公司又有了新动作。其 CEO Aravind Srinivas 在社交媒体上透露他们正在开发一款基于邮件交互的 AI 律师助手。这听起来像是将复杂的法律咨询简化成了像发邮件一样简单的日常操作。对于开发者、创业者甚至是需要处理简单法律事务的个人来说这无疑是一个值得关注的技术应用方向。本文将从一个技术实践者的角度深入探讨如何利用现有的大模型LLM和邮件技术构建一个类似的、功能可控的“AI 邮件助手”原型。我们将聚焦于技术实现路径涵盖从系统架构设计、邮件自动化处理、提示词工程到安全边界的完整闭环。无论你是想了解 AI Agent 的应用落地还是对邮件与 AI 的集成开发感兴趣这篇文章都将提供一套可复现的实战方案。1. 背景与核心概念为什么是“邮件版AI助手”在深入代码之前我们有必要理解 Perplexity 这个产品思路背后的逻辑以及它为何在技术上有其独特优势。1.1 Perplexity AI 与“答案引擎”Perplexity AI 不同于传统的 ChatGPT 等聊天机器人它将自己定位为“答案引擎”。其核心特点是实时联网搜索能够获取并整合最新的网络信息。来源引用提供的答案会附上信息来源链接增强可信度。精准问答旨在直接回答用户问题而非开放式闲聊。这种“获取-整合-回答”的模式非常适合需要依据最新法规、判例或条款的法律咨询场景。1.2 邮件作为交互界面的优势选择邮件作为交互载体是一个巧妙的产品设计技术上主要带来以下几点好处低门槛与高普及性用户无需下载新App使用任何邮箱客户端如 Gmail, Outlook, Foxmail即可交互。异步与结构化邮件天生支持异步、长文本的沟通适合处理需要详细描述和复杂回复的法律问题。自动化集成友好邮件协议如 IMAP/SMTP成熟稳定易于通过程序自动收发、解析和回复为构建自动化AI Agent提供了天然管道。记录与追溯完整的邮件线程本身就是一份咨询记录便于用户留存和后续追溯。1.3 AI 律师助手的能力边界需要明确的是当前阶段的 AI 律师助手是“辅助”工具而非“替代”工具。它可能具备的能力包括法律信息查询与摘要解释法律术语总结法条要点。文档审阅提示指出合同中的常见风险条款如无限责任、模糊定义。流程咨询提供关于诉讼、仲裁、注册公司等流程的一般性指引。草拟简单文书生成律师函、催告通知、简单协议草案等。其核心风险在于“AI幻觉”即模型可能生成看似合理但完全错误或虚构的法律依据。因此任何此类系统的设计都必须包含严格的风险提示和免责声明。2. 环境准备与版本说明我们将使用 Python 作为主要开发语言因为它拥有丰富的 AI 和邮件处理库。本项目将构建一个本地运行的原型系统。2.1 基础环境操作系统macOS / Linux / Windows (WSL2 推荐)Python 版本3.9 或 3.10建议使用虚拟环境包管理工具pip2.2 核心依赖库我们将使用以下库请通过pip安装pip install openai # 用于调用大模型 API (如 GPT-4) pip install langchain # AI 应用框架用于组装链式工作流 pip install python-dotenv # 管理环境变量如API密钥 pip install imbox # 用于读取邮件IMAP客户端 pip install yagmail # 用于发送邮件更简易的SMTP客户端 pip install beautifulsoup4 # 用于解析HTML邮件内容 pip install langchain-community # LangChain 社区工具可能包含邮件工具注意openai库需要有效的 OpenAI API 密钥。你也可以替换为其他兼容 OpenAI API 的本地模型或云端服务如 DeepSeek, Qwen等。2.3 项目结构创建如下项目目录结构ai_lawyer_mail_assistant/ ├── .env # 存储敏感信息API密钥、邮箱密码 ├── config.py # 配置文件 ├── mail_client.py # 邮件收发核心模块 ├── ai_agent.py # AI 处理与逻辑控制模块 ├── prompt_templates.py # 提示词模板 ├── main.py # 主程序入口 └── requirements.txt # 依赖列表3. 核心原理与架构拆解我们的系统本质上是一个“邮件触发 AI 处理 邮件回复”的自动化流程。其核心架构如下图所示概念图用户发送邮件 - [IMAP 收件箱] - 监控程序拉取新邮件 - 解析邮件发件人、主题、正文 | v [AI 处理引擎] - 安全与权限校验 - 调用大模型结合提示词- 生成回复草稿 | v [回复生成与审核] - 格式化回复 - 可选人工审核环节- 通过 SMTP 发送回复邮件 | v 用户收到 AI 回复邮件3.1 邮件自动化流程监听使用 IMAP 协议定期检查目标邮箱的新邮件。解析提取关键信息发件人邮箱身份标识、邮件主题问题类型、纯文本/HTML正文核心问题。触发当邮件符合特定条件如发送到特定地址、包含特定关键词时启动 AI 处理流程。3.2 AI 处理引擎核心这是系统的“大脑”我们使用 LangChain 来构建一个可控的链式工作流Chain。提示词工程设计针对法律咨询的专用提示词System Prompt明确 AI 的角色、能力边界和回答格式。上下文管理将邮件正文、历史对话同一邮件线程作为上下文输入给模型。工具调用可以集成“联网搜索”工具让 AI 能获取最新法律动态或“文档读取”工具分析用户附件。输出解析确保 AI 的回复结构清晰并自动添加必要的免责声明。3.3 安全与权限发件人白名单只处理来自授权邮箱的请求避免被滥用。频率限制限制同一发件人单位时间内的请求次数。内容过滤对输入和输出进行基础的关键词过滤防止处理极端或非法内容。免责声明每封回复邮件都必须清晰标明“本内容由AI生成不构成正式法律意见仅供参考”。4. 完整实战案例构建简易版 AI 邮件法律助手下面我们一步步实现一个基础版本。请注意此版本为原型用于演示核心流程不具备生产级稳定性。4.1 配置与环境变量首先创建.env文件存储密钥切勿提交至代码仓库# .env OPENAI_API_KEYsk-your-openai-api-key-here # 邮箱配置以QQ邮箱为例需开启IMAP/SMTP服务并获取授权码 EMAIL_ACCOUNTyour_emailqq.com EMAIL_PASSWORDyour_authorization_code # 注意是授权码非登录密码 IMAP_SERVERimap.qq.com IMAP_PORT993 SMTP_SERVERsmtp.qq.com SMTP_PORT465 ALLOWED_SENDERuserexample.com # 允许的发件人多个用逗号分隔创建config.py来加载配置# config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的变量 class Config: OPENAI_API_KEY os.getenv(OPENAI_API_KEY) EMAIL_ACCOUNT os.getenv(EMAIL_ACCOUNT) EMAIL_PASSWORD os.getenv(EMAIL_PASSWORD) IMAP_SERVER os.getenv(IMAP_SERVER) IMAP_PORT int(os.getenv(IMAP_PORT, 993)) SMTP_SERVER os.getenv(SMTP_SERVER) SMTP_PORT int(os.getenv(SMTP_PORT, 465)) ALLOWED_SENDERS os.getenv(ALLOWED_SENDER, ).split(,) # AI 模型配置 MODEL_NAME gpt-4o-mini # 可根据情况调整如 gpt-3.5-turbo4.2 邮件客户端模块创建mail_client.py负责邮件的读取和发送。# mail_client.py import email from imbox import Imbox import yagmail from config import Config import re class MailClient: def __init__(self): self.config Config() # 初始化接收客户端 (IMAP) self.imap_client Imbox( self.config.IMAP_SERVER, usernameself.config.EMAIL_ACCOUNT, passwordself.config.EMAIL_PASSWORD, sslTrue, ssl_contextNone, starttlsFalse ) # 初始化发送客户端 (SMTP) self.smtp_client yagmail.SMTP( userself.config.EMAIL_ACCOUNT, passwordself.config.EMAIL_PASSWORD, hostself.config.SMTP_SERVER, portself.config.SMTP_PORT, smtp_sslTrue ) def fetch_unread_emails(self): 获取未读邮件 messages self.imap_client.messages(unreadTrue) emails [] for uid, message in messages: # 提取发件人 from_addr message.sent_from[0][email] if message.sent_from else unknown # 提取纯文本正文 body self._extract_plain_text(message) email_data { uid: uid, from: from_addr, subject: message.subject or (无主题), body: body, raw_message: message } emails.append(email_data) return emails def _extract_plain_text(self, message): 从邮件对象中提取纯文本内容优先取 text/plain 部分 body if message.body[plain]: body \n.join(message.body[plain]) elif message.body[html]: # 简单去除HTML标签生产环境可用BeautifulSoup html_content \n.join(message.body[html]) clean re.compile(.*?) body re.sub(clean, , html_content) return body.strip() def send_reply(self, to_email, subject, body, in_reply_toNone): 发送回复邮件 # 在正文末尾添加强制免责声明 disclaimer \n\n---\n**免责声明**本回复由人工智能模型生成仅供参考不构成正式法律意见。对于重要法律事务请务必咨询执业律师。 full_body body disclaimer try: self.smtp_client.send( toto_email, subjectfRe: {subject} if not subject.startswith(Re:) else subject, contentsfull_body, # headers{In-Reply-To: in_reply_to} # 可设置邮件线程头高级功能 ) print(f邮件已发送至: {to_email}) return True except Exception as e: print(f发送邮件失败: {e}) return False def mark_as_read(self, uid): 将邮件标记为已读 self.imap_client.mark_seen(uid) def __del__(self): if hasattr(self, imap_client): self.imap_client.logout()4.3 提示词与AI代理模块创建prompt_templates.py定义系统提示词。# prompt_templates.py LAWYER_ASSISTANT_SYSTEM_PROMPT 你是一名专业的AI法律助理旨在为用户提供初步的法律信息参考和问题分析。请严格遵守以下规则 1. **角色与边界**你是辅助工具不是执业律师。你的回答不能替代专业法律咨询。 2. **回答风格**语言严谨、清晰、有条理。使用中文回答。 3. **内容要求** - 对于法律概念先给出通俗解释再说明其法律意义。 - 分析用户问题时应逻辑清晰分点论述。 - 如果涉及具体法条应注明法律名称及可能适用的条款例如《民法典》第XXX条并提醒用户法条可能更新。 - 如果问题超出你的知识范围或涉及重大利益必须明确建议用户“咨询执业律师”。 4. **格式要求** - 开头先总结用户的核心问题。 - 主体部分分点回答。 - 结尾必须包含“**重要提示**本回复基于AI模型对您问题的理解生成不构成具有法律约束力的意见。在采取任何法律行动前请寻求专业律师的帮助。” 用户问题如下 创建ai_agent.py负责调用大模型处理邮件内容。# ai_agent.py from langchain_openai import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage from config import Config from prompt_templates import LAWYER_ASSISTANT_SYSTEM_PROMPT class AIAgent: def __init__(self): self.config Config() self.llm ChatOpenAI( modelself.config.MODEL_NAME, openai_api_keyself.config.OPENAI_API_KEY, temperature0.2 # 温度调低使输出更稳定、严谨 ) def generate_reply(self, user_question, context): 根据用户问题生成回复 # 构建对话消息 messages [ SystemMessage(contentLAWYER_ASSISTANT_SYSTEM_PROMPT), HumanMessage(contentf{context}\n\n用户咨询{user_question}) ] try: response self.llm.invoke(messages) return response.content except Exception as e: error_msg fAI处理时发生错误{e}。请稍后重试或直接联系管理员。 return error_msg def is_allowed_sender(self, sender_email): 检查发件人是否在允许列表中 allowed self.config.ALLOWED_SENDERS # 如果未设置白名单列表为空或第一个元素为空则允许所有 if not allowed or (len(allowed) 1 and allowed[0] ): return True return sender_email in allowed4.4 主程序入口创建main.py串联整个工作流。# main.py import time from mail_client import MailClient from ai_agent import AIAgent def main_loop(): 主循环定期检查邮件并处理 mail_client MailClient() ai_agent AIAgent() print(AI邮件法律助手已启动开始监控邮箱...) while True: try: # 1. 获取未读邮件 unread_emails mail_client.fetch_unread_emails() print(f发现 {len(unread_emails)} 封未读邮件) for email in unread_emails: sender email[from] subject email[subject] body email[body] print(f处理来自 {sender} 的邮件主题: {subject}) # 2. 权限校验 if not ai_agent.is_allowed_sender(sender): print(f发件人 {sender} 不在白名单中已忽略。) mail_client.mark_as_read(email[uid]) continue # 3. 内容过滤简单示例检查是否为空 if not body or len(body.strip()) 5: reply 您好您的邮件正文内容过短无法识别有效的法律问题。请详细描述您的情况。 else: # 4. 调用AI生成回复 print(正在调用AI生成回复...) reply ai_agent.generate_reply(user_questionbody, contextf邮件主题{subject}) # 5. 发送回复 print(正在发送回复邮件...) mail_client.send_reply(to_emailsender, subjectsubject, bodyreply) # 6. 将原邮件标记为已读 mail_client.mark_as_read(email[uid]) print(f邮件处理完成: {subject}\n) except Exception as e: print(f主循环发生错误: {e}) # 每60秒检查一次邮箱 print(等待下一次检查...) time.sleep(60) if __name__ __main__: main_loop()4.5 运行与验证确保已正确填写.env文件。在终端中运行程序cd ai_lawyer_mail_assistant python main.py使用你在ALLOWED_SENDER中设置的邮箱向EMAIL_ACCOUNT邮箱发送一封咨询邮件例如主题为“租房合同咨询”正文描述一个简单的法律问题。观察控制台日志你应该能看到程序检测到新邮件、调用AI、发送回复的过程。稍后你的发件邮箱将收到一封来自AI助手的回复邮件。5. 常见问题与排查思路在开发和运行过程中你可能会遇到以下问题问题现象可能原因排查与解决思路程序报错ssl.SSLError或连接超时1. 网络问题。2. 邮箱服务商IMAP/SMTP地址或端口错误。3. 未开启邮箱的IMAP/SMTP服务。1. 检查网络连接。2. 核对config.py中的服务器和端口QQ邮箱、163邮箱等各有不同。3. 登录网页版邮箱在设置中开启“IMAP/SMTP服务”并获取授权码非登录密码。收不到AI回复邮件1. 发件人不在白名单 (ALLOWED_SENDER)。2. AI API 调用失败额度不足、密钥错误。3. 邮件被当作垃圾邮件拦截。1. 检查控制台日志看是否因白名单被忽略。2. 检查OpenAI API密钥是否正确是否有余额。3. 查看发件邮箱的垃圾邮件箱。检查yagmail发送是否报错。AI回复内容质量差或胡言乱语1. 提示词 (SYSTEM_PROMPT) 设计不佳。2. 模型temperature参数过高。3. 邮件正文解析出错输入了乱码。1. 优化prompt_templates.py中的提示词明确约束和格式。2. 将temperature调低如0.1-0.3。3. 在mail_client.py的_extract_plain_text方法中添加日志打印解析前后的正文。程序运行一次就退出main.py中的main_loop函数可能因未捕获的异常而退出。确保main_loop的while True循环内部有try...except包裹捕获所有异常并打印避免程序静默退出。无法解析HTML邮件邮件正文是复杂的HTML简单正则去除标签失败。使用BeautifulSoup库进行更健壮的HTML解析。修改_extract_plain_text方法。6. 进阶优化与工程实践建议上述原型仅实现了最核心的功能。要将其发展为可用的工具需要考虑以下方面6.1 增强邮件处理能力附件处理使用email标准库解析邮件提取附件如合同PDF/Word使用LangChain的文档加载器读取内容并将其作为上下文提供给AI。对话历史通过邮件的Message-ID和In-Reply-To头信息构建对话线程让AI能参考同一话题的历史交流。邮件分类与路由根据主题或内容关键词将邮件分类如“合同咨询”、“劳动纠纷”、“公司注册”并路由到不同的专业提示词模板。6.2 提升AI能力与可靠性检索增强生成RAG这是关键一步。搭建一个本地法律知识库存储《民法典》、《劳动法》等关键法条摘要和解释当用户提问时先从中检索相关条款再将“条款问题”一起交给AI生成答案极大减少幻觉。联网搜索集成使用LangChain的TavilySearch等工具让AI能主动搜索最新的法律新闻或司法解释。输出结构化要求AI以JSON等格式输出便于程序自动提取“风险点列表”、“建议行动步骤”等并填充到更美观的邮件模板中。6.3 系统安全与运维密钥管理生产环境必须使用专业的密钥管理服务如AWS Secrets Manager, HashiCorp Vault而非.env文件。队列与异步使用消息队列如Redis, RabbitMQ将“邮件接收”、“AI处理”、“邮件发送”解耦避免一个环节卡死整个流程。监控与日志集成日志系统如Loguru, structlog记录每一封邮件的处理状态、AI调用耗时和Token使用量。设置异常报警。人工审核介入对于高风险话题或AI置信度低的回复不应自动发送而是转入人工审核队列由管理员在Web界面上确认或修改后再发送。6.4 法律与伦理合规明确免责在用户首次交互前必须通过邮件明确告知AI助手的局限性、隐私政策和使用条款。数据隐私对处理的邮件内容进行加密存储并制定定期清理策略。确保符合《个人信息保护法》等相关法规。内容审核建立更严格的内容过滤机制防止助手被用于生成违法、欺诈或侵权内容。通过以上步骤你可以从一个简单的脚本逐步迭代出一个功能相对完善、安全可控的AI邮件助手原型。这不仅是模仿一个产品更是深入理解AI Agent、自动化流程和实际工程落地的绝佳实践。