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

AI1天前更新 beixibaobao
7 0 0

在这里插入图片描述

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

想象一下:你每天早上到工位,打开邮箱,已经有一份自动生成的销售日报静静躺在收件箱里。它从数据库拉取了昨日数据,用 Excel 做了透视和图表,还用自然语言写了业务洞察——全程无人干预。

这不是科幻,这是用 Python 把大模型“武装”成工具型实习生

核心思路:LLM 不是大脑,是“调度员”

大模型(LLM)擅长理解自然语言和生成代码/文本,但不擅长精确计算、操作文件、连接外部系统。所以我们的架构是:

用户指令 → LLM 解析 → 生成 Python 代码 → 安全执行器 → 返回结果

相当于给 LLM 配了一双 Python 的手,让它可以:

  • 读写 Excel(openpyxl, pandas
  • 发邮件(smtplib, yagmail
  • 查数据库(sqlalchemy, pymysql
  • 做任何 Python 能做的事

一、搭建最小可用框架

选一个支持函数调用(Function Calling)的模型,比如 GPT-4、Claude 3、Qwen-max 或本地部署的 DeepSeek。这里以 OpenAI 兼容接口为例。

import openai
import json
import subprocess
import tempfile
import os
client = openai.OpenAI(api_key="your-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 发给我”,模型会返回一个函数调用请求,我们捕获它并执行。

def execute_python_code(code_str):
    # 安全措施:在临时文件中执行,限制内置函数
    with tempfile.NamedTemporaryFile(suffix=".py", delete=False) as f:
        f.write(code_str.encode())
        tmp_path = f.name
    try:
        result = subprocess.run(
            ["python", tmp_path],
            capture_output=True,
            text=True,
            timeout=30
        )
        return result.stdout + result.stderr
    finally:
        os.unlink(tmp_path)
# 主循环
def run_agent(user_input):
    messages = [{"role": "user", "content": user_input}]
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=messages,
        tools=tools,
        tool_choice="auto"
    )
    msg = response.choices[0].message
    if msg.tool_calls:
        for call in msg.tool_calls:
            if call.function.name == "execute_python":
                args = json.loads(call.function.arguments)
                output = execute_python_code(args["code"])
                # 把执行结果再喂给模型,让它总结
                messages.append(msg)
                messages.append({
                    "role": "tool",
                    "tool_call_id": call.id,
                    "content": output[:2000]  # 防止过长
                })
                final = client.chat.completions.create(
                    model="gpt-4o",
                    messages=messages
                )
                return final.choices[0].message.content
    return msg.content

这个骨架已经能让模型“动手”了。剩下的就是给它配齐各种操作函数,并教会它怎么组合。

二、Excel 自动化:让模型做数据分析师

给模型注入操作 Excel 的知识。我们不在系统提示里写长篇大论,而是在需要时由模型自行生成代码,因为 GPT-4 本身熟悉 pandas 和 openpyxl。

用户指令示例:

“把 sales.xlsx 里的 1 月数据按区域汇总销售额,加一个柱状图,另存为 report.xlsx”

模型会生成类似这样的代码:

import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
df = pd.read_excel('sales.xlsx')
df_jan = df[df['月份'] == 1]
summary = df_jan.groupby('区域')['销售额'].sum().reset_index()
with pd.ExcelWriter('report.xlsx', engine='openpyxl') as writer:
    summary.to_excel(writer, sheet_name='汇总', index=False)
    workbook = writer.book
    sheet = workbook['汇总']
    chart = BarChart()
    data = Reference(sheet, min_col=2, min_row=1, max_row=len(summary)+1)
    categories = Reference(sheet, min_col=1, min_row=2, max_row=len(summary)+1)
    chart.add_data(data, titles_from_data=True)
    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_email@xxx.com', '授权码')
yag.send(to='xxx', subject='xxx', contents=['正文', '附件路径'])

然后用户说:

“把刚才的 report.xlsx 发给 zhangsan@company.com,正文写‘请查收昨日数据’”

模型生成的代码会自动引用之前生成的文件,并调用 yagmail 发出。注意:邮箱授权码要存环境变量,不能写死在代码里。

import os
import yagmail
yag = yagmail.SMTP(os.environ['EMAIL_USER'], os.environ['EMAIL_PASS'])
yag.send(
    to='zhangsan@company.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(index=False))  # 将结果以文本返回

用户问:

“查询最近 7 天华东区的订单量和总金额”

模型生成:

from sqlalchemy import create_engine
import pandas as pd
import os
from datetime import datetime, timedelta
engine = create_engine(os.environ['DB_URL'])
end_date = datetime.now().date()
start_date = end_date - timedelta(days=7)
sql = f"""
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
"""
df = pd.read_sql(sql, engine)
print(df.to_string(index=False))

执行器捕获 stdout,将查询结果以文本返回给模型,模型再总结成自然语言回复用户。

五、组合能力:多步骤任务才是杀手锏

单个操作不难,真正有价值的是多步骤组合。例如:

“查一下上个月未发货的订单,按客户汇总,做成 Excel,然后发给销售总监,并抄送给我”

模型会生成一段完整的 Python 脚本,依次执行:

  1. 连接数据库查询未发货订单
  2. 用 pandas 按客户聚合
  3. 写入 Excel 并格式化
  4. 调用 yagmail 发送邮件

整个流程一次完成,无需人工干预。这就是“实习生”的真正含义——把重复的、多步骤的数据工作交给它。

六、安全与边界(必须严肃对待)

让模型执行任意 Python 代码是有风险的。必须做三件事:

  1. 沙盒执行:用 subprocess 在独立进程中运行,设置 timeout,限制内存和 CPU。
  2. 禁用危险模块:在临时脚本中预先屏蔽 os.systemsubprocessevalexec__import__ 等。可以用 restricted 环境或 pysandbox(虽然不完美,但至少屏蔽显式调用)。
  3. 人工审核开关:对于生产环境,建议将生成的代码先展示给用户,点击“确认执行”后再运行,而不是全自动。

简单过滤实现:

dangerous_keywords = ['os.system', 'subprocess.Popen', 'eval(', 'exec(', '__import__', 'open(', 'file(']
for kw in dangerous_keywords:
    if kw in code_str:
        raise ValueError(f"禁止使用 {kw}")

但这只是第一层,更稳妥的是用 RestrictedPython 或 Docker 容器隔离。

七、实战效果:一个完整对话

用户输入:

“帮我做三件事:1)从 orders 表查昨天所有订单;2)算一下每个销售员的业绩排名;3)把排名前 3 的销售员名单发邮件给 hr@company.com,标题写‘今日之星’”

模型内部生成代码(示意):

import pandas as pd
from sqlalchemy import create_engine
import yagmail
import os
from datetime import datetime, timedelta
engine = create_engine(os.environ['DB_URL'])
yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
df = pd.read_sql(f"SELECT sales_name, amount FROM orders WHERE date='{yesterday}'", engine)
rank = df.groupby('sales_name')['amount'].sum().reset_index().sort_values('amount', ascending=False)
top3 = rank.head(3)['sales_name'].tolist()
yag = yagmail.SMTP(os.environ['EMAIL_USER'], os.environ['EMAIL_PASS'])
yag.send(
    to='hr@company.com',
    subject='今日之星',
    contents=[f"昨日业绩排名前三:{', '.join(top3)}"]
)
print("完成,邮件已发")

执行后返回:

“已完成。昨日订单数据已查询,业绩排名前三的销售员是:张伟、李娜、王强,邮件已发送至 hr@company.com。”

八、进阶:让它自己“学会”新工具

如果每次新增工具都要改系统提示,不够优雅。更好的做法是维护一个 工具仓库(比如 tools/ 文件夹),里面每个 .py 文件都是一个工具的说明和示例代码。每次请求前,将相关工具的文档动态注入到系统消息里,让模型“按需选用”。

还可以让模型在遇到无法解决的问题时,自己写一个新工具并保存到仓库里(需人工确认)。这样它就像一个不断成长的实习生。

九、部署与日程化

最后一步,把这个 Agent 包装成一个定时任务(cron / 计划任务),每天早晨 8 点自动运行固定的指令,比如“生成昨日销售日报并发送给管理层”。

0 8 * * * cd /path/to/project && python agent.py --task "生成昨日销售日报,发送给所有区域经理"

这时候它不再是一个交互式助手,而是一个全自动的数字员工

总结

能力 实现方式 模型扮演的角色
Excel 读写 pandas + openpyxl 数据分析师
发邮件 yagmail / smtplib 秘书
查数据库 sqlalchemy + SQL 数据工程师
多步骤编排 生成完整 Python 脚本 项目执行者

关键不是让模型直接操作这些系统,而是让模型生成操作这些系统的 Python 代码,再由一个安全执行器去跑。这种“代码生成 + 执行”模式,比单纯的 API 调用灵活得多,几乎能覆盖一切办公室数据处理场景。

你的“实习生”不会抱怨加班,不会要求涨薪,只需要你给它清晰的指令和必要的权限。而你要做的,就是搭好这个脚手架,然后放手让它去跑。

现在,打开你的 Python 环境,花一个周末把这个框架搭起来。下周一的早晨,你就能在收件箱里收到它为你准备的惊喜了。
推荐阅读:看我如何管理我的电子书籍

© 版权声明

相关文章