当前位置: 首页 > news >正文

LLM大模型 - 实战篇 - AI Agents的开发应用

使用 CrewAI 构建自动写情书并发送邮件的 AI Agent 系统

本文将介绍如何使用 CrewAI 框架构建一个多 Agent 系统,该系统能够自动生成情书并发送邮件。这是一个非常适合初学者学习的 AI Agent 实践项目。

项目概述

这个项目使用 CrewAI 框架创建了三个不同的 AI Agent:

  1. 作家 Agent - 负责根据用户需求创作情感丰富的文章

  2. 内容编辑 Agent - 负责校对和格式化文章,并保存到本地

  3. 寄信人 Agent - 负责读取本地文件并通过邮件发送内容

环境配置

首先需要安装必要的 Python 包:

bash

pip install crewai
pip install langchain
pip install openai
pip install python-dotenv

代码解析

主程序 (main.py)

python

import os
os.environ["http_proxy"] = "http://localhost:7890"
os.environ["https_proxy"] = "http://localhost:7890"
from crewai import Agent, Task, Crew, Process
from tools.custom_tools import CustomTools
from dotenv import load_dotenv, find_dotenv
from langchain_community.chat_models import ChatOpenAI,ChatZhipuAI# 加载环境变量
_ = load_dotenv(find_dotenv())# 配置 OpenAI 模型
client = ChatOpenAI(model_name="gpt-3.5-turbo",api_key=os.environ["OPENAI_API_KEY"],base_url=os.environ['OPENAI_BASE_URL'])# 定义作家 Agent
poet = Agent(role='作家',goal='根据用户需求,创作出情感丰富的文章(最长字数不超过300个词)。',backstory="""你作为一名著名的作家,拥有千万级别的粉丝,最擅长写情感类型的文章。""",verbose=True,allow_delegation=False,llm=client
)# 定义内容编辑 Agent
letter_writer = Agent(role='内容编辑',goal='对作家撰写的文章内容进行精心编辑。',backstory="""作为一名经验丰富的编辑,你在编辑书信方面有多年的专业经验,你需要将作家写的文章内容整理编排成书信的样式,并将书信内容存储在本地磁盘上。你必须使用提供的工具将存储到指定文件中,并确保文件已保存到磁盘上。当文件成功保存时返回 "书信已保存.".""",verbose=True,allow_delegation=False,tools=[CustomTools.store_poesy_to_txt],llm=client
)# 定义寄信人 Agent
sender = Agent(role='寄信人',goal='将编辑好的书信以邮件的形式发送给心仪的人',backstory="""你是一名勤恳的信使,专注于将书信传递给每个人,你必须使用提供的工具将指定文件的书信内容中传送到其他人的邮箱里,如果成功传送,记得返回"信件已发送"""",verbose=True,allow_delegation=True,tools=[CustomTools.send_message],llm=client
)# 获取用户输入
content = input("请输入你的需求:\n")
print(content)# 为作家 Agent 创建任务
task1 = Task(description=f"""用户需求:{content}。你最后给出的答案必须是一份富含爱情表示的情书.""",agent=poet,output_file=f"out.txt",expected_output="""在这宇宙的浩瀚乐章中,你是我心弦上最动听的旋律。随着日夜更迭,我对你的情感如同不息的海浪,温柔而坚定地拍打着爱的海岸。我愿以星辰为笔,月光为墨,在天空中写下你的名字,让世界见证你为我的生活带来的光芒。我的每一个字,都承载着我对你深深的眷恋和无尽的热爱"""
)# 为编辑者 Agent 创建任务
task2 = Task(description="""查找任何语法错误,进行编辑和格式化(如果需要)。并要求将内容保存在本地磁盘中。将内容保存到本地非常重要,你最后的答案必须是信息是否已被存储在本地磁盘中.""",agent=letter_writer,output_file=f"poie.txt",expected_output="""在这宇宙的浩瀚乐章中,你是我心弦上最动听的旋律。随着日夜更迭,我对你的情感如同不息的海浪,温柔而坚定地拍打着爱的海岸。我愿以星辰为笔,月光为墨,在天空中写下你的名字,让世界见证你为我的生活带来的光芒。我的每一个字,都承载着我对你深深的眷恋和无尽的热爱"""
)# 为寄信人 Agent 创建任务
task3 = Task(description="""根据本次磁盘保存的书信内容,你将整理并发送邮件给心仪的人,这个很重要.
你最后的答一定要成功发送该邮件.""",agent=sender,expected_output="""邮件发送成功."""
)# 创建 Crew 并启动任务
crew = Crew(agents=[poet, letter_writer, sender],tasks=[task1, task2, task3],verbose=2,process=Process.sequential # 使用按顺序执行任务的流程
)# 启动任务执行
result = crew.kickoff()print("######################")
print(result)

测试脚本 (test.py)

python

from tools.custom_tools import CustomToolstool = CustomTools.store_poesy_to_txttool.run(tool_input="Hello, **world**!")

自定义工具 (custom_tools.py)

以下是完整的 custom_tools.py 代码实现,包含了将文本保存到本地文件和发送邮件的功能:

python

# 导入必备的工具包
from langchain.tools import tool
import datetime
import os
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddrclass CustomTools():@tool("将文本写入文档中")def store_poesy_to_txt(content: str) -> str:"""将编辑后的书信文本内容自动保存到txt文档中"""try:# 确保目录存在os.makedirs("./LLM/Agents/Email_Generate", exist_ok=True)filename = f"./LLM/Agents/Email_Generate/poie.txt"# 将文本写入txt文档中with open(filename, 'w', encoding='utf-8') as file:file.write(content)return f"文件已成功写入 {filename}"except Exception as e:return f"工具输入错误: {str(e)}"@tool("发送文本到邮件")def send_message() -> str:"""读取生成的本地书信文件txt文本,并以邮件的形式发送到某个人的邮箱中"""try:# 邮件配置 - 这些应该从环境变量或配置文件中获取from_name = "发件人名称"  # 替换为实际发件人名称from_addr = "your_email@example.com"  # 替换为实际发件邮箱from_pwd = "your_password"  # 替换为实际邮箱密码或授权码to_addr = "recipient@example.com"  # 替换为实际收件邮箱my_title = "AI生成的情书"# 读取本地文件filename = f"./LLM/Agents/Email_Generate/poie.txt"with open(filename, 'r', encoding='utf-8') as f:my_msg = f.read()# 创建邮件内容msg = MIMEText(my_msg, 'plain', 'utf-8')msg['From'] = formataddr([from_name, from_addr])msg['To'] = to_addrmsg['Subject'] = my_title# SMTP服务器配置 (这里以QQ邮箱为例)smtp_srv = "smtp.qq.com"smtp_port = 465# 发送邮件srv = smtplib.SMTP_SSL(smtp_srv.encode(), smtp_port)srv.login(from_addr, from_pwd)srv.sendmail(from_addr, [to_addr], msg.as_string())srv.quit()return "邮件发送成功"except Exception as e:return f"邮件发送失败: {str(e)}"# 测试代码
if __name__ == "__main__":# 测试保存文本功能result = CustomTools.store_poesy_to_txt("这是一段测试文本")print(result)# 测试发送邮件功能 (需要先配置正确的邮箱信息)# result = CustomTools.send_message()# print(result)

自定义工具说明

1. 导入必要的库
  • langchain.tools:用于定义和处理工具

  • datetime:处理日期和时间

  • os:处理文件和目录操作

  • smtplib:连接到邮件服务器并发送电子邮件

  • email.mime.text:构建包含纯文本或HTML内容的邮件消息

  • email.utils:格式化电子邮件地址

2. CustomTools 类

包含两个主要方法:

store_poesy_to_txt 方法
  • 功能:将文本内容保存到本地文件

  • 参数:content - 要保存的文本内容

  • 返回值:成功或错误信息

  • 特点:

    • 使用 os.makedirs 确保目录存在

    • 使用 UTF-8 编码确保中文字符正确保存

    • 包含异常处理,提供有用的错误信息

send_message 方法
  • 功能:读取本地文件并通过邮件发送内容

  • 参数:无(从固定路径读取文件)

  • 返回值:发送成功或失败信息

  • 特点:

    • 使用 SMTP_SSL 进行安全连接

    • 支持中文字符编码

    • 包含完整的异常处理

3. 使用说明
  1. 配置邮箱信息

    • 修改 from_addrfrom_pwd 和 to_addr 变量为实际的邮箱地址和密码

    • 对于QQ邮箱,需要使用授权码而不是登录密码

  2. SMTP服务器配置

    • 代码中使用的是QQ邮箱的SMTP服务器

    • 如果使用其他邮箱服务,需要修改 smtp_srv 和 smtp_port

  3. 文件路径

    • 代码中固定使用 ./LLM/Agents/Email_Generate/poie.txt 作为文件路径

    • 可以根据需要修改此路径

4. 安全建议
  1. 不要将邮箱密码硬编码在代码中

    • 建议使用环境变量或配置文件存储敏感信息

    • 示例:

      python

      import os
      from_addr = os.getenv("EMAIL_ADDRESS")
      from_pwd = os.getenv("EMAIL_PASSWORD")
  2. 使用邮箱授权码

    • 对于大多数邮箱服务,建议使用授权码而不是登录密码

    • 授权码可以在邮箱设置中生成

  3. 错误处理

    • 代码中包含异常处理,但实际使用时可能需要更详细的日志记录

运行流程

  1. 用户输入需求(如"帮我写一份情书")

  2. 作家 Agent 根据需求创作情书

  3. 内容编辑 Agent 校对并保存情书到本地文件

  4. 寄信人 Agent 读取本地文件并通过邮件发送

  5. 系统返回执行结果

示例输出

根据提供的 email_category.txt 文件,我们可以看到系统生成的示例情书:

text

My Dearest,In the symphony of life, you are the melody that resonates with every beat of my heart. With each passing day, my love for you grows stronger, like the gentle tide that forever circles the shore.In the language of stars, I'd write your name across the sky, for the world to see the light you've brought into my life. With every word I pen, I hope to convey the depth of my affection. You are my sun, my moon, my endless dream.Among life's uncertainties, one thing remains steadfast—my love for you. It's a love that's timeless, boundless, and true. In your arms, I find my home, my peace, my reason for being.This letter may be brief, but my heart's devotion is eternal. I love you, beyond words, beyond time.Yours sincerely,
[Your Name] 

学习要点

  1. Agent 设计:每个 Agent 都有明确的角色、目标和背景故事

  2. 任务分解:将复杂任务分解为多个子任务,由不同的 Agent 负责

  3. 工具集成:通过自定义工具扩展 Agent 的能力

  4. 流程控制:使用顺序流程确保任务按正确顺序执行

  5. 错误处理:代码中包含异常处理机制,提高系统稳定性

注意事项

  1. 需要配置 OpenAI API 密钥和环境变量

  2. 邮件发送功能需要配置正确的 SMTP 服务器信息

  3. 需要确保网络代理设置正确(如代码中的 localhost:7890)

  4. 可以根据需要替换为其他大语言模型(如代码中注释的 ChatZhipuAI)

扩展应用

这个基础框架可以扩展到更多应用场景:

  1. 自动生成各类商务邮件

  2. 创建个性化的营销内容

  3. 自动化客户服务回复

  4. 生成报告和文档摘要

这个项目展示了如何使用 CrewAI 框架构建一个多 Agent 协作系统,非常适合初学者学习 AI Agent 的基本概念和实现方法。通过修改 Agent 的角色和任务,可以将其应用于各种不同的场景。

http://www.dtcms.com/a/392916.html

相关文章:

  • 【分布式技术】RedisShake相关功能详细介绍
  • qsv:一款高性能的CSV数据处理工具
  • `html` 将视频作为背景
  • 口播提词器怎么选?手机提词器实测指南与参数推荐
  • 解剖线性表
  • 计算数学研究方向有哪些细分领域?
  • [xboard]08-Makefile逐行分析2
  • Clash 中 REJECT 的技术原理与解决方案 —— 以哔哩哔哩延迟问题为例
  • 庖丁解牛与专家思维:道家的“心手合一”训练法
  • matlab通过GUI实现点云的读取、自定义显示和保存
  • 工业现场实战:如何利用智能网关实现西门子PLC与库卡机器人的无缝连接
  • 【开题答辩全过程】以 Java程序设计课程作业数据分析为例,包含答辩的问题和答案
  • ubuntu配置cuda与torch
  • C语言:输出水仙花数
  • 进程的创建
  • 如何用Anaconda Navigator和命令行管理Python库?
  • 28 种 LLM 越狱攻击全景拆解(2025.9 版)从“AIM”到“Generation Exploitation”,一张防御地图看懂所有套路
  • 第14章 智能床位
  • 总结一下MySQL数据库服务器性能优化的几个维度
  • IP 打造财富新机遇
  • linux系统如何查看文件位置在数据盘还是系统盘
  • C#关键字 unchecked与checked
  • EasyClick JavaScript 字符串进阶
  • 小明打砖块-算法
  • 【Open3D】在Conda环境下安装Open3D | Anaconda | VSCode
  • AWS 的存储方案全对比:EBS、S3、EFS 用在哪?
  • 【实证分析】上市公司债务违约风险KMV模型及违约距离(2000-2023年)
  • 【牛客网】dd爱科学 最长非递减子序列 二分查找
  • vmware安装uos v20无法识别网卡
  • 力扣hot100 | 动态规划1 | 70. 爬楼梯、118. 杨辉三角、198. 打家劫舍、279. 完全平方数、322. 零钱兑换