OpenAI API 进阶:流式输出与成本控制

在 Node.js 中实现 Chat Completions 流式输出,并给出限流重试、token 预算、缓存与批处理等可落地的成本控制清单。

作者
ChatGPT博客编辑部
发布时间
阅读时长
约 3 分钟阅读
OpenAI API 进阶:流式输出与成本控制 封面

完成第一次 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。

成本控制清单

  1. 默认小模型:能用轻量聊天模型就不要默认上最贵档(名称以平台当前列表为准)
  2. 限制输出:设置合理 max_tokens
  3. 裁剪历史:只保留最近 N 轮或摘要后的上下文
  4. 输入限额:对用户消息做长度校验
  5. 缓存:对高频相似问题做结果缓存(语义相同再命中)
  6. 分功能计量:按接口/租户记录 token,便于发现异常
  7. 批处理心智:可离线的摘要 / 分类任务,尽量异步批量跑,避免在用户请求路径上叠最贵模型
  8. 别用聊天接口硬扛检索:大量文档相似度匹配更适合后续的 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 只放服务端
  • 记录日志时避免落盘完整隐私内容
  • 对用户输入做基础注入与敏感信息过滤

相关阅读

使用入口

评论

评论功能即将上线,欢迎先通过关于页联系我们反馈意见。