第02章:环境搭建——Python、API密钥与你的第一个AI调用
第02章:环境搭建——Python、API密钥与你的第一个AI调用
“第一个AI调用的感觉,和第一次成功发出HTTP请求一样——你突然明白,这东西没那么神秘。”
一、为什么用Python
你可能已经会Java、JavaScript、Go或其他语言。为什么要用Python来学AI应用开发?
现实原因,不是意识形态:
- AI和ML生态系统几乎全部以Python为第一支持语言(OpenAI、Anthropic、LangChain的SDK最成熟的都是Python版)
- AI相关的库(NumPy、Pandas、PyTorch、LangChain)都是为Python设计的
- 招聘AI工程师的公司,绝大多数要求Python
好消息: 如果你已经会至少一门语言,Python的学习曲线非常低——大多数有编程经验的人1-2天就能写出可用的Python代码。
本章末尾提供一个"会其他语言者的Python速成",专门针对你已经知道的概念,映射到Python语法。
二、Python环境搭建
方法A(推荐):使用uv(现代Python包管理器)
uv是2024年兴起的Python包管理工具,比pip快很多,也解决了很多虚拟环境的问题。
# 安装uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows用户:
# powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# 创建新项目
uv init ai-book-demo
cd ai-book-demo
# 创建虚拟环境并安装依赖
uv add openai anthropic python-dotenv
方法B(传统):使用pip + virtualenv
# 检查Python版本(需要3.10+)
python --version
# 创建虚拟环境
python -m venv .venv
# 激活虚拟环境
# Mac/Linux:
source .venv/bin/activate
# Windows:
.venv\Scripts\activate
# 安装依赖
pip install openai anthropic python-dotenv
验证安装
# test_setup.py
import openai
import anthropic
print("安装成功!")
print(f"OpenAI版本: {openai.__version__}")
print(f"Anthropic版本: {anthropic.__version__}")
三、获取API密钥
OpenAI API密钥
- 访问 platform.openai.com
- 注册/登录账号
- 点击右上角头像 → “API Keys”
- 点击"Create new secret key"
- 复制密钥(只显示一次,要立刻保存)
充值: OpenAI API是按使用量付费的,建议先充值$5-10用于学习。
Anthropic API密钥(Claude)
- 访问 console.anthropic.com
- 注册账号,完成身份验证
- 点击"API Keys"→“Create Key”
- 复制密钥
选择建议: 本书同时使用OpenAI和Anthropic的示例。如果只能选一个,建议先用OpenAI(文档最完善,社区最大),Claude作为第二选择。
国内用户的选项
如果你在中国大陆,OpenAI需要VPN,可以考虑:
- 通义千问(阿里): dashscope.aliyuncs.com,兼容OpenAI API格式
- 文心一言(百度): API文档完善
- 讯飞星火
- DeepSeek: API格式完全兼容OpenAI,是目前性价比最高的选择之一
本书的示例代码主要使用OpenAI SDK,但会注明如何切换到国内模型(通常只需要改两行代码)。
四、安全管理API密钥
永远不要把API密钥硬编码在代码里,也不要提交到Git仓库。API密钥被滥用可能导致巨额费用。
正确方式:使用.env文件
# 创建.env文件(确保.gitignore里有.env)
# .env
OPENAI_API_KEY=sk-your-key-here
ANTHROPIC_API_KEY=sk-ant-your-key-here
# .gitignore(确保.env不被提交)
.env
.venv/
__pycache__/
# 在代码里加载.env
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件
api_key = os.getenv("OPENAI_API_KEY")
五、你的第一个AI调用
现在,让我们发出第一个API调用:
# first_ai_call.py
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 最简单的调用
response = client.chat.completions.create(
model="gpt-4o-mini", # 便宜的模型,用于测试
messages=[
{
"role": "user",
"content": "用一句话解释什么是向量数据库"
}
]
)
# 提取回复文本
print(response.choices[0].message.content)
运行这段代码,你会看到类似这样的输出:
向量数据库是一种专门存储和高效检索高维向量数据的数据库,通常用于AI应用中的语义搜索。
恭喜!你刚刚完成了第一个AI调用。
六、理解响应结构
完整的响应对象包含更多信息:
# 查看完整响应结构
import json
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "你好"}]
)
# 打印完整响应
print(response.model_dump_json(indent=2))
输出(简化):
{
"id": "chatcmpl-xxx",
"choices": [{
"message": {
"role": "assistant",
"content": "你好!有什么我可以帮助你的?"
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 10,
"completion_tokens": 15,
"total_tokens": 25
},
"model": "gpt-4o-mini"
}
关键字段:
choices[0].message.content:AI的回复文本usage.total_tokens:本次调用消耗的Token数(计费依据)finish_reason:回复结束的原因(stop=正常结束,length=超过最大长度被截断)
七、流式输出(Streaming)
在真实应用中,等待AI生成完整回复再显示往往体验很差。流式输出让回复逐字显示:
# streaming_demo.py
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 流式调用
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "写一首关于程序员的短诗"}],
stream=True # 开启流式输出
)
# 逐个输出文字
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
print() # 最后换行
八、使用Claude(Anthropic SDK)
如果你想使用Claude:
# claude_demo.py
import anthropic
from dotenv import load_dotenv
import os
load_dotenv()
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[
{"role": "user", "content": "用Python写一个斐波那契数列函数"}
]
)
print(message.content[0].text)
OpenAI vs Anthropic SDK的主要区别:
- 方法名:
client.chat.completions.create()vsclient.messages.create() - 参数:OpenAI用
messages,Anthropic也用messages,但格式略有差异 - 响应:结构略有不同,但逻辑相同
九、切换到国内大模型(DeepSeek示例)
DeepSeek完全兼容OpenAI API格式,只需要改base_url:
# deepseek_demo.py
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
# 唯一的变化:base_url指向DeepSeek,使用DeepSeek的API密钥
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
response = client.chat.completions.create(
model="deepseek-chat", # DeepSeek的模型名
messages=[{"role": "user", "content": "你好!"}]
)
print(response.choices[0].message.content)
这种兼容性设计让你可以非常低成本地切换模型提供商。
本章小结
- Python是AI应用开发的事实标准语言,有其他语言基础的程序员学习曲线很低。
- 使用
uv或pip+virtualenv管理Python环境,用.env文件安全存储API密钥。 - LLM API调用的核心结构:传入
messages数组(包含role和content),获得模型回复。 - 流式输出(
stream=True)是真实应用中的标配,让AI回复即时显示而不是等待完成。 - 不同的LLM提供商(OpenAI/Anthropic/DeepSeek)API结构相似,切换成本很低。
核心行动建议: 今天完成本章所有代码示例的运行,特别是第一个AI调用。如果遇到错误,检查:API密钥是否正确、.env文件是否在正确位置、依赖包是否安装完成。
附录:会其他语言者的Python速成
如果你已经会Java或JavaScript,以下是关键对应关系:
| 概念 | Java | JavaScript | Python |
|---|---|---|---|
| 变量声明 | String x = "hello" |
let x = "hello" |
x = "hello" |
| 打印 | System.out.println(x) |
console.log(x) |
print(x) |
| 列表 | List<String> list = new ArrayList<>() |
const arr = [] |
arr = [] |
| 字典/对象 | Map<String, Object> |
const obj = {} |
d = {} |
| 函数定义 | public String func(String arg) |
function func(arg) |
def func(arg): |
| 循环 | for (int i : list) |
for (const i of arr) |
for i in arr: |
| 条件 | if (x == 1) |
if (x === 1) |
if x == 1: |
| 类 | public class Foo |
class Foo |
class Foo: |
Python最重要的特点:
- 用缩进(不是大括号)表示代码块
- 无需类型声明(但可以用类型提示)
- 列表推导式:
[x*2 for x in range(10)] - f-string:
f"Hello, {name}!"
本章提示词模板
代码调试助手
我在运行以下Python代码时遇到了错误:
代码:
[粘贴代码]
错误信息:
[粘贴错误信息]
请帮我:
1. 解释错误原因
2. 提供修复方案
3. 说明为什么会出现这个错误(帮助我理解,而不只是复制粘贴修复)
→ 继续阅读:第03章——LLM API全攻略:OpenAI、Anthropic、国内大模型怎么选