生产最佳实践
稳定性
- 为所有请求设置超时,避免长时间占用连接。
- 对可重试错误使用指数退避,并设置最大重试次数。
- 对关键链路配置兜底模型、降级回答或人工接管。
- 控制单用户、单租户、单业务线和全局并发。
- 对异步任务使用队列、状态轮询、回调和幂等键。
推荐调用封装
生产系统不建议在业务代码中到处直接调用模型。更推荐封装一个统一的模型网关或服务模块,集中处理认证、超时、重试、日志、限流和降级。
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压测时应从小并发开始,逐步提升到业务峰值,并确认限流、队列、降级和告警都能按预期工作。