Day 02 · 环境搭建:一套装备打天下
AI Python 系列」第 01 栏 · AI 时代的 Python 办公自动化
全栏 20 篇 · 零成本跟完 🍃
品牌:梅雅达编程笔记
开篇 · 你是不是也卡在这一步
Day 01 说了,AI 办公自动化能帮你省钱省时间。很多读者看完热血沸腾——然后打开电脑,对着满屏的报错发呆:
- “
openai这个库不是 OpenAI 的吗?我不用 OpenAI 也要装?” - “智谱的 API 到底怎么调?官方文档看了三遍还是懵”
- “每个教程用的库都不一样,我到底装哪个?”
- “API Key 写在代码里,发到 GitHub 上被人盗了怎么办?”
这些问题看着小,但90% 的新手就卡在这里放弃了。
今天这篇,我把整个环境搭建拆成三步:装 Python → 注册智谱拿 Key → 写一份通用封装代码。搞完这三步,后续 18 篇的代码你都能直接跑。
一、传统做法 vs AI 时代做法
传统做法:每个项目从头搭
传统 Python 项目搭建环境,你得:
- 手动创建虚拟环境
- 一个个
pip install装库 - 每个项目重写一遍 API 调用代码
- API Key 硬编码在代码里(危险)
- 换个模型供应商?整个项目重改
痛点:重复劳动,代码不可复用,密钥不安全。
AI 时代做法:一套装备打天下
我们的思路很简单:
- 一份
llm_client.py通吃四家 API(GLM/DeepSeek/Qwen/OpenAI) - API Key 走环境变量,代码里看不到密钥
- 一行代码切换供应商:
LLMClient(provider="glm")→LLMClient(provider="deepseek") - 后续 18 篇全用这同一个文件,不重复造轮子
这套封装不是花架子——梅雅达编程笔记的实际开发中,从 Day 03 到 Day 20,每一篇的代码都from llm_client import LLMClient一行导入,然后直接干活。
二、环境搭建三步走
第一步:安装 Python 3.11+
如果你已经装了 Python 3.10 以上,可以跳过这步。
Windows 用户:
- 去 python.org 下载 3.11+ 安装包
- 安装时务必勾选 “Add Python to PATH”
- 打开终端验证:
python--version# 输出 Python 3.11.x 或更高Mac 用户:
# 用 Homebrew 安装brewinstallpython@3.11 python3--version第二步:注册智谱 BigModel,拿到免费 API Key
这是整个专栏唯一需要你注册的平台。GLM-4.7-Flash 永久免费,不花一分钱。
注册流程:
- 打开 智谱开放平台
- 手机号注册并登录
- 进入控制台,左侧菜单找到API 密钥管理
- 点击创建新密钥,复制生成的 Key
⚠️ 重要:API Key 只显示一次,丢了只能重新创建。复制好存到安全的地方。
平台颁发的 API Key 由 API Key ID 与 签名密钥 secret 组成,完整格式为:{API Key ID}.{secret}。
你拿到的 Key 长这样:
{API Key ID}.{secret} xxxxxxxx.xxxxxxxxxxxxxxxx为什么选智谱?
| 对比项 | 智谱 GLM-4.7-Flash | OpenAI GPT-4o-mini | DeepSeek Chat |
|---|---|---|---|
| 价格 | ✅永久免费 | ❌ 需充值+信用卡 | ❌ 新用户送100万Token后收费 |
| 上下文 | 200K | 128K | 128K |
| 最大输出 | 128K | 16K | 8K |
| 国内访问 | ✅ 直连 | ❌ 需科学上网 | ✅ 直连 |
| 注册门槛 | 手机号 | 海外信用卡 | 手机号 |
结论:免费额度最大、门槛最低、中文能力最强。没理由不用它。
第三步:创建 .env 文件(保护你的 Key)
为什么不直接把 Key 写在代码里?
因为如果你把 Key 写在代码里,然后传到 GitHub 或分享给别人——你的 Key 就泄露了。别人可以用你的额度,甚至拿去做坏事。
我们的做法:用.env文件存放 Key,代码通过python-dotenv库自动读取。
好处:Key 跟着项目文件夹走,重装系统也不怕丢。只要.env文件不外传,密钥就是安全的。
操作步骤:
- 在项目目录下创建
.env文件(注意前面有个点) - 填入你的 Key:
# .env 文件内容 GLM_API_KEY=你刚复制的Key- 创建
.gitignore文件,排除.env(防止误传到代码仓库):
.env __pycache__/ *.pyc- 把
.env.example(模板文件)放进去,方便别人知道要填什么
如果已经有 Key 了?直接填进去就行,智谱的 Key 通用的,不用重新申请。
习惯用系统环境变量的也行:代码会先读.env文件,如果没有再读系统环境变量。两种方式任选一种。
- Windows:
$env:GLM_API_KEY = "你的Key" - Mac/Linux:
export GLM_API_KEY="你的Key"
推荐用.env,更省心。
三、一份通用封装:llm_client.py
这是整个专栏最核心的一个文件。后续每一篇都会import它。
设计思路:
- 用
openai官方库(智谱 API 兼容OpenAI格式,一套库通吃四家) - 传入
provider参数切换供应商 - Key 从环境变量读取
chat()方法:普通对话chat_json()方法:让 AI 返回JSON(Day 05 会详细讲)- 内置简单的重试机制
安装依赖
pipinstallopenai>=1.12.0完整依赖见文末
requirements.txt
llm_client.py完整代码
""" llm_client.py - 通用 LLM 客户端封装 支持:GLM(智谱)/ DeepSeek / Qwen(通义千问)/ OpenAI 用法:from llm_client import LLMClient client = LLMClient(provider="glm") answer = client.chat("你好") """importosimporttimefromdotenvimportload_dotenvfromopenaiimportOpenAI# 自动加载当前目录下的 .env 文件load_dotenv()classLLMClient:"""通用 LLM 客户端 - 一行代码切换四家模型"""# 四家供应商配置PROVIDERS={"glm":{"base_url":"https://open.bigmodel.cn/api/paas/v4/","default_model":"glm-4.7-flash",# 永久免费 · 200K上下文"env_key":"GLM_API_KEY",},"deepseek":{"base_url":"https://api.deepseek.com/v1","default_model":"deepseek-chat","env_key":"DEEPSEEK_API_KEY",},"qwen":{"base_url":"https://dashscope.aliyuncs.com/compatible-mode/v1","default_model":"qwen-plus","env_key":"DASHSCOPE_API_KEY",},"openai":{"base_url":"https://api.openai.com/v1","default_model":"gpt-4o-mini","env_key":"OPENAI_API_KEY",},}def__init__(self,provider="glm",model=None):""" 初始化客户端 参数: provider: 供应商 "glm" / "deepseek" / "qwen" / "openai" model: 模型名称,不传则用默认模型 """ifprovidernotinself.PROVIDERS:raiseValueError(f"不支持的供应商:{provider}\n"f"可选:{', '.join(self.PROVIDERS.keys())}")config=self.PROVIDERS[provider]self.provider=provider self.model=modelorconfig["default_model"]# 从环境变量读取 API Key(.env 文件会被 load_dotenv() 自动加载)api_key=os.environ.get(config["env_key"])ifnotapi_key:raiseValueError(f"环境变量{config['env_key']}未设置!\n"f"请在项目目录下创建 .env 文件,填入:\n"f"{config['env_key']}=你的Key\n"f"或设置系统环境变量:\n"f" Windows: $env:{config['env_key']}= \"你的Key\"\n"f" Mac/Linux: export{config['env_key']}=\"你的Key\"")self.client=OpenAI(api_key=api_key,base_url=config["base_url"],)defchat(self,message,system_prompt=None,temperature=0.7,max_tokens=4096,retry=2):""" 普通对话 参数: message: 用户消息(字符串) system_prompt: 系统提示词(可选,设定AI角色) temperature: 0=确定性输出,1=更随机,默认0.7 max_tokens: 最大输出长度 retry: 失败重试次数 返回:AI 回复的文本 """messages=[]ifsystem_prompt:messages.append({"role":"system","content":system_prompt})messages.append({"role":"user","content":message})forattemptinrange(retry+1):try:response=self.client.chat.completions.create(model=self.model,messages=messages,temperature=temperature,max_tokens=max_tokens,)returnresponse.choices[0].message.contentexceptExceptionase:ifattempt<retry:print(f"⚠️ 第{attempt+1}次调用失败,{1.5}s 后重试...")print(f" 错误信息:{e}")time.sleep(1.5)else:raisedefchat_json(self,message,system_prompt=None,temperature=0.1,retry=2):""" 让 AI 返回 JSON 格式数据 参数: message: 用户消息 system_prompt: 系统提示词 temperature: 低温度=更稳定,默认0.1 retry: 失败重试次数 返回:AI 回复的 JSON 字符串 """messages=[]ifsystem_prompt:messages.append({"role":"system","content":system_prompt})messages.append({"role":"user","content":message})forattemptinrange(retry+1):try:response=self.client.chat.completions.create(model=self.model,messages=messages,temperature=temperature,response_format={"type":"json_object"},)returnresponse.choices[0].message.contentexceptExceptionase:ifattempt<retry:print(f"⚠️ 第{attempt+1}次调用失败,{1.5}s 后重试...")time.sleep(1.5)else:raisedef__repr__(self):returnf"LLMClient(provider='{self.provider}', model='{self.model}')"代码解读
你不需要完全看懂每个细节,但有几个关键点要理解:
1. 为什么要用openai库调智谱的 API?
因为智谱的 API 兼容OpenAI的接口格式。这意味着你只要会调OpenAI,就会调智谱、DeepSeek、通义千问。一套库通吃四家,切换只需要改base_url和api_key。
2.PROVIDERS字典怎么用?
四家供应商的配置写在一个字典里。初始化时传provider="glm"就用智谱,传provider="deepseek"就用DeepSeek。模型名、API地址、环境变量名都自动对应。
3.chat()和chat_json()有什么区别?
chat():普通对话,AI 想说什么就说什么chat_json():强制 AI 返回 JSON 格式,后续办公自动化大量用到(Day 05 会详细讲)
4. 重试机制为什么重要?
API 调用偶尔会失败(网络波动、服务端超时等)。retry=2意味着失败后自动重试两次,不用你手动重新运行脚本。这在批量处理文档时特别重要——Day 06 处理 200 张发票时,你不会想因为第 87 张超时就全部重来。
四、Hello LLM:你的第一行 AI 代码
环境搭好了,封装写好了,现在跑第一个测试。
hello_llm.py
""" hello_llm.py - 第一次调用大模型 验证环境是否搭建成功 """importsys,os sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(__file__),'../../')))fromllm_clientimportLLMClientdefmain():# 第 1 步:初始化客户端(默认用 GLM-4.7-Flash)client=LLMClient(provider="glm")print(f"✅ 客户端就绪:{client}")print()# 第 2 步:最简单的对话print("="*50)print("测试 1:简单问候")print("="*50)answer=client.chat("你好!请用一句话介绍你自己")print(f"AI:{answer}")print()# 第 3 步:带系统提示词的对话print("="*50)print("测试 2:角色设定")print("="*50)answer=client.chat(message="我们公司明天要开周会,帮我写三句话的开场白",system_prompt="你是一个简洁干练的职场助手,说话不超过三句,不废话。",temperature=0.3,# 低温度=更稳定)print(f"AI:{answer}")print()# 第 4 步:让 AI 返回结构化数据(Day 05 预告)print("="*50)print("测试 3:JSON 结构化输出")print("="*50)json_answer=client.chat_json(message='请提取这段信息:张三,手机号13800138000,邮箱zhangsan@example.com,''输出为JSON,包含name、phone、email字段',system_prompt="你是一个信息提取助手,只输出JSON,不输出其他内容。",)print(f"AI:{json_answer}")print()print("🎉 全部测试通过!环境搭建成功!")if__name__=="__main__":main()路径处理说明
为什么需要这两行?
因为
llm_client.py在项目根目录,而hello_llm.py在code/day02/目录下。Python 默认只会在当前目录找模块,所以需要告诉它"去根目录找"。importsys,os sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(__file__),'../../')))
../../是什么意思?就像在文件管理器里点两次"返回上级":
code/day02/hello_llm.py ↓ (../) 返回上级 code/ ↓ (../) 再返回上级 ai-office/ ← 根目录,找到 llm_client.py 了!后续每篇都要加吗?
是的。只要代码文件在
code/子目录下,开头都要加这两行。复制粘贴即可,不用记。
运行结果(预期输出)
✅ 客户端就绪:LLMClient(provider='glm', model='glm-4.7-flash') ================================================== 测试 1:简单问候 ================================================== AI:你好!我是 GLM-4.7-Flash,一个由智谱AI开发的大语言模型,擅长中文理解和生成。 ================================================== 测试 2:角色设定 ================================================== AI:各位同事好,本周工作汇报现在开始。上周我们完成了三项核心任务的推进,今天重点同步进展和本周计划。请大家先看会议议程。 ================================================== 测试 3:JSON 结构化输出 ================================================== AI:{"name": "张三", "phone": "13800138000", "email": "zhangsan@example.com"} 🎉 全部测试通过!环境搭建成功!注意:AI 的实际回复内容每次可能略有不同(因为
temperature参数的存在),但格式和结构应该一致。测试 3 的 JSON 字段名应该完全匹配。
如果报错了怎么办?
| 报错 | 原因 | 解决 |
|---|---|---|
ModuleNotFoundError: No module named 'openai' | openai库没装 | pip install openai |
环境变量 GLM_API_KEY 未设置 | Key没配好 | 回到第三步创建.env文件 |
AuthenticationError | Key不对或已过期 | 去智谱控制台重新生成Key |
RateLimitError | 超出并发限制 | 等几秒再跑,免费版限 30 并发 |
ConnectionError | 网络不通 | 检查网络,公司内网可能需要代理 |
五、项目文件结构
建议按这个结构组织代码:
ai-office/ ├── llm_client.py ← 通用封装(本篇创建,后续所有篇复用) ├── hello_llm.py ← 测试脚本(本篇创建) ├── requirements.txt ← 依赖清单 ├── .env ← 你的 API Key(不要传到 GitHub!) ├── .env.example ← 模板文件(可以传,告诉别人要填什么) ├── .gitignore ← 排除 .env 等敏感文件 ├── code/ ← 后续每篇的代码放这里 │ ├── day03/ │ ├── day06/ │ └── ... └── data/ ← 测试数据 └── ...requirements.txt
openai>=1.12.0 python-dotenv>=1.0.0
python-dotenv是可选的——如果你不想用系统环境变量,可以创建.env文件存放Key,用dotenv加载。但别把.env文件传到GitHub!
📊 本篇成本透明栏
| 项目 | 数值 |
|---|---|
| API 调用次数 | 3 次(测试 1-3) |
| 消耗 Token | 约 2,000 tokens |
| 成本 | ¥0(GLM-4.7-Flash永久免费) |
| 免费额度是否够 | ✅ 够用(新用户送 2000 万Token) |
| 商用估算 | ¥0 |
练手改造题
改造 1(基础):修改hello_llm.py,让 AI 用五种不同风格回答同一个问题"今天午饭吃什么"。
提示:调整system_prompt和temperature参数。
改造 2(进阶):写一个translate()函数,调用client.chat()实现中英互译。输入中文返回英文,输入英文返回中文。
提示:可以让 AI 先判断输入语言,再翻译。或者直接在system_prompt里设定规则。
下期预告
Day 03 · Prompt 工程 5 大心法
环境搭好了,Key也拿到了。但如果你只会说"帮我写个周报"——AI 给你的大概率是废话。
Day 03 讲透 5 个Prompt心法,每个配一个办公场景对比实验。写完你就能让 AI 从"大概能用"变成"精准好用"。
📚 资源与工具(文末合规集中)
- 智谱开放平台(注册 + API Key):https://open.bigmodel.cn/
- 智谱模型文档:https://docs.bigmodel.cn/
- DeepSeek 开放平台:https://platform.deepseek.com/
- 通义千问(Qwen):https://dashscope.aliyun.com/
- Python 官网下载:https://www.python.org/downloads/
- 本专栏配套代码:CSDN 下载区(每篇更新)
🍃 作者的话
梅雅达编程笔记,专注 Python + AI 办公自动化实战教程。
这套llm_client.py不是教学演示代码——它是我们在实际开发中真正在用的封装。后续 18 篇每篇都会用到它,所以今天这篇请务必跑通。
跑通了的读者,评论区扣个 1,让我知道你准备好了 🍃
上一篇:Day 01 · 为什么 2026 年办公自动化必须"AI 化"
下一篇:Day 03 · Prompt 工程 5 大心法
专栏订阅:「AI 时代的 Python 办公自动化」
姊妹专栏:
- Python 零基础编程笔记
- 编程启蒙-Scratch转Python
