第六章:补充知识(选学)
本章内容不是必须掌握的,但在 AI 应用开发中经常遇到。
建议先跳过,等实际开发中碰到了再回来查阅。
6.1 JSON —— HTTP 世界的”普通话”
什么是 JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。
虽然名字里有 JavaScript,但它和语言无关——Python、Java、Go …… 所有语言都支持。
AI API 的请求体和响应体,几乎 100% 使用 JSON 格式。
JSON 长什么样?
{
"name": "张三",
"age": 20,
"is_student": true,
"scores": [85, 92, 78],
"address": {
"city": "北京",
"district": "海淀区"
},
"phone": null
}
JSON 的数据类型
| 类型 | 示例 | Python 对应 |
|---|---|---|
| 字符串 | "hello" | str |
| 数字 | 42、3.14 | int、float |
| 布尔值 | true、false | True、False |
| 空值 | null | None |
| 数组 | [1, 2, 3] | list |
| 对象 | {"key": "value"} | dict |
Python 中处理 JSON
import json
# Python 字典 → JSON 字符串
data = {"model": "gpt-4", "temperature": 0.7}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
# 输出: {"model": "gpt-4", "temperature": 0.7}
# JSON 字符串 → Python 字典
text = '{"name": "张三", "age": 20}'
obj = json.loads(text)
print(obj["name"])
# 输出: 张三
使用 requests 时不用手动处理
import requests
# 发送时:json 参数自动把字典转成 JSON 字符串
response = requests.post(url, json={"key": "value"})
# 接收时:.json() 方法自动把 JSON 字符串转成字典
data = response.json()
常见 JSON 错误
# ❌ 错误:用了单引号(JSON 只认双引号)
'{"name": 'hello'}'
# ❌ 错误:最后一项有多余逗号
'{"name": "hello", "age": 20,}'
# ❌ 错误:key 没有引号
'{name: "hello"}'
# ✅ 正确
'{"name": "hello", "age": 20}'
6.2 流式响应(Streaming)—— ChatGPT 的”打字效果”
现象
使用 ChatGPT 时,你会看到 AI 的回答是一个字一个字”打”出来的,而不是等全部生成完才一次性显示。
这就是流式响应(Streaming)。
原理
普通请求(非流式):
客户端 ──请求──→ 服务器
│
│ (等待 AI 生成完整回答,可能需要 10 秒)
│
客户端 ←──完整响应── 服务器
流式请求:
客户端 ──请求(stream=true)──→ 服务器
│
客户端 ←── "你" │ ← 生成一个字就发一个字
客户端 ←── "好" │
客户端 ←── "!" │
客户端 ←── "有" │
客户端 ←── "什" │
客户端 ←── "么" │
客户端 ←── ... │
客户端 ←── [DONE] │ ← 全部发完的信号
技术实现:SSE
流式响应底层使用的是 SSE(Server-Sent Events,服务器发送事件) 协议。
本质上还是 HTTP 响应,只是:
- 响应头包含
Content-Type: text/event-stream - 响应体不是一次性发完,而是分多次发送
- 每次发送一小块数据(一个 token)
Python 代码示例
import requests
response = requests.post(
"https://api.openai.com/v1/chat/completions",
headers={
"Authorization": "Bearer sk-你的密钥",
"Content-Type": "application/json"
},
json={
"model": "gpt-4",
"messages": [{"role": "user", "content": "讲个故事"}],
"stream": True
},
stream=True
)
for line in response.iter_lines():
if line:
text = line.decode("utf-8")
if text.startswith("data: ") and text != "data: [DONE]":
import json
chunk = json.loads(text[6:])
content = chunk["choices"][0]["delta"].get("content", "")
print(content, end="", flush=True)
print()
流式 vs 非流式
| 对比项 | 非流式 | 流式 |
|---|---|---|
| 用户体验 | 等很久才看到完整回答 | 逐字显示,感觉更快 |
| 首字时间 | 慢(等全部生成完) | 快(生成第一个字就开始传) |
| 实现复杂度 | 简单 | 稍复杂(需要逐块解析) |
| 适合场景 | 后台处理、批量调用 | 聊天界面、实时交互 |
6.3 WebSocket —— 双向实时通信
HTTP 的局限
HTTP 是”一问一答”模式:客户端发请求,服务器回响应。服务器不能主动给客户端发消息。
HTTP 模式(单向):
客户端 ──请求──→ 服务器
客户端 ←──响应── 服务器
(必须客户端先问,服务器才能答)
WebSocket 的不同
WebSocket 是双向持续通信协议:连接建立后,双方可以随时互相发消息。
WebSocket 模式(双向):
客户端 ←──────→ 服务器
(任何一方都可以主动发消息)
建立过程
WebSocket 的建立很有趣——它先通过 HTTP 请求”升级”协议:
客户端 → 服务器:
GET /chat HTTP/1.1
Upgrade: websocket ← "我想升级到 WebSocket"
Connection: Upgrade
服务器 → 客户端:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket ← "同意升级"
(此后不再使用 HTTP,切换到 WebSocket 协议)
AI 开发中的应用场景
| 场景 | 为什么用 WebSocket |
|---|---|
| AI 语音对话 | 需要实时双向传输音频流 |
| 多人协作 AI 画板 | 需要实时同步所有人的操作 |
| AI 实时翻译 | 边说边翻,需要持续双向通信 |
| 在线 AI 编程助手 | 实时推送代码建议 |
Python 示例(了解即可)
import asyncio
import websockets
async def chat():
async with websockets.connect("wss://example.com/ws") as ws:
await ws.send("你好")
response = await ws.recv()
print(f"收到:{response}")
asyncio.run(chat())
大部分 AI 应用开发用 HTTP + SSE 就够了,只有需要真正双向实时通信时才用 WebSocket。
6.4 API Key 的安全注意事项
既然 HTTP 请求中要带 API Key,安全问题就很重要。
绝对不能做的事
❌ 把 API Key 写在前端 JavaScript 代码里
→ 用户按 F12 就能看到你的 Key
❌ 把 API Key 提交到 GitHub
→ 全世界都能看到,Key 会在几分钟内被盗用
❌ 把 API Key 发到群聊或社交媒体
→ 一旦泄露就可能产生巨额费用
正确做法
✅ 使用环境变量存储 API Key
✅ 把 API Key 放在 .env 文件中,.gitignore 排除
✅ 通过后端服务器转发 API 请求,不要在前端直接调用
✅ 定期轮换 API Key
代码示例
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
raise ValueError("请设置 OPENAI_API_KEY 环境变量")
.env 文件:
OPENAI_API_KEY=sk-你的密钥
.gitignore 文件:
.env
6.5 常用 HTTP 工具推荐
| 工具 | 类型 | 适合场景 | 难度 |
|---|---|---|---|
| 浏览器 F12 | 内置工具 | 查看网页请求 | ⭐ |
| httpbin.org | 在线服务 | 测试 HTTP 请求 | ⭐ |
| curl | 命令行工具 | 快速发送请求、查看详情 | ⭐⭐ |
| Postman | 图形界面工具 | 调试 API、保存请求集合 | ⭐⭐ |
| Python requests | 代码库 | 在代码中发送请求 | ⭐⭐ |
| Apifox | 图形界面工具 | 中文 API 调试工具 | ⭐⭐ |
本章小结
- JSON 是 AI API 的通用数据格式,Python 用
json模块或requests库处理 - 流式响应让 AI 回答逐字显示,底层用 SSE 实现,本质还是 HTTP
- WebSocket 适合双向实时通信,大部分 AI 场景用不到
- API Key 安全很重要,用环境变量存储,永远不要提交到代码仓库
- 善用 HTTP 调试工具(F12、curl、Postman)能大幅提升开发效率
下一章提供一张总结速查表,方便你随时复习。
← 上一章:实战串联 | 下一章:总结速查表 →