74-AI私人助理实战-天气邮件新闻日程-多工具Agent-Streamlit界面

发布时间:2026/7/25 3:47:04

74-AI私人助理实战-天气邮件新闻日程-多工具Agent-Streamlit界面 文章目录【74.PythonAI】实战AI私人助理——查天气、写邮件、搜新闻、管日程的全能Agent导入语1 ~ 整体架构1.1 项目结构2 ~ 五个工具的实现2.1 tools.py2.2 agent.py多轮任务规划2.3 app.pyStreamlit界面3 ~ 从这个实战中学到什么思考 总结结尾【74.PythonAI】实战AI私人助理——查天气、写邮件、搜新闻、管日程的全能Agent文章简介本文是Agent板块的收官实战把前面学过的ReAct循环、工具定义、多轮任务规划全部串起来从零搭建一个AI私人助理。文章实现5个工具的集成天气查询、新闻搜索、邮件起草、日程读写、通用计算支持明天下雨就提醒我带伞并把下午的会改到线上这类跨工具的多轮任务规划最后用Streamlit搭建可视化聊天界面实现一键运行。配有Mermaid架构图展示任务规划与工具串联的完整数据流适合完整学完Agent板块、需要一个综合项目检验学习成果的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语前面几篇文章我们把Agent的零件一个个造了出来ReAct循环、工具定义、安全控制。零散的知识点学完了是时候把它们组装成一台真正能跑的机器。这篇文章的目标一个能理解复合指令的私人助理。你说帮我看看明天北京天气如果下雨就把明天的户外跑步改成室内再写封邮件告诉教练它能自己拆解成三步、串起三个工具、给你一份完整的执行结果。1 ~ 整体架构Streamlit 聊天界面Agent 核心ReAct循环工具路由weather天气查询news新闻搜索email邮件起草calendar日程读写calculator通用计算结果串联生成最终回复1.1 项目结构assistant/ ├─ tools.py# 5个工具的实现├─ agent.py# ReAct Agent核心├─ app.py# Streamlit界面└─ requirements.txt2 ~ 五个工具的实现2.1 tools.pyimportrequests,json,datetime# ---------- 工具1天气查询 ----------defget_weather(city:str)-str:查询城市天气示例用wttr.in免费接口try:rrequests.get(fhttps://wttr.in/{city}?formatj1,timeout10)datar.json()todaydata[weather][0]desctoday[hourly][4][lang_zh][0][value]temptoday[avgtempC]raintoday[hourly][4][chanceofrain]returnf{city}明天天气{desc}平均气温{temp}℃降雨概率{rain}%exceptExceptionase:returnf天气查询失败{e}# ---------- 工具2新闻搜索 ----------defsearch_news(keyword:str)-str:搜索最新新闻示例用模拟数据可替换为Tavily/NewsAPI# 实际接入时替换为真实APIreturnf关于{keyword}的最新新闻\n1. [示例]相关新闻标题一\n2. [示例]相关新闻标题二# ---------- 工具3邮件起草 ----------defdraft_email(recipient:str,subject:str,body_hint:str)-str:起草邮件生成草稿不直接发送——安全第一return(f【邮件草稿】\n收件人{recipient}\n主题{subject}\nf正文草稿根据{body_hint}生成的邮件正文...\nf[草稿待人工确认后发送])# ---------- 工具4日程管理 ----------_schedule{}# 演示用内存存储生产换数据库defmanage_schedule(action:str,date:str,event:str)-str:日程增查改。action: add/list/updateifactionadd:_schedule.setdefault(date,[]).append(event)returnf已添加日程{date}-{event}elifactionlist:events_schedule.get(date,[])returnf{date}的日程{eventsifeventselse无安排}elifactionupdate:returnf{date}的日程已更新为{event}return不支持的日程操作# ---------- 工具5计算器 ----------defcalculator(expr:str)-str:try:returnstr(eval(expr,{__builtins__:{}}))exceptExceptionase:returnf计算错误{e}TOOLS{weather:get_weather,news:search_news,email:draft_email,calendar:manage_schedule,calculator:calculator,}TOOLS_DESC - weather[city]: 查询城市天气参数为城市名 - news[keyword]: 搜索新闻参数为关键词 - email[recipient|subject|hint]: 起草邮件参数用|分隔收件人|主题|内容要点 - calendar[action|date|event]: 日程管理action为add/list/update参数用|分隔 - calculator[expr]: 数学计算 注意邮件工具的设计只起草不发送。有真实副作用的操作留给人工确认这是第72篇安全原则的直接应用。2.2 agent.py多轮任务规划importrefromlangchain_openaiimportChatOpenAI REACT_PROMPT你是一个私人助理可以使用以下工具帮用户完成任务 {tools} 用户的一句话可能包含多个子任务比如查天气如果下雨就改日程。 请逐个处理严格按以下格式 Thought: 分析当前要做什么 Action: 工具名[参数] Observation: 工具返回结果不要编造 全部子任务完成后 Thought: 所有任务已完成 Final Answer: 给用户一份完整的、自然语言的总结包含所有子任务的结果 历史记录 {scratchpad} 用户请求{question} classAssistantAgent:def__init__(self,max_steps12):self.llmChatOpenAI(modelgpt-4,temperature0)self.max_stepsmax_stepsdefrun(self,question:str)-str:scratchpadfor_inrange(self.max_steps):respself.llm.invoke(REACT_PROMPT.format(toolsTOOLS_DESC,questionquestion,scratchpadscratchpad)).contentifFinal Answer:inresp:returnresp.split(Final Answer:)[-1].strip()mre.search(rAction:\s*(\w)\[(.*?)\],resp,re.DOTALL)ifnotm:scratchpadresp\ncontinuetool_name,raw_argsm.group(1),m.group(2).strip()args[a.strip()forainraw_args.split(|)]try:obsTOOLS[tool_name](*args)iftool_nameinTOOLS \elsef未知工具{tool_name}exceptTypeError:obsf工具{tool_name}参数格式错误scratchpadf{resp}\nObservation:{obs}\nreturn任务过于复杂超过最大执行步数复合指令如果下雨就改日程的执行轨迹Step1: Thought: 先查明天北京天气 → weather[北京]→ Observation: 明天小雨降雨概率85% Step2: Thought: 下雨概率很高需要把户外跑步改为室内 → calendar[update|2024-11-16|户外跑步→室内健身]→ Observation: 日程已更新 Step3: Thought: 最后起草邮件通知教练 → email[coachgym.com|训练调整|明天因雨改为室内训练]→ Observation: 邮件草稿已生成 Final Answer: 明天北京有小雨降雨概率85%已为您将...2.3 app.pyStreamlit界面importstreamlitasstfromagentimportAssistantAgent st.set_page_config(page_titleAI私人助理,page_icon)st.title( AI私人助理)ifmessagesnotinst.session_state:st.session_state.messages[]ifagentnotinst.session_state:st.session_state.agentAssistantAgent()# 渲染历史消息formsginst.session_state.messages:withst.chat_message(msg[role]):st.markdown(msg[content])# 处理新输入ifprompt:st.chat_input(试试查明天北京天气下雨就把跑步改室内):st.session_state.messages.append({role:user,content:prompt})withst.chat_message(user):st.markdown(prompt)withst.chat_message(assistant):withst.spinner(助理正在处理...):answerst.session_state.agent.run(prompt)st.markdown(answer)st.session_state.messages.append({role:assistant,content:answer})运行streamlit run app.py浏览器打开即是一个完整的聊天式助理。3 ~ 从这个实战中学到什么知识点来源篇章在实战中的应用ReAct循环第66篇agent.py的核心执行循环工具描述规范第67篇TOOLS_DESC的参数格式约定安全原则第72篇邮件只起草不发送熔断保护第72篇max_steps12界面搭建第44篇Streamlit会话管理思考 总结复合指令是私人助理的分水岭单一指令的Agent是工具调用器能拆解如果A就B的Agent才是助理。这依赖Prompt中明确要求逐个处理子任务。工具间的参数约定要统一本文用|分隔多参数比让LLM生成JSON更不容易出错——LLM对分隔符的遵循率远高于结构化输出。真实副作用操作留人工关卡邮件起草而非发送看似功能缩水实则是能上线和不能上线的分界线。Streamlit让Demo成本趋近于零不到50行代码就有一个能分享给别人试用的界面。这个项目骨架可以直接扩展把天气换成真实API、日程换成Google Calendar、邮件接上SMTP加确认环节——它就是一个能真正为你干活的助理。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语Agent板块到这里收官。从ReAct到多Agent协作再到这个实战助理你已经掌握了2025年AI开发最热的技能树。下一板块我们进入大模型微调的世界——从用好模型到定制模型。不要忘记给博主一键四连哦

相关新闻