引言
在人工智能技能日新月异的今天,怎样将大语言模子(LLM)与多智能体协作框架结合实现自动化流程,已成为开辟者关注的热门。本文将分享一个基于CrewAI多智能体框架与DeepSeek-R1当地化大模子的创新实践——我们成功构建了一个具备完备邮件撰写、优化、发送能力的AI协作系统。该方案通过Writer(撰写)、Editor(编辑)、Sender(发送) 三个智能体的有机协作,实现了从主题输入到邮件发送的端到端自动化处置惩罚,不仅展现了多智能体系统的使命分解与流程控制能力,更验证了当地化大模子在隐私敏感场景下的实用代价。本文将深入解析该系统的技能架构、实现逻辑,以及这种技能组合带来的开辟效率提升与部署本钱优化。
程序流程图
理解 Flows(工作流)与 Crews(协作组)
CrewAI 提供两种强大互补的方法,可无缝协作构建复杂的 AI 应用:
Crews(协作组)
由具有真正自主决策能力的 AI 智能体组成的团队,通过脚色化协作完成复杂使命。Crews 支持:
- 智能体间的天然自主决策
- 动态使命委派与协作
- 界说明确目的和专业能力的专属脚色
- 灵活的题目办理方式
Flows(工作流)
面向生产环境的事件驱动型工作流,可精准控制复杂自动化流程。Flows 提供:
- 对现实场景实行路径的细粒度控制
- 使命间安全同等的状态管理
- AI 智能体与生产级 Python 代码的洁净集成
- 复杂业务逻辑的条件分支处置惩罚
协同威力
当 Crews 与 Flows 结合时,CrewAI 展现出真正的强大能力,使您可以:
- 构建复杂的生产级应用程序
- 在自主性与精准控制间取得平衡
- 处置惩罚复杂的现实场景
- 保持清晰可维护的代码结构
一、环境准备与工具安装
1.1 Python环境搭建
确保您的系统上安装了 Python >=3.10 < 3.13。CrewAI 使用 UV 进行依赖项管理和包处置惩罚,提供无缝的设置和实行体验。
验证安装
- python --version 或者 pip --version #查看是否输出版本号(Python >=3.10 < 3.13)
复制代码 1.2 创建并激活假造环境
为了保持依赖隔离,建议在电脑上创建假造环境:
- 打开终端(Windows 用 CMD/PowerShell,Linux/Mac 用终端)。
- 导航到你的工作目录(例如 ~/Projects 或 C:\Projects)
- cd ~/Projects # Linux/Mac
- cd C:\Projects # Windows
复制代码 创建假造环境:
- python -m venv deepseek_env
复制代码 激活假造环境:
Linux/Mac:
- source deepseek_env/bin/activate
复制代码 Windows:
- deepseek_env\Scripts\activate
复制代码 激活后,终端提示符前会出现 (deepseek_env)。
升级 pip:
修复pip安装
- Python -m ensurepip --upgrade
复制代码 升级pip
- Python -m pip install --upgrade pip
复制代码 1.3 安装焦点依赖库(crewai、litellm)
安装须要库: 在假造环境中运行:
- pip install crewai litellm
复制代码 检查是否安装成功:
- pip show crewai # 显示 crewai 版本信息
- pip show litellm # 显示 litellm 版本信息
复制代码 二、当地DeepSeek R1大模子部署
2.1 Ollama框架安装
访问Ollama官网 下载适用于您操纵系统的版本。
Linux:
- curl -fsSL https://ollama.com/install.sh | sh
复制代码 Mac: 下载 .dmg 文件并安装。
Windows: 下载可实行文件并安装。
本文演示系统为Windows操纵系统
进入官网后点击Download下载
点击Download for Windows进行安装,这里以Windows系统示例
下载完毕是一个.exe文件,然后双击.exe文件进行安装
安装完成后再终端输入ollama --version来检察是否安装成功
2.2 验证Ollama服务状态
- # 检查服务是否运行(通用命令)
- ollama list # 若返回空列表则表示服务正常
- # 或通过API接口验证
- curl http://localhost:11434/api/tags # 预期返回JSON格式模型列表
复制代码 2.3 运行DeepSeek-R1模子
- ollama run deepseek-r1:1.5b
复制代码
- # 进阶操纵(可选):ollama ps # 检察模子运行状态ollama ls # 列出已下载模子ollama run deepseek-r1:1.5b
- "你好" # 直接交互测试
复制代码 三、代码实现与运行
3.1 项目文件结构说明
- mail-agent-project/
- ├── main.py # 主程序 - 定义智能体/任务/工作流
复制代码 3.2 main.py焦点功能
- 界说Writer邮件撰写专家/Editor邮件优化专家/Sender邮件发送专员三个智能体
- 构建使命链(撰写→润色→发送)
- 实现SMTP邮件发送回调
- 主流程控制(CrewAI顺序实行)
- # 代码结构概览
- import os
- from crewai import Agent, Task, Crew, Process
- import smtplib
- from email.mime.text import MIMEText
- # 配置环境变量/配置LiteLLM的Ollama模型
- # 智能体定义(Writer/Editor/Sender)
- # 任务链构建(create_writer_task/create_editor_task/create_sender_task)
- # 邮件发送函数(send_email)
- # 主函数(main)与程序入口
复制代码 Ollama服务初始化: 当地启动模子推理服务,为后续LLM调用提供API端点
模子内容天生: Writer智能体通过DeepSeek-R1模子完成原始邮件创作
内容优化阶段: Editor智能体对文本进行结构化重组与语气调解
SSL加密认证: 采用SMTP_SSL协议保障邮箱账号认证安全性
3.3 运行程序
进入假造环境:
- source deepseek_env/bin/activate
- # Linux/Mac# 或deepseek_env\Scripts\activate
- # Windows
复制代码 实行邮件智能体程序
3.4 输出日志
因为我这里使用的事deepseek-r1:1.5b模子,大模子思考的过程以及撰写的内容可能不如训练参数更多的模子,后续大家可以自行发挥对提示词进行优化以及使用更优质的大模子来完成,我这里只提供一个部署搭建思绪。
- 【系统启动】初始化邮件智能体工作流...
- ├─ 当前主题:感谢朋友的支持
- ├─ 发件账户:xiongjava@163.com
- └─ 收件地址:xiongjava@163.com
- # Agent: 邮件撰写专家
- ## Task: 请以'感谢朋友的支持'为主题撰写正式中文信件,要求:
- 1. 采用标准书信格式(称呼、正文、结尾、落款)
- 2. 正文至少包含3个逻辑连贯的段落
- 3. 总字数控制在300-500字
- # Agent: 邮件撰写专家
- ## Final Answer:
- 尊敬的[朋友名称]先生、女士:
- 您好!
- 首先,请允许我向您表示最诚挚的感谢。在过去的[时间段内],您的支持与我息息相关,您的耐心和智慧让我感受到最大的幸福与满足。感谢您一直以来对我的关注和支持,是您付出的时间与精力换来的我如今如此的成长与进步。
- 如果您有机会,请与我共同参与一些活动或分享自己的经历,这样不仅能够增进我们之间的友谊,还能让我继续与您合作一段时间。希望未来能有更多机会重逢,再次见证彼此的支持与关怀。
- 最后,请允许我向您表示最热烈的欢迎和期待!
- 此致
- 敬礼
- [您的姓名]
- [日期]
- # Agent: 邮件优化专家
- ## Task: 对信件进行专业润色,确保:
- 1. 对信件进行专业润色,一定要对邮件撰写专家杜撰的邮件内容进行更新优化,不能完全返回和邮件撰写专家一样的邮件。
- # Agent: 邮件优化专家
- ## Final Answer:
- 尊敬的[朋友名称]先生、女士:
- 您好!
- 首先,请允许我向您表示最诚挚的感谢。在过去的[时间段内],您的支持与我息息相关,您的耐心和智慧让我感受到最大的幸福与满足。感谢您一直以来对我的关注和支持,是您付出的时间与精力换来的我如今如此的成长与进步。
- 如果您有机会,请与我共同参与一些活动或分享自己的经历,这样不仅能够增进我们之间的友谊,还能让我继续与您合作一段时间。希望未来能有更多机会重逢,再次见证彼此的支持与关怀。
- 最后,请允许我向您表示最热烈的欢迎和期待!
- 此致
- 敬礼
- [您的姓名]
- [日期]
- # Agent: 邮件发送专员
- ## Task: 直接使用邮件优化专家返回的内容,不能由你自己(邮件发送专员)杜撰,不要进行擅自优化和篡改信件。
- 收件地址:xiongjava@163.com
- 发件账户:xiongjava@163.com
- # Agent: 邮件发送专员
- ## Final Answer:
- 尊敬的[朋友名称]先生、女士:
- 您好!
- 首先,请允许我向您表示最诚挚的感谢。在过去的[时间段内],您的支持与我息息相关,您的耐心和智慧让我感受到最大的幸福与满足。感谢您一直以来对我的关注和支持,是您付出的时间与精力换来的我如今如此的成长与进步。
- 如果您有机会,请与我共同参与一些活动或分享自己的经历,这样不仅能够增进我们之间的友谊,还能让我继续与您合作一段时间。希望未来能有更多机会重逢,再次见证彼此的支持与关怀。
- 最后,请允许我向您表示最热烈的欢迎和期待!
- 此致
- 敬礼
- [您的姓名]
- [日期]
复制代码
四、项目源码
- import os
- from crewai import Agent, Task, Crew, Process
- import smtplib
- from email.mime.text import MIMEText
- # 配置环境变量
- os.environ["OPENAI_API_KEY"] = "NA"
- os.environ["OLLAMA_API_BASE"] = "http://localhost:11434"
- # 配置 LiteLLM 的 Ollama 模型
- model_name = "ollama/deepseek-r1:1.5b"
- # 定义代理
- writer = Agent(
- role="邮件撰写专家",
- goal="根据用户提供的主题生成结构清晰、情感真挚的中文信件初稿",
- backstory="""您是一位拥有十年写作经验的职业撰稿人,擅长捕捉情感细节并使用符合中文表达习惯的修辞手法。
- 熟悉正式/非正式场景的文体转换,能快速构建包含开头、主体、结尾的标准信件结构。""",
- llm=model_name,
- verbose=True,
- allow_delegation=False
- )
- editor = Agent(
- role="邮件优化专家",
- goal="对初稿进行中文语境下的专业润色",
- backstory="""您是从业八年的专业编辑,持有汉语水平考试(HSK)高级认证。
- 擅长:1. 调整语气适合性 2. 优化段落衔接 3. 修正语法错误 4. 提升表达精准度
- 熟悉商务信函、私人信件等不同场景的文体要求。""",
- llm=model_name,
- verbose=True,
- allow_delegation=False
- )
- sender = Agent(
- role="邮件发送专员",
- goal="严格遵守安全协议完成邮件投递",
- backstory="""只负责传递信息,不做其他动作""",
- llm=model_name,
- verbose=True,
- allow_delegation=False
- )
- # 定义任务
- def create_writer_task(topic):
- return Task(
- description=f"""请以'{topic}'为主题撰写正式中文信件,要求:
- 1. 采用标准书信格式(称呼、正文、结尾、落款)
- 2. 正文至少包含3个逻辑连贯的段落
- 3. 总字数控制在300-500字""",
- agent=writer,
- expected_output="符合GB/T 15834-2011中文排版规范的信件文本(含标点符号正确使用)"
- )
- def create_editor_task():
- return Task(
- description="""对信件进行专业润色,确保:
- 1. 对信件进行专业润色,一定要对邮件撰写专家杜撰的邮件内容进行更新优化,不能完全返回和邮件撰写专家一样的邮件。
- """,
- agent=editor,
- expected_output="优化后的标准中文信件文本(保留原始格式标记)"
- )
- # 修改后的发送任务定义(添加editor_output参数)
- def create_sender_task(email_to, email_from, email_password, editor_output):
- return Task(
- description=f"""直接使用邮件优化专家返回的内容,不能由你自己(邮件发送专员)杜撰,不要进行擅自优化和篡改信件。
- 收件地址:{email_to}
- 发件账户:{email_from}""",
- agent=sender,
- expected_output="只负责传递信息,不对文章进行篡改,保证对邮件优化专家撰写的内容原样发送",
- context=[editor_output], # 显式绑定编辑任务
- callback=lambda _: send_email(
- email_to,
- email_from,
- email_password,
- editor_output.output.raw # 直接使用编辑任务的原始输出
- )
- )
- # 邮件发送功能
- def send_email(to_address, from_address, password, letter_content):
- subject = "感谢信"
- print(f"发送邮件 - 主题: {subject}, 收件人: {to_address}, 发件人: {from_address}")
- print(f"邮件内容: {letter_content}")
- msg = MIMEText(letter_content)
- msg["Subject"] = subject
- msg["From"] = from_address
- msg["To"] = to_address
- try:
- # 使用 SMTP_SSL 连接 465 端口,无需 starttls()
- with smtplib.SMTP_SSL("smtp.163.com", 465, timeout=30) as server:
- server.set_debuglevel(1) # 启用调试输出
- server.login(from_address, password)
- server.sendmail(from_address, to_address, msg.as_string())
- print("邮件发送请求已提交至服务器")
- return "邮件发送成功!"
- except smtplib.SMTPAuthenticationError as auth_error:
- print(f"认证失败: {auth_error}")
- raise Exception(f"SMTP 认证失败: {auth_error}")
- except smtplib.SMTPException as smtp_error:
- print(f"SMTP 错误: {smtp_error}")
- raise Exception(f"SMTP 错误: {smtp_error}")
- except Exception as e:
- print(f"其他错误: {e}")
- raise Exception(f"邮件发送失败: {e}")
- # 主流程
- def main():
- topic = "感谢朋友的支持"
- email_to = "xiongjava@163.com"
- email_from = "xiongjava@163.com"
- email_password = "KL28MAziXpQ8p7My"
- writer_task = create_writer_task(topic)
- editor_task = create_editor_task()
- # 传递editor_task作为第四个参数
- sender_task = create_sender_task(
- email_to,
- email_from,
- email_password,
- editor_task # 新增参数
- )
- crew = Crew(
- agents=[writer, editor, sender],
- tasks=[writer_task, editor_task, sender_task],
- process=Process.sequential,
- verbose=True
- )
- print("\n【系统启动】初始化邮件智能体工作流...")
- print(f"├─ 当前主题:{topic}")
- print(f"├─ 发件账户:{email_from}")
- print(f"└─ 收件地址:{email_to}\n")
- result = crew.kickoff()
- print("\n######################")
- print("【执行结果】")
- print(f"详情:{result}")
- print("######################")
- if __name__ == "__main__":
- main()
复制代码 五、源码解释(Agent、Tasks、工作流)
5.1 Agent(智能体)系统计划
Agent代表具有特定专业能力的假造脚色,每个Agent都承担明确的工作职责:
- writer = Agent(
- role="邮件撰写专家",
- goal="根据用户提供的主题生成结构清晰、情感真挚的中文信件初稿",
- backstory="""(包含专业背景和能力描述)""",
- llm=model_name,
- verbose=True,
- allow_delegation=False
- )
复制代码
- role:界说脚色名称,明确职责范围
- goal:设定焦点工作目的,指导AI行为方向
- backstory:详细背景故事,包含:
- 专业经验年限(10年写作经验)
- 焦点能力(情感捕捉、中文修辞)
- 专业领域(文体转换、信件结构)
- llm:指定使用的语言模子
- verbose:开启详细日志输出
- allow_delegation:禁止使命委派,保持专业专注
- editor = Agent(
- role="邮件优化专家",
- goal="对初稿进行中文语境下的专业润色",
- backstory="""(包含认证资质和专业技能)""",
- ...
- )
复制代码
- 特殊强调中文专业认证(HSK高级)
- 明确四项焦点优化能力:
- sender = Agent(
- role="邮件发送专员",
- goal="严格遵守安全协议完成邮件投递",
- ...
- )
复制代码
- 职责高度聚焦:仅负责信息通报
- 禁止内容修改:保持内容完备性
- 强调安全规范:确保投递过程合规
5.2 Task(使命)系统计划
每个Task界说具体的工作单位,包含完备的实行规范:
- def create_writer_task(topic):
- return Task(
- description=f"请以'{topic}'为主题撰写正式中文信件...",
- agent=writer,
- expected_output="符合GB/T 15834-2011中文排版规范的信件文本"
- )
复制代码
- 动态参数:通过topic参数实现内容定制化
- 三层式要求规范:
- 格式要求(标准书信格式)
- 结构要求(3个逻辑段落)
- 量化指标(300-500字)
- 国家标准引用:GB/T 15834-2011确保专业合规性
- def create_editor_task():
- return Task(
- description="对信件进行专业润色...",
- agent=editor,
- expected_output="优化后的标准中文信件文本"
- )
复制代码
- 质量管控机制:
- 明确禁止简单复制(“不能完全返回雷同内容”)
- 要求保留原始格式标记
- 迭代优化重点:
- def create_sender_task(..., editor_output):
- return Task(
- description="直接使用优化后的内容...",
- agent=sender,
- context=[editor_output],
- callback=lambda _: send_email(...)
- )
复制代码
- 输入约束:
- 强制使用编辑后内容(editor_output)
- 禁止内容窜改(“原样发送”)
- 系统集成:
- 通过context绑定使命依赖
- 使用callback触发邮件发送函数
- 安全机制:
5.3 工作流计划原理
- crew = Crew(
- agents=[writer, editor, sender],
- tasks=[writer_task, editor_task, sender_task],
- process=Process.sequential,
- verbose=True
- )
复制代码
- 顺序流程控制:
- 撰写 → 优化 → 发送 严格串行实行
- 前序使命输出自动成为后续使命输入
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |