ToB企服应用市场:ToB评测及商务社交产业平台

标题: LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践 [打印本页]

作者: 徐锦洪    时间: 7 天前
标题: LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践
引言

在人工智能技能日新月异的今天,怎样将大语言模子(LLM)与多智能体协作框架结合实现自动化流程,已成为开辟者关注的热门。本文将分享一个基于CrewAI多智能体框架与DeepSeek-R1当地化大模子的创新实践——我们成功构建了一个具备完备邮件撰写、优化、发送能力的AI协作系统。该方案通过Writer(撰写)Editor(编辑)Sender(发送) 三个智能体的有机协作,实现了从主题输入到邮件发送的端到端自动化处置惩罚,不仅展现了多智能体系统的使命分解与流程控制能力,更验证了当地化大模子在隐私敏感场景下的实用代价。本文将深入解析该系统的技能架构、实现逻辑,以及这种技能组合带来的开辟效率提升与部署本钱优化。
程序流程图

理解 Flows(工作流)与 Crews(协作组)

CrewAI 提供两种强大互补的方法,可无缝协作构建复杂的 AI 应用:
Crews(协作组)
由具有真正自主决策能力的 AI 智能体组成的团队,通过脚色化协作完成复杂使命。Crews 支持:

Flows(工作流)
面向生产环境的事件驱动型工作流,可精准控制复杂自动化流程。Flows 提供:

协同威力
当 Crews 与 Flows 结合时,CrewAI 展现出真正的强大能力,使您可以:

一、环境准备与工具安装

1.1 Python环境搭建

确保您的系统上安装了 Python >=3.10 < 3.13。CrewAI 使用 UV 进行依赖项管理和包处置惩罚,提供无缝的设置和实行体验。
验证安装
  1. python --version 或者 pip --version  #查看是否输出版本号(Python >=3.10 < 3.13)
复制代码
1.2 创建并激活假造环境

为了保持依赖隔离,建议在电脑上创建假造环境:

  1. cd ~/Projects  # Linux/Mac
  2. cd C:\Projects  # Windows
复制代码
创建假造环境:
  1. python -m venv deepseek_env
复制代码
激活假造环境:
Linux/Mac:
  1. source deepseek_env/bin/activate
复制代码
Windows:
  1. deepseek_env\Scripts\activate
复制代码
激活后,终端提示符前会出现 (deepseek_env)。
升级 pip:
修复pip安装
  1. Python -m ensurepip --upgrade
复制代码
升级pip
  1. Python -m pip install --upgrade pip
复制代码
1.3 安装焦点依赖库(crewai、litellm)

安装须要库: 在假造环境中运行:
  1. pip install crewai litellm
复制代码
检查是否安装成功:
  1. pip show crewai  # 显示 crewai 版本信息
  2. pip show litellm  # 显示 litellm 版本信息
复制代码
二、当地DeepSeek R1大模子部署

2.1 Ollama框架安装

访问Ollama官网 下载适用于您操纵系统的版本。
Linux:
  1. curl -fsSL https://ollama.com/install.sh | sh
复制代码
Mac: 下载 .dmg 文件并安装。
Windows: 下载可实行文件并安装。
本文演示系统为Windows操纵系统
进入官网后点击Download下载

点击Download for Windows进行安装,这里以Windows系统示例

下载完毕是一个.exe文件,然后双击.exe文件进行安装

安装完成后再终端输入ollama --version来检察是否安装成功

2.2 验证Ollama服务状态

  1. # 检查服务是否运行(通用命令)
  2. ollama list  # 若返回空列表则表示服务正常
  3. # 或通过API接口验证
  4. curl http://localhost:11434/api/tags  # 预期返回JSON格式模型列表
复制代码
2.3 运行DeepSeek-R1模子

  1. ollama run deepseek-r1:1.5b
复制代码

  1. # 进阶操纵(可选):ollama ps        # 检察模子运行状态ollama ls        # 列出已下载模子ollama run deepseek-r1:1.5b
  2. "你好"  # 直接交互测试
复制代码
三、代码实现与运行

3.1 项目文件结构说明

  1. mail-agent-project/
  2. ├── main.py         # 主程序 - 定义智能体/任务/工作流
复制代码
3.2 main.py焦点功能


  1. # 代码结构概览
  2. import os
  3. from crewai import Agent, Task, Crew, Process
  4. import smtplib
  5. from email.mime.text import MIMEText
  6. # 配置环境变量/配置LiteLLM的Ollama模型
  7. # 智能体定义(Writer/Editor/Sender)
  8. # 任务链构建(create_writer_task/create_editor_task/create_sender_task)
  9. # 邮件发送函数(send_email)
  10. # 主函数(main)与程序入口
复制代码
Ollama服务初始化: 当地启动模子推理服务,为后续LLM调用提供API端点
模子内容天生: Writer智能体通过DeepSeek-R1模子完成原始邮件创作
内容优化阶段: Editor智能体对文本进行结构化重组与语气调解
SSL加密认证: 采用SMTP_SSL协议保障邮箱账号认证安全性
3.3 运行程序

进入假造环境:
  1. source deepseek_env/bin/activate
  2.   # Linux/Mac# 或deepseek_env\Scripts\activate
  3.   # Windows
复制代码
实行邮件智能体程序
  1. python test.py
复制代码
3.4 输出日志

因为我这里使用的事deepseek-r1:1.5b模子,大模子思考的过程以及撰写的内容可能不如训练参数更多的模子,后续大家可以自行发挥对提示词进行优化以及使用更优质的大模子来完成,我这里只提供一个部署搭建思绪。
  1. 【系统启动】初始化邮件智能体工作流...
  2. ├─ 当前主题:感谢朋友的支持
  3. ├─ 发件账户:xiongjava@163.com
  4. └─ 收件地址:xiongjava@163.com
  5. # Agent: 邮件撰写专家
  6. ## Task: 请以'感谢朋友的支持'为主题撰写正式中文信件,要求:
  7.         1. 采用标准书信格式(称呼、正文、结尾、落款)
  8.         2. 正文至少包含3个逻辑连贯的段落
  9.         3. 总字数控制在300-500字
  10. # Agent: 邮件撰写专家
  11. ## Final Answer:
  12. 尊敬的[朋友名称]先生、女士:
  13. 您好!
  14. 首先,请允许我向您表示最诚挚的感谢。在过去的[时间段内],您的支持与我息息相关,您的耐心和智慧让我感受到最大的幸福与满足。感谢您一直以来对我的关注和支持,是您付出的时间与精力换来的我如今如此的成长与进步。
  15. 如果您有机会,请与我共同参与一些活动或分享自己的经历,这样不仅能够增进我们之间的友谊,还能让我继续与您合作一段时间。希望未来能有更多机会重逢,再次见证彼此的支持与关怀。
  16. 最后,请允许我向您表示最热烈的欢迎和期待!
  17. 此致
  18. 敬礼
  19. [您的姓名]
  20. [日期]
  21. # Agent: 邮件优化专家
  22. ## Task: 对信件进行专业润色,确保:
  23.         1. 对信件进行专业润色,一定要对邮件撰写专家杜撰的邮件内容进行更新优化,不能完全返回和邮件撰写专家一样的邮件。
  24. # Agent: 邮件优化专家
  25. ## Final Answer:
  26. 尊敬的[朋友名称]先生、女士:
  27. 您好!
  28. 首先,请允许我向您表示最诚挚的感谢。在过去的[时间段内],您的支持与我息息相关,您的耐心和智慧让我感受到最大的幸福与满足。感谢您一直以来对我的关注和支持,是您付出的时间与精力换来的我如今如此的成长与进步。
  29. 如果您有机会,请与我共同参与一些活动或分享自己的经历,这样不仅能够增进我们之间的友谊,还能让我继续与您合作一段时间。希望未来能有更多机会重逢,再次见证彼此的支持与关怀。
  30. 最后,请允许我向您表示最热烈的欢迎和期待!
  31. 此致
  32. 敬礼
  33. [您的姓名]
  34. [日期]
  35. # Agent: 邮件发送专员
  36. ## Task: 直接使用邮件优化专家返回的内容,不能由你自己(邮件发送专员)杜撰,不要进行擅自优化和篡改信件。
  37. 收件地址:xiongjava@163.com
  38. 发件账户:xiongjava@163.com
  39. # Agent: 邮件发送专员
  40. ## Final Answer:
  41. 尊敬的[朋友名称]先生、女士:
  42. 您好!
  43. 首先,请允许我向您表示最诚挚的感谢。在过去的[时间段内],您的支持与我息息相关,您的耐心和智慧让我感受到最大的幸福与满足。感谢您一直以来对我的关注和支持,是您付出的时间与精力换来的我如今如此的成长与进步。
  44. 如果您有机会,请与我共同参与一些活动或分享自己的经历,这样不仅能够增进我们之间的友谊,还能让我继续与您合作一段时间。希望未来能有更多机会重逢,再次见证彼此的支持与关怀。
  45. 最后,请允许我向您表示最热烈的欢迎和期待!
  46. 此致
  47. 敬礼
  48. [您的姓名]
  49. [日期]
复制代码

四、项目源码

  1. import os
  2. from crewai import Agent, Task, Crew, Process
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. # 配置环境变量
  6. os.environ["OPENAI_API_KEY"] = "NA"
  7. os.environ["OLLAMA_API_BASE"] = "http://localhost:11434"
  8. # 配置 LiteLLM 的 Ollama 模型
  9. model_name = "ollama/deepseek-r1:1.5b"
  10. # 定义代理
  11. writer = Agent(
  12.     role="邮件撰写专家",
  13.     goal="根据用户提供的主题生成结构清晰、情感真挚的中文信件初稿",
  14.     backstory="""您是一位拥有十年写作经验的职业撰稿人,擅长捕捉情感细节并使用符合中文表达习惯的修辞手法。
  15.     熟悉正式/非正式场景的文体转换,能快速构建包含开头、主体、结尾的标准信件结构。""",
  16.     llm=model_name,
  17.     verbose=True,
  18.     allow_delegation=False
  19. )
  20. editor = Agent(
  21.     role="邮件优化专家",
  22.     goal="对初稿进行中文语境下的专业润色",
  23.     backstory="""您是从业八年的专业编辑,持有汉语水平考试(HSK)高级认证。
  24.     擅长:1. 调整语气适合性 2. 优化段落衔接 3. 修正语法错误 4. 提升表达精准度
  25.     熟悉商务信函、私人信件等不同场景的文体要求。""",
  26.     llm=model_name,
  27.     verbose=True,
  28.     allow_delegation=False
  29. )
  30. sender = Agent(
  31.     role="邮件发送专员",
  32.     goal="严格遵守安全协议完成邮件投递",
  33.     backstory="""只负责传递信息,不做其他动作""",
  34.     llm=model_name,
  35.     verbose=True,
  36.     allow_delegation=False
  37. )
  38. # 定义任务
  39. def create_writer_task(topic):
  40.     return Task(
  41.         description=f"""请以'{topic}'为主题撰写正式中文信件,要求:
  42.         1. 采用标准书信格式(称呼、正文、结尾、落款)
  43.         2. 正文至少包含3个逻辑连贯的段落
  44.         3. 总字数控制在300-500字""",
  45.         agent=writer,
  46.         expected_output="符合GB/T 15834-2011中文排版规范的信件文本(含标点符号正确使用)"
  47.     )
  48. def create_editor_task():
  49.     return Task(
  50.         description="""对信件进行专业润色,确保:
  51.         1. 对信件进行专业润色,一定要对邮件撰写专家杜撰的邮件内容进行更新优化,不能完全返回和邮件撰写专家一样的邮件。
  52.         """,
  53.         agent=editor,
  54.         expected_output="优化后的标准中文信件文本(保留原始格式标记)"
  55.     )
  56. # 修改后的发送任务定义(添加editor_output参数)
  57. def create_sender_task(email_to, email_from, email_password, editor_output):
  58.     return Task(
  59.         description=f"""直接使用邮件优化专家返回的内容,不能由你自己(邮件发送专员)杜撰,不要进行擅自优化和篡改信件。
  60. 收件地址:{email_to}
  61. 发件账户:{email_from}""",
  62.         agent=sender,
  63.         expected_output="只负责传递信息,不对文章进行篡改,保证对邮件优化专家撰写的内容原样发送",
  64.         context=[editor_output],  # 显式绑定编辑任务
  65.         callback=lambda _: send_email(
  66.             email_to,
  67.             email_from,
  68.             email_password,
  69.             editor_output.output.raw  # 直接使用编辑任务的原始输出
  70.         )
  71.     )
  72. # 邮件发送功能
  73. def send_email(to_address, from_address, password, letter_content):
  74.     subject = "感谢信"
  75.     print(f"发送邮件 - 主题: {subject}, 收件人: {to_address}, 发件人: {from_address}")
  76.     print(f"邮件内容: {letter_content}")
  77.     msg = MIMEText(letter_content)
  78.     msg["Subject"] = subject
  79.     msg["From"] = from_address
  80.     msg["To"] = to_address
  81.     try:
  82.         # 使用 SMTP_SSL 连接 465 端口,无需 starttls()
  83.         with smtplib.SMTP_SSL("smtp.163.com", 465, timeout=30) as server:
  84.             server.set_debuglevel(1)  # 启用调试输出
  85.             server.login(from_address, password)
  86.             server.sendmail(from_address, to_address, msg.as_string())
  87.             print("邮件发送请求已提交至服务器")
  88.         return "邮件发送成功!"
  89.     except smtplib.SMTPAuthenticationError as auth_error:
  90.         print(f"认证失败: {auth_error}")
  91.         raise Exception(f"SMTP 认证失败: {auth_error}")
  92.     except smtplib.SMTPException as smtp_error:
  93.         print(f"SMTP 错误: {smtp_error}")
  94.         raise Exception(f"SMTP 错误: {smtp_error}")
  95.     except Exception as e:
  96.         print(f"其他错误: {e}")
  97.         raise Exception(f"邮件发送失败: {e}")
  98. # 主流程
  99. def main():
  100.     topic = "感谢朋友的支持"
  101.     email_to = "xiongjava@163.com"
  102.     email_from = "xiongjava@163.com"
  103.     email_password = "KL28MAziXpQ8p7My"
  104.     writer_task = create_writer_task(topic)
  105.     editor_task = create_editor_task()
  106.     # 传递editor_task作为第四个参数
  107.     sender_task = create_sender_task(
  108.         email_to,
  109.         email_from,
  110.         email_password,
  111.         editor_task  # 新增参数
  112.     )
  113.     crew = Crew(
  114.         agents=[writer, editor, sender],
  115.         tasks=[writer_task, editor_task, sender_task],
  116.         process=Process.sequential,
  117.         verbose=True
  118.     )
  119.     print("\n【系统启动】初始化邮件智能体工作流...")
  120.     print(f"├─ 当前主题:{topic}")
  121.     print(f"├─ 发件账户:{email_from}")
  122.     print(f"└─ 收件地址:{email_to}\n")
  123.     result = crew.kickoff()
  124.     print("\n######################")
  125.     print("【执行结果】")
  126.     print(f"详情:{result}")
  127.     print("######################")
  128. if __name__ == "__main__":
  129.     main()
复制代码
五、源码解释(Agent、Tasks、工作流)

5.1 Agent(智能体)系统计划

Agent代表具有特定专业能力的假造脚色,每个Agent都承担明确的工作职责:
  1. writer = Agent(
  2.     role="邮件撰写专家",
  3.     goal="根据用户提供的主题生成结构清晰、情感真挚的中文信件初稿",
  4.     backstory="""(包含专业背景和能力描述)""",
  5.     llm=model_name,
  6.     verbose=True,
  7.     allow_delegation=False
  8. )
复制代码


  1. editor = Agent(
  2.     role="邮件优化专家",
  3.     goal="对初稿进行中文语境下的专业润色",
  4.     backstory="""(包含认证资质和专业技能)""",
  5.     ...
  6. )
复制代码


  1. sender = Agent(
  2.     role="邮件发送专员",
  3.     goal="严格遵守安全协议完成邮件投递",
  4.     ...
  5. )
复制代码


5.2 Task(使命)系统计划

每个Task界说具体的工作单位,包含完备的实行规范:
  1. def create_writer_task(topic):
  2.     return Task(
  3.         description=f"请以'{topic}'为主题撰写正式中文信件...",
  4.         agent=writer,
  5.         expected_output="符合GB/T 15834-2011中文排版规范的信件文本"
  6.     )
复制代码


  1. def create_editor_task():
  2.     return Task(
  3.         description="对信件进行专业润色...",
  4.         agent=editor,
  5.         expected_output="优化后的标准中文信件文本"
  6.     )
复制代码


  1. def create_sender_task(..., editor_output):
  2.     return Task(
  3.         description="直接使用优化后的内容...",
  4.         agent=sender,
  5.         context=[editor_output],
  6.         callback=lambda _: send_email(...)
  7.     )
复制代码


5.3 工作流计划原理

  1. crew = Crew(
  2.     agents=[writer, editor, sender],
  3.     tasks=[writer_task, editor_task, sender_task],
  4.     process=Process.sequential,
  5.     verbose=True
  6. )
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4