调用 LLM API:用 Python 写第一个 AI 程序
这是什么:LLM API 调用 = 让 Python 程序直接找大模型要答案,把 AI 变成代码里的一行请求;API(应用程序接口)就是程序跟模型说话的那扇门。
为什么用:前两章都在"纸上谈兵":懂了接龙原理,也写好了漂亮提示词。现在动真格——让 Python 程序直接调用大模型,把 AI 能力接进自己的程序,从此不用人肉复制粘贴。
如何用:先把 API Key 存进环境变量当门票,再用 OpenAI 官方 SDK 写几行代码,问出第一个问题。
API 和 Key:门票思维
在网页聊天框打字,是"人工手动接龙";API(应用程序接口) 则是给程序开的窗口:发一段文字过去,模型把回答传回来。
调用 API 要一把钥匙——API Key,就像游乐园门票:证明你是谁、该找谁收费。两条纪律:
- Key 别写进代码,更别发到群里、传到 GitHub——用环境变量存
- 各家服务的 Key 不通用,但接口写法可以通用(下面马上讲)
环境准备
需要 Python 3.15(3.12+ 均可),安装官方 SDK(装最新版):
pip install --upgrade openai
把 Key 存进环境变量(PowerShell,本次窗口内生效):
$env:LLM_API_KEY = "你的key"
Linux/macOS:
export LLM_API_KEY="你的key"
第一个程序
下面用的是 OpenAI 官方 SDK 的兼容写法:只要服务兼容这套接口,改一下 base_url 就能换到任意一家,代码几乎不用动。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["LLM_API_KEY"], # key 从环境变量读,不写死
base_url=os.environ.get("LLM_BASE_URL", # 兼容服务地址,可整体替换
"https://api.openai.com/v1"),
)
resp = client.chat.completions.create(
model="gpt-4o-mini", # 换成你所选服务支持的模型名
messages=[
{"role": "user", "content": "用一句话介绍什么是大语言模型"},
],
)
print(resp.choices[0].message.content)
你需要自备 API key 才能实际运行,你会看到(示意):
大语言模型是一种通过海量文本训练、能理解和生成人类语言并据此回答问题的 AI 程序。
| 代码 | 作用 |
|---|---|
os.environ["LLM_API_KEY"] |
从环境变量读 key,不写死在代码里 |
base_url=... |
换成任意兼容服务的地址 |
messages |
对话列表,role 标明这句话是谁说的 |
choices[0].message.content |
取出回答的正文文本 |
记忆口诀:钥匙进环境,地址随服务;消息排成队,答案在 content。
换到国内模型平台
只需改两处:Key 和 base_url。以某兼容平台为例:
client = OpenAI(
api_key=os.environ["LLM_API_KEY"],
base_url="https://api.xxx.com/v1", # 换成该平台的兼容地址
)
model 参数换成该平台支持的模型名(如 deepseek-chat、qwen-plus 等),其余代码不用动。
常见问题:为什么不用本地部署大模型
"本地部署"的意思是:把模型权重下载到自己的电脑或服务器上,用 Ollama、llama.cpp、vLLM 这类推理框架自己跑。它的优点很实在——数据不出内网、离线可用、没有按量计费。
那为什么这章讲的是调 API?因为对刚开始学的你,本地部署要跨过的门槛比学编程还多。
五道门槛
| 维度 | 本地部署 | 调 API |
|---|---|---|
| 硬件 | 7B 模型光权重就吃掉十几 GB 显存 | 一台普通笔记本即可 |
| 钱 | 能跑大模型的显卡是万元级;云 GPU 按小时计 | 按 token 计费,用多少付多少 |
| 环境 | CUDA、驱动、PyTorch、推理框架版本互相打架 | pip install openai 一行搞定 |
| 能力 | 开源模型在复杂推理、长上下文、工具调用上,与顶级闭源模型仍有差距 | 直接用当前最强的那批模型 |
| 迭代 | 新模型发布 = 自己换权重、重新压测、重新部署 | 服务端升级,你的代码一行不改 |
显存这笔账要算清楚
模型的显存占用,先按参数量估:每个参数 FP16 占 2 字节,INT8 占 1 字节,INT4 占 0.5 字节。
7B 参数 × 2 字节(FP16) ≈ 14 GB ← 光权重
7B 参数 × 1 字节(INT8) ≈ 7 GB
7B 参数 × 0.5 字节(INT4) ≈ 3.5 GB
这还只是权重。真正跑起来还要给 KV cache(对话越长占得越多)、推理中间量留位置。8GB 显存的卡跑 7B 会很吃力,24GB 才算宽裕——而 24GB 显存的消费级显卡是万元级起步。
对比之下:调 API 的成本是按 token 计的,轻度使用一个月几十块足够;本地部署是一次性掏硬件钱,外加电费和运维。
版本与环境的坑也不小
| 工具 | 作用 | Python 要求 |
|---|---|---|
| Ollama | 最省事的本地跑模型 | Python 客户端 0.6.3 要求 ≥3.8(但模型实际跑在独立的 Ollama 服务进程里) |
| llama.cpp | CPU 也能跑的轻量方案 | llama-cpp-python 0.3.36 要求 ≥3.8 |
| vLLM | 高并发服务化推理 | vLLM 0.32.0 要求 ≥3.11 且 <3.15 |
注意最后一行:全站基线是 Python 3.15,而 vLLM 还不支持 3.15——真要本地部署,你得另外建一个降版本的虚拟环境,再处理一整套 CUDA 依赖。
那什么时候真该本地部署
别把话说死。以下场景,本地部署(或私有化部署)是对的:
- 硬性合规:数据不能出内网(金融、医疗、政务)
- 调用量极大:每天几十万次调用,自建的单位成本更低
- 必须离线:内网环境、涉密场景
- 要做微调:LoRA / SFT 训练必须在本地跑(注意:训练和推理可以分开,训练本地、推理走 API)
- 延迟要自己掌控:不受服务商的排队和限流影响
最实用的折中
平时开发用 API,生产按需自建。 常见的中间态还有:
- 本地小模型做草稿或脱敏(Ollama 跑个量化版 7B/8B),再上云做最终处理
- 敏感数据先在本地过一遍,清洗完再调云端模型
- 团队内网统一走一个私有网关,后端还是各家的 API
一句话结论:学习阶段 API 是最优解;等合规或成本逼到墙角,再上本地部署。
常见报错与修复
| 报错 | 原因 | 修复 |
|---|---|---|
KeyError: 'LLM_API_KEY' |
没设环境变量 | $env:LLM_API_KEY = "你的key" |
401 Unauthorized |
Key 错误或过期 | 检查 Key 是否正确、是否有余额 |
404 Not Found |
模型名或 base_url 错误 | 核对模型名和地址 |
429 Rate limit |
调用太频繁 | 稍候再试,或降低并发 |
⚠️ 新手翻车现场
翻车一:把 Key 硬编码进代码
# 错误:Key 直接写在代码里
client = OpenAI(api_key="sk-1234567890abcdef")
问题:一旦代码上传 GitHub,Key 泄露,别人可以白嫖你的额度甚至产生费用。
修正:始终用 os.environ["LLM_API_KEY"],Key 存在系统环境变量或 .env 文件里(.env 加入 .gitignore)。
翻车二:messages 只放用户消息,没有 system
# 没问题,但没有人设,模型语气可能飘忽
messages=[{"role": "user", "content": "帮我写个自我介绍"}]
修正:在最前面加一条 system 消息定人设:
messages=[
{"role": "system", "content": "你是一位友好的助手,回答简洁明了。"},
{"role": "user", "content": "帮我写个自我介绍"},
]
动手改
- 把问题换成"给我讲个程序员冷笑话",连跑 3 次,观察每次结果是否一样
- 在
messages最前面加一条{"role": "system", "content": "你说话像海盗"},感受人设 - 用
try/except KeyError捕获"忘设环境变量"的情况,打印一句友好提示 - 查一下你用的服务按 token 怎么计费,算算每天 100 次调用一个月多少钱,再跟"买张 24G 显卡"比一比
记忆口诀:钥匙进环境,地址随服务;消息排成队,答案在 content。
📝 本章小结
- API 是程序调大模型的窗口,API Key 是门票,别写进代码
- 用
openaiSDK,改base_url可兼容任意服务 messages是对话列表,system定人设,user提问,assistant回答- 为什么用 API 而不是本地部署:硬件、成本、环境、能力、迭代五道门槛 但合规要求、巨大调用量、必须离线、需要微调时,本地部署才是正解
- 常见报错:Key 缺失(401)、模型/地址错(404)、调用太频繁(429)
- 记忆口诀:钥匙进环境,地址随服务;消息排成队,答案在 content。
下一章:结构化输出,让模型稳定输出 JSON 🐸