OpenAI API 进阶:流式输出与成本控制
在 Node.js 中实现 Chat Completions 流式输出,并给出限流重试、token 预算、缓存与批处理等可落地的成本控制清单。
- 作者
- ChatGPT博客编辑部
- 发布时间
- 阅读时长
- 约 3 分钟阅读
完成第一次 API 调用后,生产环境最常见的两个诉求是:更快的首字响应(streaming)和可控成本。若尚未跑通最小调用,先读 OpenAI API 入门。
流式输出最小示例
调试提示词时,可先在 ChatGPT 使用入口 验证输出质量,再落到 API。
import OpenAI from 'openai';
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const stream = await client.chat.completions.create({
model: 'gpt-4o-mini',
stream: true,
messages: [
{ role: 'system', content: '你是简洁的中文助手。' },
{ role: 'user', content: '用三点概括向量数据库。' },
],
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}
前端可用 Server-Sent Events 或 ReadableStream 把增量文本推给用户,显著改善「等待感」。
注意: 需要完整 JSON 再解析的场景,通常等整段响应更稳妥,见 JSON / Vision。
成本控制清单
- 默认小模型:能用轻量聊天模型就不要默认上最贵档(名称以平台当前列表为准)
- 限制输出:设置合理
max_tokens - 裁剪历史:只保留最近 N 轮或摘要后的上下文
- 输入限额:对用户消息做长度校验
- 缓存:对高频相似问题做结果缓存(语义相同再命中)
- 分功能计量:按接口/租户记录 token,便于发现异常
- 批处理心智:可离线的摘要 / 分类任务,尽量异步批量跑,避免在用户请求路径上叠最贵模型
- 别用聊天接口硬扛检索:大量文档相似度匹配更适合后续的 Embeddings 路线(专题未建前,先减小上下文,而不是无限加 history)
价格数字变化快:以 platform 定价页为准,本文只给结构,不写死单价。
限流与重试(实操表)
| 状态 | 常见含义 | 建议 |
|---|---|---|
| 429 | 速率或配额触顶 | 指数退避;降并发;检查是否死循环调用 |
| 401 / 403 | Key 或权限问题 | 停重试,去平台核对密钥与项目权限 |
| 5xx | 服务端抖动 | 有限次重试 + 超时;对用户返回友好降级 |
| 超时 | 网络或模型过慢 | 缩短上下文;非对话场景改异步 |
async function withRetry<T>(fn: () => Promise<T>, times = 3): Promise<T> {
let delay = 500;
for (let i = 0; i < times; i += 1) {
try {
return await fn();
} catch (error: any) {
if (error?.status !== 429 || i === times - 1) throw error;
await new Promise((r) => setTimeout(r, delay));
delay *= 2;
}
}
throw new Error('unreachable');
}
安全提醒
- API Key 只放服务端
- 记录日志时避免落盘完整隐私内容
- 对用户输入做基础注入与敏感信息过滤
相关阅读
使用入口
相关阅读
评论
评论功能即将上线,欢迎先通过关于页联系我们反馈意见。