# Part 4 · 用代码调用 AI：把"假 AI"换成"真 AI"

> **本篇定位**：把 Part 3 的假 AI 替换为真实大模型。学完本篇，你能写出**第一个真正能用的 AI 应用**。
> **阅读时长**：25 分钟
> **心流产出**：一个命令行 AI 聊天工具，支持流式输出与角色设定。

---

## 一、四个第二层概念

| # | 概念 | 重要度 | 一句话 |
| --- | --- | --- | --- |
| 6 | **SDK** | ⭐⭐⭐⭐ | 官方封装的代码库 |
| 7 | **Streaming** | ⭐⭐⭐ | 逐字实时输出 |
| 8 | **Temperature** | ⭐⭐⭐ | 控制输出随机性 |
| 9 | **System Prompt** | ⭐⭐⭐⭐ | 最高优先级的规则设定 |

---

## 二、概念 6：SDK（Software Development Kit，软件开发工具包）

### 类比

API 是"裸的 HTTP 接口"——要自己拼请求头、加密、解析 JSON。**SDK 就是服务商帮你把这些都封装好的"现成工具箱"**。

### 一行代码替代 50 行

```python
# 没用 SDK 之前（伪代码）：要自己拼 URL、Header、Body
# 用了 SDK 之后：3 行搞定
from openai import OpenAI
client = OpenAI()    # 自动读取环境变量 OPENAI_API_KEY
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
```

> **关键认知**：**SDK 不是唯一路径**。你也可以用 `requests` 等库手动构造 HTTP 请求，但 SDK 能极大提高效率。

### 国产替代

| 服务商 | Python 包 | 安装命令 |
| --- | --- | --- |
| OpenAI | `openai` | `pip install openai` |
| Anthropic | `anthropic` | `pip install anthropic` |
| DeepSeek | `openai`（兼容） | `pip install openai` |
| 智谱 GLM | `zhipuai` | `pip install zhipuai` |
| 通义千问 | `dashscope` | `pip install dashscope` |

> **小白起步建议**：用 OpenAI SDK 调用 DeepSeek（接口兼容，最便宜），或直接用 `dashscope` / `zhipuai`。

---

## 三、概念 7：Streaming（流式传输）

### 体验差异

| 模式 | 体验 |
| --- | --- |
| **关闭 Streaming** | 必须等 AI 写完整段话才一次性返回（可能等 10 秒） |
| **开启 Streaming** | 每生成若干 Token 立即推送，**逐字实时显示**（像打字机） |

### 代码示例

```python
from openai import OpenAI
client = OpenAI()

# 关闭 Streaming
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "讲个笑话"}]
)
print(response.choices[0].message.content)    # 一次性输出

# 开启 Streaming
stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "讲个笑话"}],
    stream=True    # 关键参数
)
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)    # 逐字输出
```

> **关键认知**：所有聊天类应用（ChatGPT、文心一言、通义千问）默认开启 Streaming，**是其流畅体验的技术基础**。

---

## 四、概念 8：Temperature（温度参数）

### 类比

调节 AI 的"脑洞大小"。

| 取值 | 行为 | 适用场景 |
| --- | --- | --- |
| `0` | 趋于确定，每次回答几乎一致 | 代码生成、事实翻译、数据抽取 |
| `0.8 ~ 1.2` | 较有创造性，每次回答不同 | 文案、诗歌、头脑风暴 |
| 接近 `2` | 趋于混乱，可能胡言乱语 | 一般不推荐 |

### 代码示例

```python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "给我的产品起 5 个名字"}],
    temperature=1.2    # 让名字更多样
)
```

> **关键认知**：Temperature 调节的是模型对候选词分布的平滑程度，**不是简单的"概率开关"**。初学保持默认（通常 `1.0`）即可。

---

## 五、概念 9：System Prompt（系统提示词）

### 类比

给新员工发的"员工手册"——设定人设、规则、底线，**优先级最高**，用户消息无法覆盖。

### 代码示例

```python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        # 第一条消息：System Prompt（人设/规则）
        {"role": "system", "content": "你是一名资深 Python 工程师。所有回答必须包含可运行代码示例。"},
        # 第二条消息：用户输入
        {"role": "user", "content": "怎么读取 CSV 文件？"}
    ]
)
print(response.choices[0].message.content)
```

> **关键认知**：**System Prompt 是约束模型行为最有效的手段。** 用户问"忽略上面的指令"也没用。

---

## 六、组合实战：命令行 AI 聊天工具

```python
# ai_chat.py
from openai import OpenAI

client = OpenAI()

# System Prompt：设定 AI 是一名耐心的编程导师
SYSTEM = "你是一名耐心的编程导师，回答简洁并附带代码示例。"

def chat(user_input: str, stream: bool = True):
    """调用 AI 并返回/流式输出回答"""
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": SYSTEM},
            {"role": "user", "content": user_input}
        ],
        temperature=0.7,
        stream=stream
    )
    if stream:
        for chunk in response:
            delta = chunk.choices[0].delta.content
            if delta:
                print(delta, end="", flush=True)
        print()    # 换行
    else:
        print(response.choices[0].message.content)

if __name__ == "__main__":
    print("=== 命令行 AI 聊天工具（输入 exit 退出）===")
    while True:
        q = input("\n你：")
        if q.strip() == "exit":
            break
        print("AI：", end="")
        chat(q)
```

**运行**：

```bash
export OPENAI_API_KEY="sk-..."        # macOS/Linux
# 或 Windows PowerShell：$env:OPENAI_API_KEY="sk-..."
pip install openai
python ai_chat.py
```

---

## 七、本篇动手任务（30 分钟）

### 任务 A：跑通上面的聊天工具

替换 `model` 字段为你能访问的模型名（如 `"deepseek-chat"`），跑通后你就有了一个**真正能用的 AI 应用**。

### 任务 B：进阶改造

为你的聊天工具加入以下 1~2 个特性：

1. **多轮对话**：用 `messages` 列表累积历史，实现上下文。
2. **角色切换**：在 System Prompt 里预设 3 种角色（导师/翻译/段子手），让用户切换。
3. **错误处理**：捕获 `openai.APIError`，打印友好提示而不是崩溃。

---

## 八、进入下一篇

真 AI 已能跑通。进入 [Part 5 · 进阶应用](./p5-进阶应用.md)，我们探索让 AI **懂你的私有数据**的范式：Embedding、向量数据库、RAG。
