最近做商用的客服系统,使用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 逻辑组件

  1. 虚拟模型名 (Virtual Model Name):对外暴露统一的名字(如 standard-flash-v1),屏蔽后端差异。
  2. 调度优先级 (Priority):定义“主/备”逻辑,数字越小优先级越高。
  3. 权重分配 (Weight):定义同级别模型之间的流量比例。
  4. 自动熔断 (Circuit Breaker):检测到模型故障时自动禁用。
  5. 静默重试 (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"}

逻辑点: 无论后台是哪家模型,Dify 只需要请求 gemini-2.0-flash 这个名字,New API 会自动按需转换。

第三步:配置调度策略

在“渠道管理”页面,针对上述两个渠道设置参数:

  1. 高可用模式(主备切换)
    • 将 Gemini 设为 优先级 1,豆包设为 优先级 2
    • 效果:系统永远先跑 Gemini。只有当 Gemini 报错(429、500、Key 没钱)时,才会自动切换到豆包。
  2. 负载均衡模式(混合并发)
    • 将 Gemini 和 豆包 都设为 优先级 1
    • 设置权重:Gemini 权重 10,豆包权重 10
    • 效果:请求将 1:1 随机分发给两个模型,极大缓解单个 Key 的 RPM 压力。

第四步:异常容错参数配置(全局设置)

前往 “系统设置” -> “运营设置”,配置以下核心参数以实现“无感切换”:

  1. 失败重试次数:设置为 2
    • 作用:当 Dify 发起请求,若命中渠道 A 失败,New API 不会返回错误,而是在后台根据重试次数,立即去请求渠道 B。
  2. 自动禁用开关:在“系统设置”底部勾选 “失败时自动禁用渠道”
    • 作用:当某个模型连续多次报错,系统会自动将其改为“已禁用”,停止向其分流,防止浪费重试耗时。
  3. 自动启用开关:勾选 “成功时自动启用渠道”
    • 作用:系统会定期自动“探活”,一旦发现之前坏掉的模型恢复了(测速通过),自动将其接回集群。

4. 容错场景模拟与应对

异常场景 触发机制 New API 应对动作 用户侧感受
厂商 API 宕机 (500错误) HTTP 响应 5xx 立即记录 1 次失败,根据重试逻辑秒级切换至备用渠道。 无感。仅响应时间微增。
触发频率限制 (429错误) 触发 Rate Limit 记录失败,调度网关自动寻找权重内的下一个 Key。 无感。正常获得回复。
余额用尽 (401错误) 鉴权失败 触发“自动禁用”机制,该渠道变红并下线。 无感。流量自动漂移。
模型严重幻觉/无内容 逻辑判断/空返回 需配合手动禁用或定期健康检查(Health Check)测速。 稳定

5. 方案优势总结

  1. 异构兼容:将不同协议(Gemini、豆包等)统一转换为 OpenAI 标准协议,大幅降低下游 Dify 等应用的开发复杂度。
  2. 动态扩容:增加新模型时,只需在 New API 渠道中添加并设置相同的“虚拟模型名”,即可实时生效,无需重启下游服务。
  3. 成本优化:可以设置主渠道为低价模型(如豆包),备用渠道为昂贵模型(如 Gemini Pro),在保证低成本的同时拥有极高的稳定性储备。
  4. 高可用边界:通过多地区、多厂商、多 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}
])

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐