Administrator
发布于 2026-07-19 / 1 阅读
0
0

Dify 多模型路由

一、架构总览

┌─────────────────────────────────────────────────────────┐
│                      Dify 应用层                        │
│  (Chatflow / Workflow / Agent / 知识库 RAG)             │
│                                                         │
│  模型供应商: OpenAI-API-Compatible                      │
│  Base URL:  http://litellm-proxy:4000/v1                │
└──────────────────────┬──────────────────────────────────┘
                       │ OpenAI 兼容协议
                       ▼
┌─────────────────────────────────────────────────────────┐
│               LiteLLM Proxy Server (:4000)              │
│                                                         │
│  ┌─────────────┐  ┌──────────────┐  ┌───────────────┐   │
│  │ 路由策略     │  │ Fallback 降级 │  │ 负载均衡    │   │
│  │ (Router)    │  │              │  │ (LoadBalance) │   │
│  └─────────────┘  └──────────────┘  └───────────────┘   │
│                                                         │
│  ┌─────────────┐  ┌──────────────┐  ┌───────────────┐   │
│  │ 预算/限流    │  │ API Key 管理  │  │ 用量追踪    │   │
│  │ (Budget)    │  │ (Virtual Key) │  │ (Logging)    │   │
│  └─────────────┘  └──────────────┘  └───────────────┘   │
└───────┬───────────────┬───────────────┬─────────────────┘
        │               │               │
        ▼               ▼               ▼
   ┌─────────┐    ┌──────────┐    ┌──────────┐
   │ OpenAI  │    │ Anthropic│    │  Azure   │  ... 更多供应商
   │ GPT-4o  │    │ Claude   │    │  / 本地  │
   └─────────┘    └──────────┘    └──────────┘

核心价值:Dify 只需对接一个 LiteLLM 端点,由 LiteLLM 统一管理底层多供应商的密钥、路由、降级、限流和成本控制。


二、Step 1:部署 LiteLLM Proxy

2.1 Docker Compose 部署(推荐生产环境)

Yaml

# docker-compose.litellm.yml
version: '3.8'

services:
  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    container_name: litellm-proxy
    ports:
      - "4000:4000"           # 对外 API 端口
    volumes:
      - ./litellm_config.yaml:/app/config.yaml
    command:
      - "--config"
      - "/app/config.yaml"
      - "--port"
      - "4000"
      - "--host"
      - "0.0.0.0"             # ⚠️ 必须绑定 0.0.0.0,不能用 localhost!
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - AZURE_API_KEY=${AZURE_API_KEY}
      # 数据库(可选,用于持久化 Virtual Key 和日志)
      - DATABASE_URL=postgresql://litellm:litellm@litellm-db:5432/litellm
    depends_on:
      - litellm-db
    restart: unless-stopped

  litellm-db:
    image: postgres:16-alpine
    container_name: litellm-db
    environment:
      - POSTGRES_USER=litellm
      - POSTGRES_PASSWORD=litellm
      - POSTGRES_DB=litellm
    volumes:
      - litellm_pgdata:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  litellm_pgdata:

2.2 LiteLLM 核心配置文件(多模型多路由)

Yaml

# litellm_config.yaml
model_list:
  # ═══════════════════════════════════════════
  # 模型组 1:主力对话模型(负载均衡 + 多供应商)
  # ═══════════════════════════════════════════
  - model_name: gpt-4o                    # Dify 中使用的模型名
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY
    model_info:
      max_tokens: 128000
      mode: chat

  - model_name: gpt-4o                    # 同名 = 自动负载均衡
    litellm_params:
      model: azure/gpt-4o
      api_key: os.environ/AZURE_API_KEY
      api_base: https://my-resource.openai.azure.com
      api_version: "2024-06-01"
    model_info:
      max_tokens: 128000
      mode: chat

  # ═══════════════════════════════════════════
  # 模型组 2:轻量快速模型
  # ═══════════════════════════════════════════
  - model_name: fast-chat
    litellm_params:
      model: openai/gpt-4o-mini
      api_key: os.environ/OPENAI_API_KEY

  - model_name: fast-chat                 # 备选:Claude Haiku
    litellm_params:
      model: anthropic/claude-3-5-haiku-20241022
      api_key: os.environ/ANTHROPIC_API_KEY

  # ═══════════════════════════════════════════
  # 模型组 3:Embedding 模型
  # ═══════════════════════════════════════════
  - model_name: text-embedding
    litellm_params:
      model: openai/text-embedding-3-small
      api_key: os.environ/OPENAI_API_KEY

  # ═══════════════════════════════════════════
  # 模型组 4:本地模型(通过 vLLM / Ollama)
  # ═══════════════════════════════════════════
  - model_name: local-llama
    litellm_params:
      model: openai/meta-llama/Llama-3.1-70B-Instruct
      api_base: http://vllm-server:8000/v1
      api_key: vllm-dummy-key               # 本地服务不需要真实 Key

# ═══════════════════════════════════════════════
# 路由策略(Router Settings)
# ═══════════════════════════════════════════════
router_settings:
  routing_strategy: usage-based-routing    # 按使用量智能分发
  num_retries: 3                           # 失败自动重试 3 次
  timeout: 30                              # 单次请求超时 30s
  fallbacks:
    # 主模型失败 → 自动降级
    - model: gpt-4o
      fallback_model: fast-chat            # gpt-4o 挂了 → 用 fast-chat
    - model: fast-chat
      fallback_model: local-llama          # fast-chat 挂了 → 用本地模型

  context_window_fallbacks:
    # 上下文超限时自动切换
    - model: gpt-4o
      fallback_model: local-llama          # 假设本地模型支持更长上下文

# ═══════════════════════════════════════════════
# 通用设置
# ═══════════════════════════════════════════════
litellm_settings:
  drop_params: true                        # 自动丢弃不支持的参数
  set_verbose: false                       # 生产环境关闭详细日志
  # 成本/用量追踪(可选)
  success_callback: ["langfuse"]           # 接入 Langfuse 可观测性

general_settings:
  master_key: sk-litellm-master-key-xxxx   # Proxy 管理密钥
  database_url: os.environ/DATABASE_URL

2.3 启动与验证

Bash

# 启动
docker compose -f docker-compose.litellm.yml up -d

# 验证模型列表
curl http://localhost:4000/v1/models \
  -H "Authorization: Bearer sk-litellm-master-key-xxxx"

# 测试对话
curl http://localhost:4000/v1/chat/completions \
  -H "Authorization: Bearer sk-litellm-master-key-xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "Hello!"}],
    "stream": true
  }'

三、Step 2:Dify 中接入 LiteLLM

3.1 ⚠️ 网络连通性(最常见的坑)

关键:Dify 运行在 Docker 中时,localhost 指向容器自身,不是宿主机

Dify 部署方式

LiteLLM 部署方式

Dify 中填写的 Base URL

Docker Compose

宿主机直接运行

http://host.docker.internal:4000/v1

Docker Compose

同一 Docker 网络

http://litellm-proxy:4000/v1

Docker Compose(Linux)

宿主机

http://172.17.0.1:4000/v1host.docker.internal

源码部署

同一主机

http://localhost:4000/v1

最佳实践:将 LiteLLM 加入 Dify 的 Docker 网络:

Yaml

# 在 Dify 的 docker-compose.yml 中追加 litellm 服务
services:
  # ... 已有 dify 服务 ...

  litellm-proxy:
    image: ghcr.io/berriai/litellm:main-latest
    container_name: litellm-proxy
    ports:
      - "4000:4000"
    volumes:
      - ./litellm_config.yaml:/app/config.yaml
    command: ["--config", "/app/config.yaml", "--port", "4000", "--host", "0.0.0.0"]
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    networks:
      - default            # 加入 Dify 同一网络!
    restart: unless-stopped

这样 Dify 中就可以直接用 http://litellm-proxy:4000/v1

3.2 在 Dify 中配置模型

进入 Dify → 设置 → 模型供应商 → OpenAI-API-Compatible(或搜索 "OpenAI API Compatible" 安装插件),点击 添加模型

┌──────────────────────────────────────────────────────┐ │ 添加模型 (OpenAI API Compatible) │ │ │ │ 模型名称: gpt-4o │ │ 模型类型: LLM │ │ API Key: sk-litellm-master-key-xxxx │ │ API endpoint: http://litellm-proxy:4000/v1 │ │ 上下文长度: 128000 │ │ 最大 tokens: 4096 │ │ 函数调用: ✅ 支持 │ │ 流式输出: ✅ 支持 │ │ 模式: Chat │ │ │ │ [ 验证 ] [ 保存 ] │ └──────────────────────────────────────────────────────┘

为 LiteLLM 配置文件中定义的每个模型重复上述步骤:

Dify 模型名称

模型类型

对应 LiteLLM 路由

gpt-4o

LLM

主力模型(OpenAI + Azure 负载均衡)

fast-chat

LLM

轻量快速模型(GPT-4o-mini + Claude Haiku)

local-llama

LLM

本地模型(vLLM Llama)

text-embedding

Text Embedding

Embedding 模型

注意:Dify 中的"模型名称"必须与 LiteLLM config.yaml 中的 model_name 完全一致

3.3 设置默认模型

设置 → 默认模型设置 中:

  • 系统推理模型:选择 gpt-4o

  • Embedding 模型:选择 text-embedding


四、Step 3:多路由工程化管理策略

4.1 负载均衡(同一模型名多部署)

Yaml

# litellm_config.yaml 中同一 model_name 出现多次 = 自动负载均衡
model_list:
  - model_name: gpt-4o              # 实例 1: OpenAI 官方
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY

  - model_name: gpt-4o              # 实例 2: Azure OpenAI
    litellm_params:
      model: azure/gpt-4o
      api_key: os.environ/AZURE_API_KEY
      api_base: https://my-azure.openai.azure.com

  - model_name: gpt-4o              # 实例 3: OpenAI 代理商
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_PROXY_KEY
      api_base: https://my-proxy.com/v1

路由策略选项

Yaml

router_settings:
  routing_strategy: usage-based-routing   # 按用量(权重自动调整)
  # 其他可选策略:
  # - simple-shuffle          # 随机轮询
  # - least-busy              # 最少并发
  # - latency-based-routing   # 延迟优先
  # - cost-based-routing      # 成本优先

4.2 Fallback 自动降级链

Yaml

router_settings:
  fallbacks:
    # 三级降级链
    - model: gpt-4o
      fallback_model:
        - fast-chat           # 1st fallback
        - local-llama         # 2nd fallback (本地兜底)

  # 上下文窗口超限降级
  context_window_fallbacks:
    - model: gpt-4o           # 128K 上下文
      fallback_model: local-llama  # 切换到更大上下文窗口的本地模型

  # 内容策略降级
  content_policy_fallbacks:
    - model: gpt-4o           # 被内容策略拦截时
      fallback_model: fast-chat

4.3 预算与限流管理

Yaml

# litellm_settings 中添加
litellm_settings:
  max_budget: 100              # 全局月度预算 $100
  budget_duration: "30d"

# 通过 API 创建 Virtual Key 实现精细化管控
# curl -X POST http://localhost:4000/key/generate \
#   -H "Authorization: Bearer sk-litellm-master-key-xxxx" \
#   -d '{
#     "models": ["gpt-4o", "fast-chat"],
#     "max_budget": 50,
#     "budget_duration": "30d",
#     "rpm_limit": 100,
#     "tpm_limit": 100000,
#     "metadata": {"team": "dify-app-prod"}
#   }'

控制维度

配置方式

场景

月度预算上限

max_budget + budget_duration

成本兜底

RPM 限流

rpm_limit

防止突发流量打爆

TPM 限流

tpm_limit

控制 Token 消耗速率

模型权限

models: [...]

限制 Key 只能用特定模型

模型级预算

按模型设置 model_max_budget

区分贵模型和便宜模型

4.4 为不同 Dify 应用分配不同 Virtual Key

Bash

# 为生产应用创建专用 Key
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-litellm-master-key-xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "models": ["gpt-4o", "fast-chat", "text-embedding"],
    "max_budget": 200,
    "budget_duration": "30d",
    "rpm_limit": 500,
    "metadata": {"env": "production", "app": "customer-service-bot"}
  }'
# → 返回: sk-litellm-virtual-key-aaa...

# 为开发环境创建受限 Key
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-litellm-master-key-xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "models": ["fast-chat"],
    "max_budget": 10,
    "budget_duration": "30d",
    "metadata": {"env": "dev", "app": "playground"}
  }'
# → 返回: sk-litellm-virtual-key-bbb...

在 Dify 中分别添加两个 OpenAI-API-Compatible 供应商配置,使用不同的 Virtual Key,即可实现生产/开发环境的模型隔离和预算控制。


五、Step 4:Dify 工作流中的模型路由实战

5.1 在工作流中按场景选择模型

在 Dify Workflow 中不同节点使用不同 LiteLLM 模型别名:

[Start] → [IF/ELSE: 查询复杂度判断] ├─ Simple → [LLM: fast-chat] → 轻量回答 └─ Complex → [LLM: gpt-4o] → 深度推理 ↓ [Knowledge Retrieval] (Embedding: text-embedding) ↓ [LLM: gpt-4o] → 最终回答

5.2 模型切换无需改 Dify 配置

最大优势:当需要切换底层模型(如 GPT-4o → Claude 3.5 Sonnet)时,只需修改 litellm_config.yaml

Yaml

# 只改这里,Dify 完全不用动!
- model_name: gpt-4o              # 对 Dify 暴露的名不变
    litellm_params:
      model: anthropic/claude-3-5-sonnet-20241022  # 底层换了
      api_key: os.environ/ANTHROPIC_API_KEY

重启 LiteLLM 即可,Dify 侧零修改。


六、运维与可观测性

6.1 LiteLLM Admin UI

LiteLLM 自带管理面板 http://localhost:4000/ui

  • 📊 实时用量统计(按模型/按 Key)

  • 🔑 Virtual Key 管理

  • 💰 成本追踪

  • 📋 请求日志与错误追踪

6.2 接入 Langfuse 做全链路追踪

Yaml

# litellm_config.yaml
litellm_settings:
  success_callback: ["langfuse"]
  failure_callback: ["langfuse"]

6.3 健康检查

Bash

# 定期检查 LiteLLM 健康
curl http://localhost:4000/health/liveliness
curl http://localhost:4000/health/readiness

# 检查所有模型连通性
curl http://localhost:4000/health \
  -H "Authorization: Bearer sk-litellm-master-key-xxxx"

七、常见问题排查

问题

原因

解决方案

Connection refused / Max retries exceeded

Docker 容器无法访问 localhost

使用 host.docker.internal:4000 或将 LiteLLM 加入 Dify 同一 Docker 网络

credentials validation failed

API Key 或 Base URL 错误

确认 LiteLLM master_key 正确,Base URL 以 /v1 结尾

模型列表为空

LiteLLM 未正确加载 config

检查 docker logs litellm-proxy,确认 YAML 语法正确

流式输出不工作

中间代理截断了 SSE

确保 LiteLLM 和 Dify 之间无 Nginx 反代截断 buffer

偶尔 429 限流

底层供应商限流

配置多个同名模型实例做负载均衡 + Fallback

Embedding 验证失败

模型类型配置错误

在 Dify 中模型类型选 Text Embedding,不是 LLM


八、完整工程化清单

✅ LiteLLM Proxy 部署(Docker,绑定 0.0.0.0) ✅ 多模型配置(model_list 定义所有模型别名) ✅ 负载均衡(同名模型多实例) ✅ Fallback 降级链(fallbacks + context_window_fallbacks) ✅ 预算限流(Virtual Key + max_budget + rpm_limit) ✅ Dify OpenAI-API-Compatible 接入(正确 Base URL + API Key) ✅ 网络连通(同一 Docker 网络或 host.docker.internal) ✅ 多环境 Key 隔离(生产/开发不同 Virtual Key) ✅ 可观测性(Admin UI + Langfuse + 健康检查) ✅ 模型热切换(改 config.yaml 重启即可,Dify 零修改)

这套架构的核心优势在于 Dify 专注应用编排,LiteLLM 专注模型治理——两者通过标准 OpenAI API 解耦,各自独立演进,是生产级 AI 应用基础设施的最佳实践之一。


评论