用Python 让大模型自动调用 Excel、发邮件、查数据库,变成你的实习生

📅 2026/8/5 2:18:21
用Python 让大模型自动调用 Excel、发邮件、查数据库,变成你的实习生
用 Python 让大模型自动调用 Excel、发邮件、查数据库变成你的实习生想象一下你每天早上到工位打开邮箱已经有一份自动生成的销售日报静静躺在收件箱里。它从数据库拉取了昨日数据用 Excel 做了透视和图表还用自然语言写了业务洞察——全程无人干预。这不是科幻这是用 Python 把大模型“武装”成工具型实习生。核心思路LLM 不是大脑是“调度员”大模型LLM擅长理解自然语言和生成代码/文本但不擅长精确计算、操作文件、连接外部系统。所以我们的架构是用户指令 → LLM 解析 → 生成 Python 代码 → 安全执行器 → 返回结果相当于给 LLM 配了一双 Python 的手让它可以读写 Excelopenpyxl,pandas发邮件smtplib,yagmail查数据库sqlalchemy,pymysql做任何 Python 能做的事一、搭建最小可用框架选一个支持函数调用Function Calling的模型比如 GPT-4、Claude 3、Qwen-max 或本地部署的 DeepSeek。这里以 OpenAI 兼容接口为例。importopenaiimportjsonimportsubprocessimporttempfileimportos clientopenai.OpenAI(api_keyyour-key)# 定义工具描述让模型知道它能调用什么tools[{type:function,function:{name:execute_python,description:执行一段 Python 代码用于操作 Excel、数据库、发送邮件等,parameters:{type:object,properties:{code:{type:string,description:要执行的 Python 代码},description:{type:string,description:代码作用的简短描述}},required:[code]}}}]当用户说“查一下昨天华东区的订单总额做成 Excel 发给我”模型会返回一个函数调用请求我们捕获它并执行。defexecute_python_code(code_str):# 安全措施在临时文件中执行限制内置函数withtempfile.NamedTemporaryFile(suffix.py,deleteFalse)asf:f.write(code_str.encode())tmp_pathf.nametry:resultsubprocess.run([python,tmp_path],capture_outputTrue,textTrue,timeout30)returnresult.stdoutresult.stderrfinally:os.unlink(tmp_path)# 主循环defrun_agent(user_input):messages[{role:user,content:user_input}]responseclient.chat.completions.create(modelgpt-4o,messagesmessages,toolstools,tool_choiceauto)msgresponse.choices[0].messageifmsg.tool_calls:forcallinmsg.tool_calls:ifcall.function.nameexecute_python:argsjson.loads(call.function.arguments)outputexecute_python_code(args[code])# 把执行结果再喂给模型让它总结messages.append(msg)messages.append({role:tool,tool_call_id:call.id,content:output[:2000]# 防止过长})finalclient.chat.completions.create(modelgpt-4o,messagesmessages)returnfinal.choices[0].message.contentreturnmsg.content这个骨架已经能让模型“动手”了。剩下的就是给它配齐各种操作函数并教会它怎么组合。二、Excel 自动化让模型做数据分析师给模型注入操作 Excel 的知识。我们不在系统提示里写长篇大论而是在需要时由模型自行生成代码因为 GPT-4 本身熟悉 pandas 和 openpyxl。用户指令示例“把 sales.xlsx 里的 1 月数据按区域汇总销售额加一个柱状图另存为 report.xlsx”模型会生成类似这样的代码importpandasaspdfromopenpyxlimportWorkbookfromopenpyxl.chartimportBarChart,Reference dfpd.read_excel(sales.xlsx)df_jandf[df[月份]1]summarydf_jan.groupby(区域)[销售额].sum().reset_index()withpd.ExcelWriter(report.xlsx,engineopenpyxl)aswriter:summary.to_excel(writer,sheet_name汇总,indexFalse)workbookwriter.book sheetworkbook[汇总]chartBarChart()dataReference(sheet,min_col2,min_row1,max_rowlen(summary)1)categoriesReference(sheet,min_col1,min_row2,max_rowlen(summary)1)chart.add_data(data,titles_from_dataTrue)chart.set_categories(categories)sheet.add_chart(chart,D2)print(已生成 report.xlsx 并包含柱状图)我们只需要把这段代码塞进执行器它就能真正产出文件。为了让模型知道文件路径我们约定一个工作目录比如./workspace并让模型在代码里写相对路径。三、发邮件让模型当你的秘书邮件操作我们封装成两个函数send_email(to, subject, body, attachments)和send_report(to, date)。但更灵活的方式是让模型直接写邮件代码。提前在系统提示里植入一段“邮件模板”发送邮件请使用以下代码模板 import yagmail yag yagmail.SMTP(your_emailxxx.com, 授权码) yag.send(toxxx, subjectxxx, contents[正文, 附件路径])然后用户说“把刚才的 report.xlsx 发给 zhangsancompany.com正文写‘请查收昨日数据’”模型生成的代码会自动引用之前生成的文件并调用 yagmail 发出。注意邮箱授权码要存环境变量不能写死在代码里。importosimportyagmail yagyagmail.SMTP(os.environ[EMAIL_USER],os.environ[EMAIL_PASS])yag.send(tozhangsancompany.com,subject昨日数据报告,contents[请查收昨日数据,report.xlsx])print(邮件已发送)四、查数据库让模型当数据工程师数据库操作同样交给模型生成 SQL 和 Python 代码。我们只暴露连接信息通过环境变量并限制只能执行 SELECT 查询防止模型误操作。系统提示里写连接数据库使用以下方式 from sqlalchemy import create_engine import pandas as pd engine create_engine(os.environ[DB_URL]) df pd.read_sql(SELECT ..., engine) print(df.to_csv(indexFalse)) # 将结果以文本返回用户问“查询最近 7 天华东区的订单量和总金额”模型生成fromsqlalchemyimportcreate_engineimportpandasaspdimportosfromdatetimeimportdatetime,timedelta enginecreate_engine(os.environ[DB_URL])end_datedatetime.now().date()start_dateend_date-timedelta(days7)sqlf SELECT order_date, SUM(amount) as total_amount, COUNT(*) as order_count FROM orders WHERE region 华东 AND order_date BETWEEN {start_date} AND {end_date} GROUP BY order_date ORDER BY order_date dfpd.read_sql(sql,engine)print(df.to_string(indexFalse))执行器捕获 stdout将查询结果以文本返回给模型模型再总结成自然语言回复用户。五、组合能力多步骤任务才是杀手锏单个操作不难真正有价值的是多步骤组合。例如“查一下上个月未发货的订单按客户汇总做成 Excel然后发给销售总监并抄送给我”模型会生成一段完整的 Python 脚本依次执行连接数据库查询未发货订单用 pandas 按客户聚合写入 Excel 并格式化调用 yagmail 发送邮件整个流程一次完成无需人工干预。这就是“实习生”的真正含义——把重复的、多步骤的数据工作交给它。六、安全与边界必须严肃对待让模型执行任意 Python 代码是有风险的。必须做三件事沙盒执行用subprocess在独立进程中运行设置timeout限制内存和 CPU。禁用危险模块在临时脚本中预先屏蔽os.system、subprocess、eval、exec、__import__等。可以用restricted环境或pysandbox虽然不完美但至少屏蔽显式调用。人工审核开关对于生产环境建议将生成的代码先展示给用户点击“确认执行”后再运行而不是全自动。简单过滤实现dangerous_keywords[os.system,subprocess.Popen,eval(,exec(,__import__,open(,file(]forkwindangerous_keywords:ifkwincode_str:raiseValueError(f禁止使用{kw})但这只是第一层更稳妥的是用RestrictedPython或 Docker 容器隔离。七、实战效果一个完整对话用户输入“帮我做三件事1从 orders 表查昨天所有订单2算一下每个销售员的业绩排名3把排名前 3 的销售员名单发邮件给 hrcompany.com标题写‘今日之星’”模型内部生成代码示意importpandasaspdfromsqlalchemyimportcreate_engineimportyagmailimportosfromdatetimeimportdatetime,timedelta enginecreate_engine(os.environ[DB_URL])yesterday(datetime.now()-timedelta(days1)).strftime(%Y-%m-%d)dfpd.read_sql(fSELECT sales_name, amount FROM orders WHERE date{yesterday},engine)rankdf.groupby(sales_name)[amount].sum().reset_index().sort_values(amount,ascendingFalse)top3rank.head(3)[sales_name].tolist()yagyagmail.SMTP(os.environ[EMAIL_USER],os.environ[EMAIL_PASS])yag.send(tohrcompany.com,subject今日之星,contents[f昨日业绩排名前三{, .join(top3)}])print(完成邮件已发)执行后返回“已完成。昨日订单数据已查询业绩排名前三的销售员是张伟、李娜、王强邮件已发送至 hrcompany.com。”八、进阶让它自己“学会”新工具如果每次新增工具都要改系统提示不够优雅。更好的做法是维护一个工具仓库比如tools/文件夹里面每个.py文件都是一个工具的说明和示例代码。每次请求前将相关工具的文档动态注入到系统消息里让模型“按需选用”。还可以让模型在遇到无法解决的问题时自己写一个新工具并保存到仓库里需人工确认。这样它就像一个不断成长的实习生。九、部署与日程化最后一步把这个 Agent 包装成一个定时任务cron / 计划任务每天早晨 8 点自动运行固定的指令比如“生成昨日销售日报并发送给管理层”。08* * *cd/path/to/projectpython agent.py--task生成昨日销售日报发送给所有区域经理这时候它不再是一个交互式助手而是一个全自动的数字员工。总结能力实现方式模型扮演的角色Excel 读写pandas openpyxl数据分析师发邮件yagmail / smtplib秘书查数据库sqlalchemy SQL数据工程师多步骤编排生成完整 Python 脚本项目执行者关键不是让模型直接操作这些系统而是让模型生成操作这些系统的 Python 代码再由一个安全执行器去跑。这种“代码生成 执行”模式比单纯的 API 调用灵活得多几乎能覆盖一切办公室数据处理场景。你的“实习生”不会抱怨加班不会要求涨薪只需要你给它清晰的指令和必要的权限。而你要做的就是搭好这个脚手架然后放手让它去跑。现在打开你的 Python 环境花一个周末把这个框架搭起来。下周一的早晨你就能在收件箱里收到它为你准备的惊喜了。推荐阅读看我如何管理我的电子书籍