# 第一次让程序调用 DeepSeek：从网页聊天到自动发问

> 上一集，我们亲手和 AI 聊了一轮；这一集只换一个角色：让程序替你发送问题。

![本集路线：准备调用门票、运行最小程序、看到终端回复](images/01-guide.png)<!-- display-width:500 -->

**这一集，只升级一件事**

- 成果：让自己的程序第一次向 DeepSeek 发问并收到回复。
- 用时：基础工具已装好约 10～15 分钟；第一次安装工具需要额外时间。
- 成功标志：终端里出现 DeepSeek 返回的文字。

做过第 00 集，可以把下面的网页步骤当作一分钟热身；第一次看到本系列也没关系，这篇仍然保留了独立跑通所需的最短路线。

开始前只需准备 Windows 电脑、稳定网络和 DeepSeek 账号。还没有 Python 或 VS Code 也没关系，第 2 节会带你一次检查完。

## 1. 先在网页里问同一句话（用过可跳过）

做过第 00 集，这一步会很熟悉；第一次来的读者，用一分钟完成热身即可。

打开 [DeepSeek 网页端](https://chat.deepseek.com/)，登录后进入一个新对话。

![DeepSeek 首页同时提供网页聊天和开放平台入口（页面样式可能变化）](images/02-deepseek-home.png)<!-- display-width:580 -->

输入：

```text
你好，写首诗
```

发送后，你会在网页里看到一段回复。

![先记住网页端的输入和回复，稍后用 Python 做对照](images/03-chat-example.png)<!-- display-width:580 -->

> 网页端是“你问，AI 回答”；接下来只把“你”换成程序。

你的回答不必和截图一模一样。大模型不是复读机，只要它围绕问题正常回复即可。

## 2. 开始前，只确认四件事

接下来只借三件工具完成实验：VS Code 放代码，PowerShell 输入命令，Python 运行代码。它们都不是今天的主角；已经装好的不要重装。

本集不要求安装 VS Code 的 Python 扩展。公司电脑如果限制安装软件，请先遵守所在组织的软件准入流程，不要绕过安全策略。

### 2.1 缺什么，只补什么

- **没有 VS Code**：使用 [VS Code 官方 Windows 安装说明](https://code.visualstudio.com/docs/setup/windows)（官网域名：`code.visualstudio.com`），下载 User Setup 并按默认选项安装。
- **没有 Python**：使用 [Python 官方下载页](https://www.python.org/downloads/)和 [Python 官方 Windows 指南](https://docs.python.org/3/using/windows.html)（官网域名：`python.org`），按当前官方方式安装。

安装完成后，关闭并重新打开 VS Code。已经装好两者的读者直接进入下一步。

### 2.2 一次验收三个工具

按 `Win + E` 打开文件资源管理器，在桌面创建一个空文件夹：

```text
deepseek-demo
```

打开 VS Code，点击“文件 → 打开文件夹”，选择 `deepseek-demo`。如果 VS Code 询问是否信任此文件夹，只在确认它是刚创建的空目录时选择信任。

在 VS Code 中点击“终端 → 新建终端”。底部出现的命令窗口就是终端；本篇使用 Windows 自带的 **PowerShell**，提示符通常以 `PS` 开头。如果不是，点击终端右上角 `+` 旁的下拉箭头，选择“默认配置文件 → PowerShell”，再新建终端。

依次执行：

```powershell
Get-Location
python --version
```

**看到这个就算过关：** 第一条返回的路径以 `deepseek-demo` 结尾，第二条显示 `Python 3.x.x`。代码框上方的 `powershell` 是标签，终端里的 `PS C:\...>` 是提示符，都不用复制。第一次通过 Python Install Manager 启动时，系统可能还会完成一次运行环境安装。

### 2.3 安装本集唯一的新工具

下面安装 SDK，也就是别人整理好的代码工具箱：

```powershell
python -m pip install openai
python -c "from openai import OpenAI; print('openai ready')"
```

**看到这个就算过关：** 最后一条命令打印 `openai ready`。工具名虽然叫 `openai`，但我们没有换模型；这里只是借它兼容的调用方式向 DeepSeek 发请求。

如果 `python` 找不到或打开了应用商店，请先按上面的 Python 官方 Windows 指南排错，再重新打开 VS Code；此时不要继续排查 API Key。

### 2.4 确认 DeepSeek 账户可以调用

进入 [DeepSeek 开放平台](https://platform.deepseek.com/)（官网域名：`platform.deepseek.com`），确认账户里有少量可用余额。余额可能来自赠送，也可能来自充值；已有可用余额时，不需要为了跟教程额外充值。

![裁切后的用量页：只需确认账户里有可用余额](images/04-api-platform.png)<!-- display-width:520 -->

截图展示的是其中一种余额来源；你的页面数字不必相同。历史用量与本次实验无关。

本次实验会产生少量费用。具体价格可能变化，以
[DeepSeek 模型与价格页面](https://api-docs.deepseek.com/quick_start/pricing) 为准。

> 准备完成：文件夹、终端、Python、代码工具箱和 DeepSeek 账户都通过了最小检查。

电脑和账户都就位了。接下来，给程序一张可以进入 DeepSeek 的“门票”。

## 3. 创建一枚 API Key

接下来要让程序获得调用资格。

- **API**：程序之间传话的窗口。
- **API Key**：打开这个窗口的门票，也和账户计费有关。

进入开放平台的 API keys 页面，为本次实验创建一枚独立 Key。

![裁切后的创建弹窗：为本次实验创建一枚独立 API Key](images/05-create-key.png)<!-- display-width:520 -->

在弹窗里填写一个容易辨认的名称并点击“创建”。背景里的历史 Key 列表不需要跟着操作。

完整 Key 通常只展示一次，请先保存到安全的位置。看到新 Key，就说明这一步完成了。

**不要把真实 Key 放进代码、博客截图、Git 仓库或可以转发的聊天记录。** 如果一枚 Key 曾经公开，最稳妥的做法是立即删除并重新创建，而不是只给截图打码。

## 4. 把 Key 交给当前终端

我们把 Key 暂时放进“环境变量”——可以把它理解成当前终端专用的小储物格。代码只读取这个储物格，不把 Key 写进文件。

下面的命令适用于 PowerShell。粘贴后，Key 会以星号显示，不会出现在命令历史里：

```powershell
$env:DEEPSEEK_API_KEY = [System.Net.NetworkCredential]::new(
    "",
    (Read-Host "请粘贴 DeepSeek API Key" -AsSecureString)
).Password
```

按回车后，做一次不会泄露 Key 的自检：

```powershell
python -c "import os; print(bool(os.getenv('DEEPSEEK_API_KEY')))"
```

看到 `True`，说明 Python 已经能读取 Key。

如果看到 `False`，请在同一个终端重新设置环境变量。关闭这个终端后，临时设置会失效；不要用命令打印 Key 本身。

## 5. 创建最小 Python 程序

回到 VS Code 左侧资源管理器，在刚才打开的 `deepseek-demo` 中新建 `deepseek.py`。

复制下面的代码。第一次只需要认出“问题写在哪里”和“回复从哪里打印”，其余内容先照抄。`messages` 里的文字会发送到 DeepSeek 云端，不要放公司资料、账号凭证或个人隐私。

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com",
)

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "user", "content": "你好，写首诗"},
    ],
)

print(response.choices[0].message.content)
```

`deepseek-v4-pro` 是本次请求使用的模型名称。模型名称可能更新，今天先照着写，不需要研究不同型号。

按 `Ctrl + S` 保存；文件标签上的小圆点消失，就代表已经保存。然后在底部 PowerShell 中执行：

```powershell
Get-ChildItem .\deepseek.py
```

看到文件名，说明代码确实保存在当前实验文件夹。离成功只差一次运行。

## 6. 运行，再亲手改一句

### 6.1 收到第一条回复

确认仍在刚才设置 Key 的底部 PowerShell 中执行，不要把这条命令粘贴进 `deepseek.py`：

```powershell
python deepseek.py
```

等待几秒。终端里只要出现一段围绕“写首诗”的回复，就说明程序调用成功。

下面保留的是一次真实运行记录。公开版只裁出终端区域；你看到回复出现即可，不必追求诗句完全一致。

![真实运行记录的终端区域：程序已经收到 DeepSeek 回复](images/06-run-result.png)<!-- display-width:560 -->

> 核心成功标志：不是代码“看起来没问题”，而是终端真的收到了模型回复。

### 6.2 改一句，再运行一次

把代码中的问题改成：

```python
{"role": "user", "content": "你好，用三句话介绍你自己"},
```

按 `Ctrl + S` 保存后再次执行：

```powershell
python deepseek.py
```

看到回复跟着问题发生变化，你就不只是在复制代码，而是真的会改、会运行了。

**到这里，本集的核心实验已经完成。** 后面的原理和排错按需阅读，不会改变你刚刚取得的成功。

## 7. 成功后，再用大白话看原理

刚才发生的事情可以压缩成四步：写问题、发请求、模型处理、收到回复。

![刚才的调用链：你写问题，程序发请求，DeepSeek 处理，终端接回复](images/07-api-flow.png)<!-- display-width:500 -->

图里最重要的是箭头方向：Python 把问题发出去，再把回复接回来。

现在回头看代码里的五个位置，会轻松很多：

- `api_key`：你的调用凭证，从环境变量读取。
- `base_url`：请求要发送到哪个服务地址。
- `model`：这次使用哪个模型。
- `messages`：准备交给模型的对话内容。
- `response`：模型返回、且程序可以继续处理的结果。

因此可以把整个过程记成一句话：

> 模型 API = 带着凭证发问题 + 等待模型处理 + 接收程序可读取的回复。

官方示例可能还会出现思考强度、流式输出等参数。它们不是第一次调用的必修项，等后续实验真的需要时再加。

## 8. 如果没成功，只查当前这一层

### 看不到 Python 版本号

说明系统还找不到 Python。先按第 2 节的 Python 官方 Windows 指南完成安装或命令别名排错，再重新打开 VS Code；此时不要继续排查 Key 或模型。

### 提示 `No module named 'openai'`

说明 Python 已经启动，但代码工具箱还没装进当前环境。

![如果看到这个错误，只需安装 openai 工具包](images/08-install-sdk.png)<!-- display-width:560 -->

回到运行脚本的同一个终端，执行：

```powershell
python -m pip install openai
```

### Key 自检是 `False`，或者出现 401

先在当前终端重新设置环境变量，并确认自检输出 `True`。如果仍是 401，再检查 Key 是否复制完整、是否已被删除；不要把 Key 发给别人帮你检查。

### 出现 402

账户余额不足。回到开放平台确认余额，完成小额充值后重试。

### 出现 429

短时间内请求太多。先稍等片刻再试；自动重试留到正式项目再讲。

完整错误码可以参考
[DeepSeek 官方错误码文档](https://api-docs.deepseek.com/quick_start/error_codes/)。模型名称和参数可能更新，复现实验时请以
[DeepSeek 官方 API 文档](https://api-docs.deepseek.com/) 为准。

## 9. 今天你已经完成了什么

如果终端成功出现模型回复，你已经完成了三件事：

1. 用网页和 Python 分别发送了同一个问题。
2. 用环境变量保存 Key，没有把凭证写进代码。
3. 修改问题并再次运行，确认程序真的能调用模型。

![本集通关：程序发出请求，Key 没写进代码，终端收到回复](images/09-summary.png)<!-- display-width:500 -->

这次架构变化很小，却很关键：原本需要人点击网页的对话，现在已经变成程序可以主动发起的调用。

下一集只增加一个变量：模型会回答了，怎样让本地 AI 工具真正替我们创建一个文件？
