1 大模型Agent的应用
1.1 项目介绍
本次项目以CrewAI为框架,开发AI Agent实现自动写情书以及发送邮件。
CrewAI是一个创新的多角色agent框架,专为角色扮演中的AI代理提供自动化设置。它通过促进AI代理之间的合作,使得这些代理能够共同解决复杂问题。
本次项目基本流程图:
1.2 准备工作
在开展此项目之前,完成环境配置:
首先,确保你的机器安装了Python3.10-Python3.11, 终端查看python的版本: $ python --version
如果还没有下载python的小伙伴,可以复制链接下载:https://www.python.org/
- 安装第三方库:pip install -r requirements.txt
- requirements.txt内容如下:
python
aiohttp==3.9.1
aiosignal==1.3.1
annotated-types==0.6.0
anyio==4.2.0
attrs==23.2.0
certifi==2023.11.17
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
crewai==0.1.32
curl-cffi==0.5.10
dataclasses-json==0.6.3
distro==1.9.0
duckduckgo_search==4.2
frozenlist==1.4.1
greenlet==3.0.3
h11==0.14.0
httpcore==1.0.2
httpx==0.26.0
idna==3.6
jsonpatch==1.33
jsonpointer==2.4
langchain==0.1.1
langchain-community==0.0.13
langchain-core==0.1.13
langchain-openai==0.0.2.post1
langsmith==0.0.83
lxml==5.1.0
marshmallow==3.20.2
multidict==6.0.4
mypy-extensions==1.0.0
numpy==1.26.3
openai==1.8.0
packaging==23.2
pycparser==2.21
pydantic==2.5.3
pydantic_core==2.14.6
PyYAML==6.0.1
regex==2023.12.25
requests==2.31.0
sniffio==1.3.0
SQLAlchemy==2.0.25
tenacity==8.2.3
tiktoken==0.5.2
tqdm==4.66.1
typing-inspect==0.9.0
typing_extensions==4.9.0
urllib3==2.1.0
yarl==1.9.4
-
使用Qwen大模型的模型
没有api-key的需要去平台注册,或者重新创建。
-
可以借助Ollama使用本地大模型
1.3 代码实现
1.3.1 导入必备的工具包
python
from crewai import Agent, Task, Crew, Process # CrewAI相关组件
from agent_tools import CustomTools # 自定义工具
from dotenv import load_dotenv, find_dotenv # API环境配置
from langchain_community.chat_models import ChatTongyi # 模型
load_dotenv()
client = ChatTongyi()
1.3.2 定义Agent
作家Agent
python
poet = Agent(
role='作家', #表明其主要功能。
goal='根据用户需求,创作出情感丰富的文章(最长字数不超过300个词)。', # 目标
backstory="""你作为一名著名的作家,拥有千万级别的粉丝,最擅长写情感类型的文章。""",
verbose=True, # 设置为True,这通常意味着代理将提供详细的日志、输出或解释
allow_delegation=False, # 设置为False,表示不允许此代理将其任务委派给其他代理或进程
llm=client
)
内容编辑Agent
python
letter_writer = Agent(
role='内容编辑',
goal='对作家撰写的文章内容进行精心编辑。',
backstory="""作为一名经验丰富的编辑,你在编辑书信方面有多年的专业经验,
你需要将作家写的文章内容整理编排成书信的样式,并将书信内容存储在本地磁盘上。
你必须使用提供的工具将存储到指定文件中,并确保文件已保存到磁盘上。当文件成功保存时返回 "书信已保存.".
""",
verbose=True,
allow_delegation=False,
tools=[CustomTools.store_poesy_to_txt],
llm=client
)
定义寄信人Agent
python
sender = Agent(
role='寄信人',
goal='将编辑好的书信以邮件的形式发送给心仪的人',
backstory="""你是一名勤恳的信使,专注于将书信传递给每个人,
你必须使用提供的工具将指定文件的书信内容中传送到其他人的邮箱里,如果成功传送,记得返回"信件已发送"
""",
verbose=True,
allow_delegation=True,
tools=[CustomTools.send_message],
llm=client
)
1.3.3 自定义工具类函数
发送邮件的工具类函数
python
from langchain.tools import tool
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from dotenv import load_dotenv
import os
load_dotenv()
class CustomTools(object):
@tool("将文本写入文档中")
def store_poesy_to_txt(content: str) -> str:
"""
将编辑后的书信文本内容自动保存到txt文档中
"""
try:
filename = "poie.txt"
# 将文本写入txt文档中
with open(filename, 'w') as file:
file.write(content)
# 返回结果展示:文件已经写入
return f"File written to {filename}."
except Exception:
return "Error with the input for the tool."
@tool("发送文本到邮件")
def send_message(self):
"""
读取生成的本地书信文件txt文本,并以邮件的形式发送到某个人的邮箱中
"""
# 发件人
from_name = "小可爱"
# 发件邮箱
from_addr = "1980xxxx428@163.com"
# 发件邮箱授权码,注意不是QQ邮箱密码
from_pwd = os.environ.get("EMAIL_PWD")
# 收件邮箱
to_addr = "vixxxanx@icloud.com"
# 邮件标题
my_title = "520小情书"
# 邮件正文
# 书信路径
filename = "poie.txt"
# 定义md文档的绝对路径
with open(filename) as f:
my_msg = f.read()
# MIMEText三个主要参数
# 1. 邮件内容
# 2. MIME子类型,plain表示text类型
# 3. 邮件编码格式,使用"utf-8"避免乱码
msg = MIMEText(my_msg, 'plain', 'utf-8')
msg['From'] = formataddr([from_name, from_addr])
# 邮件的标题
msg['Subject'] = my_title
# SMTP服务器地址,QQ邮箱的SMTP地址是"smtp.qq.com"
smtp_srv = "smtp.163.com"
try:
# 不能直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错
# 使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数
# 第一个是服务器地址,但它是bytes格式,所以需要编码
# 第二个参数是服务器的接受访问端口,SMTP_SSL协议默认端口是465
srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
# 使用授权码登录QQ邮箱
srv.login(from_addr, from_pwd)
# 使用sendmail方法来发送邮件,它有三个参数
# 第一个是发送地址
# 第二个是接受地址,是list格式,可以同时发送给多个邮箱
# 第三个是发送内容,作为字符串发送
srv.sendmail(from_addr, [to_addr], msg.as_string())
print('发送成功')
except Exception as e:
print('发送失败', e)
finally:
# 无论发送成功还是失败都要退出你的QQ邮箱
srv.quit()
1.3.4 为Agent定义任务
作家Agent的任务
python
content = input("请输入你的需求:\n")
# 为你设计的Agent创建任务
task1 = Task(
description=f"""用户需求:{content}。
你最后给出的答案必须是一份富含爱情表示的情书.""",
agent=poet
)
内容编辑Agent的任务
python
task2 = Task(
description="""查找任何语法错误,进行编辑和格式化(如果需要)。并要求将内容保存在本地磁盘中。将内容保存到本地非常重要,
你最后的答案必须是信息是否已被存储在本地磁盘中.""",
agent=letter_writer
)
寄信人Agent的任务
python
task3 = Task(
description="""根据本次磁盘保存的书信内容,你将整理并发送邮件给心仪的人,这个很重要.
你最后的答一定要成功发送该邮件.""",
agent=sender
)
1.3.5 工作人员和流程
python
crew = Crew(
agents=[poet, letter_writer, sender],
tasks=[task1, task2, task3],
verbose=2,
process=Process.sequential
# 使用按顺序执行任务的流程。上一个任务的结果将作为附加内容传递给下一个任务。
)
result = crew.kickoff()
print("######################")
print(result)
输出结果:
小节总结
介绍了如何基于CrewAI框架,实现多个AI Agent协同工作,并完成自动写书信以及发送邮件的案例。