跳到正文

亲手调一次 LLM API(同步 + 流式)

从一行 request 到流式 SSE,搞懂「调模型」到底发生了什么

一句话:所有 AI 编程、所有 Agent,最底层都是「往 LLM 发一段 messages,拿回一段回复」。先把这一步亲手跑通,后面才不虚。 messages:对话就是一个数组 主流 LLM API(OpenAI 兼容,DeepSeek / 通义 / 本地 vLLM 都兼容)的输入,就是一个 messages 列表,每条带一个角色: system:设定模型的身份和规则(只放一条,放最前) user:用户说的话 assistant:模型之前说过的话(多轮对话时把历史接上) 同步调用(最小可跑) 跑通后,resp.choices[0].message.content 就是模型的回复。整段一次性返回——这是「同步」。 流式调用(打字机效果) 聊天产品里字是一个个蹦出来的,靠的是流式(SSE):服务端边生成边推,客户端边收边显示。改一个参数 stream=True,响应从「一个结果」变成「一串增量片段」: 每个 chunk 只带「这一小步新增的内容」(delta),你把它们拼起来就是完整回复。 同步 vs 流式,怎么选 同步 流式 拿到结果 等全部生成完 边生成边到 体验 长回复要干等 首字快、像打字机 适合 后台批处理、要拿完整结果再处理 面向用户的对话 / 长输出 常见坑 key 硬编码进代码:别把 API key 写死提交到仓库,用环境变量(os.environ)读。 流式里 delta.content 可能是 None:首块或工具调用块可能没有文本,取用前判空。 不处理超时 / 限流:线上要加超时、重试(指数退避),否则一波高峰就雪崩。 temperature 用错:抽取、改写、写代码这类要"稳"的任务,把 temperature 调到 0~0.3;别用默认的高随机。 关联面试题 「流式输出(SSE)是怎么实现的?和同步调用有什么区别?」 「temperature、top-p 这些采样参数分别控制什么?」 👉 去 题库 搜 流式 / 采样参数 / 解码策略。 训练营延伸 往工业级走:高并发下的推理优化(KV Cache、continuous batching)、vLLM 部署、成本与延迟权衡——是训练营工程化那条线的内容。