商用大模型集群化调度负载均衡 & 异常容错方案
最近做商用的客服系统,使用dify做智能体 对接大模型,有豆包,第三方低价的gemini,官方gemini多个模型发现模型稳定性 官方的gemini最稳定也最贵 适合做兜底,第三方的gemini能拿到5折的优惠价钱和豆包差不多但稳定性略差一些不知道多会异常,老让人担心,豆包价格低但效率偏低,各有优势,这就需要一个具备调度能力和容错能力的中转工具 定制一套调度方案。多方对比找到了下面的方案,实际使用过程中,不管是单机部署,还是集群部署都可以,基本上满足了项目需求:
这是一个基于 New API(及 One API 架构)实现的商用大模型集群化调度方案。该方案旨在通过中转层封装,将多个异构大模型(如 Google Gemini、字节跳动豆包、OpenAI GPT 等)整合为一个高可用、可自动漂移、负载均衡的“虚拟超大规模模型集群”。
商用大模型集群化调度负载均衡 & 异常容错方案
1. 方案背景
在企业级应用(如 Dify 智能助手、生产环境 API 调用)中,依赖单一模型供应商存在以下风险:
- 稳定性风险:单个供应商接口可能出现服务宕机或网络波动。
- 配额限制:商用模型通常有 RPM(每分钟请求数)限制。
- 成本波动:不同时段、不同供应商的性价比可能发生变化。
本方案通过 New API 构建中转网关,实现一个接口(统一协议)、一个模型名(虚拟映射)、多路后备(自动容错)。
2. 核心架构设计
2.1 流量链路
终端用户 →\rightarrow→ Dify (或其他应用) →\rightarrow→ New API (调度网关) →\rightarrow→ 大模型集群 (Gemini/豆包/GPT)
2.2 逻辑组件
- 虚拟模型名 (Virtual Model Name):对外暴露统一的名字(如
standard-flash-v1),屏蔽后端差异。 - 调度优先级 (Priority):定义“主/备”逻辑,数字越小优先级越高。
- 权重分配 (Weight):定义同级别模型之间的流量比例。
- 自动熔断 (Circuit Breaker):检测到模型故障时自动禁用。
- 静默重试 (Silent Retry):请求失败后自动调取下一个可用模型。
3. 详细实施步骤
第一步:环境部署
推荐使用 Docker Compose 部署 New API,并挂载 Redis 提升并发性能。
- Docker 镜像:
calciumion/new-api:latest - 存储:MySQL/SQLite(数据存储) + Redis(配额缓存与调度计数)。
第二步:模型渠道封装(渠道管理)
将各家厂商的 API Key 加入渠道,并进行**模型重定向(Model Mapping)**配置。
- 配置实例:
- 渠道 A (Google Gemini):
- 模型原名:
gemini-1.5-flash - 模型重定向:
{"gemini-2.0-flash": "gemini-1.5-flash"}
- 模型原名:
- 渠道 B (字节跳动豆包):
- 模型原名:
doubao-seed-1-6-251015 - 模型重定向:
{"gemini-2.0-flash": "doubao-seed-1-6-251015"}
- 模型原名:
- 渠道 A (Google Gemini):
逻辑点: 无论后台是哪家模型,Dify 只需要请求
gemini-2.0-flash这个名字,New API 会自动按需转换。
第三步:配置调度策略
在“渠道管理”页面,针对上述两个渠道设置参数:
- 高可用模式(主备切换):
- 将 Gemini 设为 优先级 1,豆包设为 优先级 2。
- 效果:系统永远先跑 Gemini。只有当 Gemini 报错(429、500、Key 没钱)时,才会自动切换到豆包。
- 负载均衡模式(混合并发):
- 将 Gemini 和 豆包 都设为 优先级 1。
- 设置权重:Gemini 权重
10,豆包权重10。 - 效果:请求将 1:1 随机分发给两个模型,极大缓解单个 Key 的 RPM 压力。
第四步:异常容错参数配置(全局设置)
前往 “系统设置” -> “运营设置”,配置以下核心参数以实现“无感切换”:
- 失败重试次数:设置为
2。- 作用:当 Dify 发起请求,若命中渠道 A 失败,New API 不会返回错误,而是在后台根据重试次数,立即去请求渠道 B。
- 自动禁用开关:在“系统设置”底部勾选 “失败时自动禁用渠道”。
- 作用:当某个模型连续多次报错,系统会自动将其改为“已禁用”,停止向其分流,防止浪费重试耗时。
- 自动启用开关:勾选 “成功时自动启用渠道”。
- 作用:系统会定期自动“探活”,一旦发现之前坏掉的模型恢复了(测速通过),自动将其接回集群。
4. 容错场景模拟与应对
| 异常场景 | 触发机制 | New API 应对动作 | 用户侧感受 |
|---|---|---|---|
| 厂商 API 宕机 (500错误) | HTTP 响应 5xx | 立即记录 1 次失败,根据重试逻辑秒级切换至备用渠道。 | 无感。仅响应时间微增。 |
| 触发频率限制 (429错误) | 触发 Rate Limit | 记录失败,调度网关自动寻找权重内的下一个 Key。 | 无感。正常获得回复。 |
| 余额用尽 (401错误) | 鉴权失败 | 触发“自动禁用”机制,该渠道变红并下线。 | 无感。流量自动漂移。 |
| 模型严重幻觉/无内容 | 逻辑判断/空返回 | 需配合手动禁用或定期健康检查(Health Check)测速。 | 稳定。 |
5. 方案优势总结
- 异构兼容:将不同协议(Gemini、豆包等)统一转换为 OpenAI 标准协议,大幅降低下游 Dify 等应用的开发复杂度。
- 动态扩容:增加新模型时,只需在 New API 渠道中添加并设置相同的“虚拟模型名”,即可实时生效,无需重启下游服务。
- 成本优化:可以设置主渠道为低价模型(如豆包),备用渠道为昂贵模型(如 Gemini Pro),在保证低成本的同时拥有极高的稳定性储备。
- 高可用边界:通过多地区、多厂商、多 Key 的集群化配置,理论上可以将模型的可用性提升至 99.99% 以上。
6. Dify 接入配置建议
在 Dify 的“模型供应商”中添加 OpenAI-like 供应商:
- 模型名称:填写你在重定向里定义的虚拟名(如
gemini-2.0-flash)。 - API Key:填写 New API 生成的令牌。
- API Base URL:填写
http://<your-new-api-ip>:3000/v1。
结论:该方案实现了“软件定义模型集群”,是商用 AI 应用落地最稳健的技术选择。
测试demo:
import requests
import json
import time
def test_llm_api(model=“doubao-seed-1-6-251015”, messages=None):
“”"
测试大模型中转接口连通性
Args:
model (str): 模型名称
messages (list): 消息列表,格式为 [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}]
Returns:
dict: 接口响应
"""
url = "http://192.168.3.19:3000/v1/chat/completions"
headers = {
"Authorization": "Bearer sk-ZjB2fqxQkAXXXXXXXXXXXXXX",
"Content-Type": "application/json"
}
# 默认消息
if messages is None:
messages = [
{
"role": "system",
"content": "你是一个智能助手,请用简洁的语言回答问题"
},
{
"role": "user",
"content": "你好,接口测试"
}
]
data = {
"model": model,
"messages": messages
}
max_retries = 2 # 最多重试2次
attempt = 0
while attempt <= max_retries:
attempt += 1
print(f"\n=== 尝试调用 {attempt}/{max_retries + 1} ===")
try:
response = requests.post(url, headers=headers, json=data, timeout=30) # 添加超时设置
print(f"Status Code: {response.status_code}")
if response.status_code == 200:
print("✅ API 调用成功!")
print(f"Response Body: {json.dumps(response.json(), indent=2, ensure_ascii=False)}")
# return response.json()
else:
print(f"❌ API 调用失败 (状态码: {response.status_code})")
try:
error_data = response.json()
print(f"错误信息: {json.dumps(error_data, indent=2, ensure_ascii=False)}")
except json.JSONDecodeError:
print(f"错误响应: {response.text}")
if attempt <= max_retries:
print(f"将在 2 秒后重试...")
time.sleep(2) # 等待2秒后重试
else:
print("❌ 已达到最大重试次数,退出测试")
except requests.exceptions.RequestException as e:
print(f"❌ 请求异常: {e}")
if attempt <= max_retries:
print(f"将在 2 秒后重试...")
time.sleep(2) # 等待2秒后重试
else:
print("❌ 已达到最大重试次数,退出测试")
return None
def interactive_test():
“”“交互式测试”“”
print(“=== 大模型中转接口测试工具 ===”)
print(“1. 快速测试(默认消息)”)
print(“2. 自定义测试”)
choice = input("请选择测试模式 (1/2): ")
if choice == "1":
print("\n执行快速测试...")
test_llm_api()
elif choice == "2":
print("\n执行自定义测试...")
model = input("请输入模型名称 (默认: doubao-seed-1-6-251015): ") or "doubao-seed-1-6-251015"
messages = []
# 添加系统消息
system_content = input("请输入系统消息内容 (按Enter跳过): ")
if system_content:
messages.append({"role": "system", "content": system_content})
# 添加用户消息
user_content = input("请输入用户消息内容: ")
if user_content:
messages.append({"role": "user", "content": user_content})
if not messages:
print("错误:至少需要一条消息")
return
print("\n执行测试...")
test_llm_api(model=model, messages=messages)
else:
print("无效选择")
if name == “main”:
# 默认执行快速测试
print(“=== 大模型中转接口测试工具 ===”)
print(“执行快速测试(默认消息)…”)
# 使用正确的模型名称
models=“gemini-2.0-flash”
messages =“你好,你是谁,调用的是哪个大模型”
test_llm_api(model=models, messages=[
{“role”: “system”, “content”: “你是一个智能助手,请用简洁的语言根据事实回答问题”},
{“role”: “user”, “content”: messages}
])
更多推荐

所有评论(0)