29-day7-plan-引导例子-非LLM的计划
day7-plan-引导例子-非LLM的计划
✅ 文件阐述
-
day7-plan-1.py:主 Agent 控制器,硬编码任务计划(Plan),调用工具函数执行(Execute) -
qqmail_yueshanzhang.py:纯函数模块,不直接运行,仅供导入使用 -
.env:保持不变,存放email密码 -
email_content:文档文件,存放邮件内容和主题(由 planner 生成)
📁 文件夹结构
day07/
├── .env # 环境变量(QQ 邮箱密码)
├── email_content # 临时邮件模板(由 planner 生成)
├── qqmail_yueshanzhang.py # 邮件发送工具函数(可被 import)
└── day7-plan-1.py # 主 Agent:Plan-and-Execute 控制器
🔧 步骤 1: 创建虚拟环境
# 创建工作目录
mkdir day7 && cd day7
# 创建虚拟环境
python3 -m venv day7plan
# 激活虚拟环境
source day7plan/bin/activate
# 升级 pip
pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
# 安装依赖软件
pip install dotenv python-dotenv dashscope
🔧 步骤 2: myQmail.py
tee myQmail.py <<'EOFA'
# day07/qqmail_yueshanzhang.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
邮件发送工具模块 —— 可被其他脚本 import 调用
输入:模板文件路径(默认 'email_content')
输出:True/False 表示是否成功
"""
import sys
import smtplib
import os
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.header import Header
from datetime import datetime
from dotenv import load_dotenv
def send_email_from_template(template_path: str = "email_content", attachments: list = None):
"""
根据模板文件发送邮件
:param template_path: 邮件模板文件路径
:param attachments: 附件文件路径列表(可选)
:return: bool, 是否成功
"""
if attachments is None:
attachments = []
# 加载环境变量
load_dotenv()
password = os.getenv("QQ_EMAIL_PASSWORD")
if not password:
print("❌ 错误: 未设置 QQ_EMAIL_PASSWORD 环境变量")
return False
sender = 'yueshanzhang@qq.com'
receivers = ['yueshanzhang@qq.com']
try:
# 读取模板
with open(template_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
if not lines:
print("❌ 模板文件为空")
return False
subject_line = lines[0].strip()
if subject_line.startswith("主题:"):
subject = subject_line[len("主题:"):].strip()
else:
subject = '默认主题'
content_template = ''.join(lines[1:])
now = datetime.now()
date_time = now.strftime("%Y-%m-%d %H:%M")
content = content_template.replace('\n日期和时间: ', f'\n日期和时间: {date_time}')
# 构建邮件
msg = MIMEMultipart()
msg.attach(MIMEText(content, 'plain', 'utf-8'))
msg['From'] = Header(sender)
msg['To'] = Header(", ".join(receivers), 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
# 添加附件
for filename in attachments:
try:
with open(filename, "rb") as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename="{os.path.basename(filename)}"')
msg.attach(part)
except FileNotFoundError:
print(f"⚠️ 附件未找到: {filename}")
continue
# 发送
smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtpObj.login(sender, password)
smtpObj.sendmail(sender, receivers, msg.as_string())
smtpObj.quit()
print("✅ 邮件发送成功")
return True
except Exception as e:
print(f"❌ 邮件发送失败: {e}")
return False
# 如果直接运行此脚本,则像原来一样工作(兼容旧用法)
if __name__ == "__main__":
attachments = sys.argv[1:]
send_email_from_template(attachments=attachments)
EOFA
🧠 步骤 2:编写 day7-plan-1.py —— 体现 Plan-and-Execute
tee day7-plan-1.py <<'EOFB'
# day07/day7-plan-1.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Day 7: Plan-and-Execute 示例
任务:帮我写一封请假邮件
计划(手动硬编码):
1. 查日历 → 获取当前日期
2. 写草稿 → 生成 email_content 模板文件
3. 发送邮件 → 调用 qqmail_yueshanzhang.send_email_from_template()
"""
import os
from datetime import datetime
from myQmail import send_email_from_template # 导入工具函数
def plan_and_execute(task: str):
print(f"🎯 接收任务: {task}\n")
# === PLAN 阶段:手动定义步骤 ===
plan = [
"1. 查日历:获取当前日期",
"2. 写草稿:生成请假邮件模板(写入 email_content)",
"3. 发送邮件:调用邮件工具发送"
]
print("📋 计划:")
for i, step in enumerate(plan, 1):
print(f" {i}. {step}")
print()
# === EXECUTE 阶段:按计划执行 ===
print("⚙️ 执行中...")
# Step 1: 查日历
print("[1/3] 执行: 查日历")
today = datetime.now().strftime("%Y-%m-%d")
weekday = datetime.now().strftime("%A")
print(f" ✅ 今天是 {today} ({weekday})")
# Step 2: 写草稿(生成 email_content)
print("\n[2/3] 执行: 写草稿")
template_content = f"""主题:请假申请
尊敬的领导:
您好!
因身体不适,需请假一天,特此申请 {today}({weekday})休假。
恳请批准!
此致
敬礼!
常山赵子龙
{today}
日期和时间: """
with open("email_content", "w", encoding="utf-8") as f:
f.write(template_content)
print(" ✅ 邮件模板已生成到 'email_content'")
# Step 3: 发送邮件
print("\n[3/3] 执行: 发送邮件")
success = send_email_from_template() # 调用导入的函数
# 返回最终结果
if success:
return "✅ 任务完成:请假邮件已成功发送!"
else:
return "❌ 任务失败:邮件未能发送,请检查配置或网络。"
if __name__ == "__main__":
task = "帮我写一封请假邮件"
result = plan_and_execute(task)
print(f"\n🔚 最终结果: {result}")
EOFB
🔧 步骤 3: .env文件,qqemail密码
tee .env <<'EOFC'
# .env
QQ_EMAIL_PASSWORD=替换成邮箱密码
EOFC

🔧 步骤 4:email_content文件
tee ./email_content <<'EOFC'
主题:测试邮件
内容第一行
内容第二行
EOFC
📦 文件夹结构总结
day07/
├── .env ← 程序密码
├── email_content ← 临时生成(运行day7-plan-1.py时,自动创建)
├── qqmail_yueshanzhang.py ← 工具模块(提供 send_email_from_template 函数)
└── day7-plan-1.py ← 主 Agent(Plan-and-Execute 控制器)
▶️ 运行
python day7-plan-1.py
程序会:
- 打印计划
- 生成
email_content - 调用邮件函数发送
- 输出最终结果
✅ 程序特点
| 特性 | 说明 |
|---|---|
| Plan 显式化 | 三步计划硬编码在列表中,清晰可见 |
| Execute 模块化 | 每步独立、可测试 |
| 工具解耦 | 邮件功能封装为可重用函数 |
| 无 LLM 依赖 | 完全手动规划,聚焦架构理解 |
| 真实场景 | 使用真实 SMTP 发送,非模拟 |
这样设计后,学生能清晰看到:
“Agent = Planner + Tools”
Planner 决定做什么,Tools 负责怎么做。
如需增加“带附件的邮件” 或 “不同任务模板”,也可在此基础上扩展。
浙公网安备 33010602011771号