生产最佳实践

稳定性

  • 为所有请求设置超时,避免长时间占用连接。
  • 对可重试错误使用指数退避,并设置最大重试次数。
  • 对关键链路配置兜底模型、降级回答或人工接管。
  • 控制单用户、单租户、单业务线和全局并发。
  • 对异步任务使用队列、状态轮询、回调和幂等键。

推荐调用封装

生产系统不建议在业务代码中到处直接调用模型。更推荐封装一个统一的模型网关或服务模块,集中处理认证、超时、重试、日志、限流和降级。

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.MODELINK_API_KEY,
  baseURL: process.env.MODELINK_BASE_URL ?? "https://api.qnaigc.com/v1",
  timeout: 30_000,
});

export async function callModel(
  messages: Array<{ role: "system" | "user" | "assistant"; content: string }>,
) {
  const startedAt = Date.now();

  try {
    const result = await client.chat.completions.create({
      model: process.env.MODELINK_MODEL!,
      messages,
    });

    console.info("model_call_success", {
      model: process.env.MODELINK_MODEL,
      latencyMs: Date.now() - startedAt,
      usage: result.usage,
    });

    return result;
  } catch (error) {
    console.error("model_call_failed", {
      model: process.env.MODELINK_MODEL,
      latencyMs: Date.now() - startedAt,
      error: error instanceof Error ? error.message : String(error),
    });
    throw error;
  }
}

警告

示例只展示服务端封装思路。生产环境还应按业务要求补充租户级限流、请求 ID、脱敏日志、异常分类和降级策略。

可观测性

建议记录:

  • 请求 ID、会话 ID、用户或租户 ID。
  • 模型、接入点、协议类型和客户端版本。
  • 耗时、首 token 延迟、状态码、错误原因。
  • 输入 token、输出 token、缓存写入和缓存命中。
  • 工具调用名称、结果状态和人工接管记录。

推荐日志字段示例:

{
  "event": "model_call",
  "requestId": "req_xxx",
  "tenantId": "tenant_a",
  "model": "控制台中的模型 ID",
  "status": "success",
  "latencyMs": 1280,
  "inputTokens": 1200,
  "outputTokens": 300,
  "cachedTokens": 0
}

成本控制

  • 限制最大输入长度,避免把完整历史无差别传给模型。
  • 对重复上下文做缓存、摘要或知识库检索。
  • 对不同任务使用不同模型档位。
  • 对批量处理设置队列和速率上限。
  • 定期分析高成本调用来源,按 API Key 或业务线拆分账单。

质量保障

  • 建立典型问题集、反例集和回归测试集。
  • 对关键 Prompt 做版本管理。
  • 对结构化输出做格式校验和失败重试。
  • 对事实性回答引入检索、引用或人工复核。
  • 对高风险行业输出增加审核和免责声明。

上线前压测

上线前至少验证:

# 示例:用你的压测工具或脚本逐步提升并发,观察 429、5xx、超时和平均耗时
MODEL="控制台中的模型 ID" CONCURRENCY=5 DURATION=60s npm run load-test

压测时应从小并发开始,逐步提升到业务峰值,并确认限流、队列、降级和告警都能按预期工作。