流式输出与多轮对话
在 API 上构建类聊天体验时,有两个实际的现实:流式输出,让用户立即看到内容;以及 自行管理历史,因为该 API 是无状态的。
流式输出
不使用流式输出时,用户要等待整段回复。使用流式输出时,token 在生成的同时即时到达——感知速度大大提升。使用 SDK 的流式辅助方法:
- Python
- TypeScript
with client.messages.stream(
model="claude-sonnet-4-6", max_tokens=1024,
messages=[{"role": "user", "content": "Explain RAG in two sentences."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
const stream = client.messages.stream({
model: "claude-sonnet-4-6", max_tokens: 1024,
messages: [{ role: "user", content: "Explain RAG in two sentences." }],
});
for await (const event of stream) {
if (event.type === "content_block_delta") process.stdout.write(event.delta.text ?? "");
}
多轮:历史由你保存
该 API 在调用之间 没有记忆(原因)。要继续一次对话,每次都要把 此前的整个交流 发回去:
messages = [{"role": "user", "content": "Hi, I'm planning a trip."}]
# ... get assistant reply, then append both turns:
messages.append({"role": "assistant", "content": assistant_text})
messages.append({"role": "user", "content": "Make it 3 days."})
# send the full `messages` list again
长对话会填满窗口
随着历史增长,它会蚕食 上下文窗口,成本也随之上升。应对策略:
- 把较早的轮次 摘要/压缩 成一段简短的回顾并向前携带。
- 裁剪 掉无关的早期轮次。
- 与 提示词缓存 搭配,避免为稳定前缀重复付费。