Skip to content

第 9 章:对话结构——顺便推开 API 的门 ​

9.1 还记得第 5 章吗 ​

第 5 章讲过:和模型对话有三层结构——System 设底色,User 发请求,Assistant 回回答。

当时你看到的是概念。现在我们看看它在 API 里真正长什么样。

一个真实的 API 请求,核心部分长这样:

json
{
  "model": "deepseek-v4-pro",
  "messages": [
    {"role": "system", "content": "你是一个翻译助手。只翻译,不解释,不加评语。"},
    {"role": "user", "content": "Hello, how are you?"}
  ]
}

三个字段,对应三个角色:

字段对应角色类比
"role": "system"System Prompt厨师守则——贴在厨房墙上的规矩
"role": "user"User Message客人点菜
"role": "assistant"Assistant Message厨房端出来的菜

这就是 API 请求的门缝里透出来的第一道光。格式不复杂——你认识这三个 role,就认识了对话结构的骨架。


9.2 API 不帮你记聊天记录 ​

API 服务端不会主动记录你的对话上下文。就像你每次去传菜口,厨房不会记得你上一轮点了什么—— 你得把整段对话重新说一遍。

所以实际代码里,每次请求都要自己拼完整的 messages 数组:

第一轮传:
messages = [
  {system: "你是翻译助手"},
  {user: "珠穆朗玛峰有多高?"}
]
模型回:"8848 米"

第二轮你得传:
messages = [
  {system: "你是翻译助手"},
  {user: "珠穆朗玛峰有多高?"},
  {assistant: "8848 米"},        ← 上一轮的回答也要带上
  {user: "那第二高呢?"}         ← 这才是新问题
]

整段历史每次都要带着——这就是为什么第 6 章说"聊得越久越贵"。你传的 messages 越来越长,输入 token 越来越多,钱就这样花出去的。

厨房只负责做菜,不负责记你说了什么。记性是你在代码里管的。

但传归传,钱不一定全收。 虽然每次都要把完整历史塞进请求,但服务端不傻——前面重复的部分可以通过 KV Cache 跳过计算,输入 token 费用会打折。还记得第 4 章讲的 DeepSeek 缓存命中 0.025 元/百万 token 吗?就是这个机制在省钱。具体原理见第 13 章。


9.3 速率限制——厨房忙不过来了 ​

API 不是无限供应的。当请求太多,服务端会限制你。

情况返回翻译成人话
并发太多HTTP 429"别再点了!厨房炸了!"
排队等待中服务端发来的"心跳信号""还没轮到你,但我在听……"
排队超时(~10 分钟)连接断开"太久了,下次再来吧"

429 是最常见的限速错误。遇到它别慌——不是你的请求有问题,是厨房灶台不够用。等几秒重试就好。


9.4 常见错误码——厨房给的回复 ​

每次调用 API,服务端会返回一个三位数状态码。和浏览网页一样。

状态码含义翻译成人话你该做什么
200成功菜端出来了吃
400请求格式错误"你这点的什么乱七八糟的"检查参数拼写
401没权限"你谁啊?门禁卡呢?"检查 API Key
429超并发/超频率"锅不够用了!"等几秒重试
500服务器内部错误"厨房着火了"重试,不行就找服务商
503服务不可用"今天歇业"过会儿再来

小白记住三个就够了:401 查 Key,429 等一等,500 甩给服务商。


本章要点 ​

概念一句话
对话三要素system(守则)+ user(点菜)+ assistant(端菜),在 API 里是 messages 数组里的三种 role
API 不记聊天每次请求带完整历史——这就是为什么聊得越久越贵
KV Cache传归传,重复的部分可以打折,第 4 章的 DeepSeek 缓存价格就是这个
429最常见限速错误,等几秒重试就行
401/429/500查 Key / 等一等 / 甩给服务商