第02章:环境搭建——Python、API密钥与你的第一个AI调用

第02章:环境搭建——Python、API密钥与你的第一个AI调用

“第一个AI调用的感觉,和第一次成功发出HTTP请求一样——你突然明白,这东西没那么神秘。”


一、为什么用Python

你可能已经会Java、JavaScript、Go或其他语言。为什么要用Python来学AI应用开发?

现实原因,不是意识形态:

  1. AI和ML生态系统几乎全部以Python为第一支持语言(OpenAI、Anthropic、LangChain的SDK最成熟的都是Python版)
  2. AI相关的库(NumPy、Pandas、PyTorch、LangChain)都是为Python设计的
  3. 招聘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密钥

  1. 访问 platform.openai.com
  2. 注册/登录账号
  3. 点击右上角头像 → “API Keys”
  4. 点击"Create new secret key"
  5. 复制密钥(只显示一次,要立刻保存)

充值: OpenAI API是按使用量付费的,建议先充值$5-10用于学习。

Anthropic API密钥(Claude)

  1. 访问 console.anthropic.com
  2. 注册账号,完成身份验证
  3. 点击"API Keys"→“Create Key”
  4. 复制密钥

选择建议: 本书同时使用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() vs client.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)

这种兼容性设计让你可以非常低成本地切换模型提供商。


本章小结

  1. Python是AI应用开发的事实标准语言,有其他语言基础的程序员学习曲线很低。
  2. 使用uvpip+virtualenv管理Python环境,用.env文件安全存储API密钥。
  3. LLM API调用的核心结构:传入messages数组(包含role和content),获得模型回复。
  4. 流式输出(stream=True)是真实应用中的标配,让AI回复即时显示而不是等待完成。
  5. 不同的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、国内大模型怎么选