跳到主要内容

智能路由

概述

智能路由是 LLM Gateway 的核心功能,它能够根据不同的策略自动选择最优的 LLM 渠道来处理请求。通过智能路由,您可以:

  • 根据性能、成本、可靠性等因素自动选择最佳渠道
  • 实现多渠道负载均衡,提高系统吞吐量
  • 自动故障转移,确保服务高可用
  • 优化成本,降低 LLM API 调用费用
  • 灵活定制路由策略,满足不同业务需求
🧠
多种路由策略
支持优先级、负载均衡、成本优化、性能优先、均衡等多种策略
💗
健康感知
自动检测渠道健康状态,避免将请求路由到故障渠道
📈
实时指标
收集渠道的延迟、成本、成功率等实时指标用于路由决策
🔄
自动降级
当首选渠道不可用时,自动降级到备用渠道

路由架构

系统架构

智能路由系统由以下核心组件构成:

请求

路由器 (Router)

策略选择

┌─────────────────────────────────────┐
│ 健康检查器 指标收集器 模型注册表 │
└─────────────────────────────────────┘

渠道选择

中继层 (Relay)

LLM 提供商 API

核心组件

路由器 (Router)

路由器是智能路由系统的中央管理器,负责:

  • 管理所有路由策略
  • 维护模型与渠道的映射关系
  • 协调健康检查器和指标收集器
  • 根据请求参数选择合适的策略
  • 执行渠道选择逻辑

代码位置: smart/strategy/router.go

路由策略 (Strategy)

每个路由策略实现特定的渠道选择算法:

  • 实现 RoutingStrategy 接口
  • 基于不同的优化目标选择渠道
  • 支持健康感知和自动降级
  • 可以组合使用多个指标

代码位置: smart/strategy/*.go

健康检查器 (Health Checker)

持续监控渠道的健康状态:

  • 定期发送心跳请求检测可用性
  • 记录渠道响应时间
  • 标记不健康的渠道
  • 自动恢复健康的渠道

代码位置: smart/health/ 检查间隔: 每 30 秒

指标收集器 (Metrics Collector)

收集和维护渠道的性能指标:

  • 记录每次请求的延迟
  • 计算 token 使用和成本
  • 统计成功率和错误率
  • 提供聚合指标供策略使用

代码位置: smart/metrics/

模型注册表 (Model Registry)

维护模型与渠道的映射关系:

  • 存储每个模型可用的渠道列表
  • 记录渠道的优先级、权重等配置
  • 支持动态更新
  • 支持模型别名和映射

存储: 内存中的哈希表,启动时从数据库加载

路由流程

1

接收请求

客户端发送 OpenAI 格式的请求,包含:

  • 模型名称(如 gpt-4)
  • 路由策略(可选,通过请求头指定)
  • 其他请求参数
2

查找可用渠道

路由器根据模型名称,从模型注册表中查找所有支持该模型的渠道。

3

过滤健康渠道

从可用渠道中过滤出当前健康的渠道,排除:

  • 被禁用的渠道
  • 健康检查失败的渠道
  • 配额已用完的渠道
4

应用路由策略

根据指定的路由策略,对健康渠道进行评分和排序:

  • 获取渠道的性能指标
  • 应用策略算法计算得分
  • 按得分排序
5

选择最佳渠道

选择得分最高的渠道,如果该渠道不可用,依次尝试次优渠道。

6

转发请求

将请求转发到选中的渠道,通过相应的适配器转换请求格式。

7

收集指标

记录本次请求的指标:

  • 响应时间
  • Token 使用量
  • 成功/失败状态
  • 成本估算
8

返回响应

将 LLM 提供商的响应转换为 OpenAI 格式,返回给客户端。

路由策略

优先级策略 (Priority)

根据渠道的优先级配置选择渠道,优先级高的渠道优先被选择。

适用场景:

  • 有明确的主备渠道划分
  • 希望优先使用特定提供商
  • 需要手动控制渠道选择顺序

工作原理:

  1. 获取所有健康渠道
  2. 按优先级降序排序
  3. 选择优先级最高的渠道
  4. 如果不可用,依次降级到低优先级渠道

配置示例:

{
"channels": [
{
"id": 1,
"name": "OpenAI 主渠道",
"priority": 100,
"status": "enabled"
},
{
"id": 2,
"name": "OpenAI 备用渠道",
"priority": 80,
"status": "enabled"
},
{
"id": 3,
"name": "Azure OpenAI",
"priority": 60,
"status": "enabled"
}
]
}

使用方法:

cURL
curl -X POST https://your-gateway.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Routing-Strategy: priority" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}]
}'
Python
import openai

openai.api_base = "https://your-gateway.com/v1"
openai.api_key = "YOUR_TOKEN"

response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}],
headers={"X-Routing-Strategy": "priority"}
)
JavaScript
const openai = new OpenAI({
baseURL: "https://your-gateway.com/v1",
apiKey: "YOUR_TOKEN",
defaultHeaders: {
"X-Routing-Strategy": "priority"
}
});

const response = await openai.chat.completions.create({
model: "gpt-4",
messages: [{ role: "user", content: "Hello" }]
});
提示

优先级策略是默认策略,如果不指定路由策略,系统会使用优先级策略。

负载均衡策略 (LoadBalance)

在多个渠道之间均衡分配请求,支持多种负载均衡算法。

子算法:

按顺序依次选择渠道,循环往复。

特点:

  • 最简单的负载均衡算法
  • 请求平均分配到所有渠道
  • 不考虑渠道性能差异

使用场景:

  • 所有渠道性能相近
  • 需要简单的负载分配
-H "X-Routing-Strategy: load_balance"
-H "X-LB-Algorithm: round_robin"

适用场景:

  • 需要在多个渠道之间分散流量
  • 避免单个渠道过载
  • 提高系统整体吞吐量
  • 实现 A/B 测试
负载均衡示意图

成本优化策略 (CostOptimization)

选择成本最低的可用渠道,降低 API 调用费用。

工作原理:

  1. 获取所有健康渠道
  2. 查询每个渠道的定价信息
  3. 计算预估成本
  4. 选择成本最低的渠道

定价计算:

成本 = (输入 tokens × 输入单价 + 输出 tokens × 输出单价) / 1000

适用场景:

  • 成本敏感型应用
  • 大规模 API 调用
  • 对延迟要求不高的场景

配置示例:

{
"channels": [
{
"id": 1,
"name": "OpenAI GPT-4",
"model": "gpt-4",
"input_price": 0.03, // 每 1K tokens
"output_price": 0.06
},
{
"id": 2,
"name": "Azure GPT-4",
"model": "gpt-4",
"input_price": 0.025,
"output_price": 0.05
},
{
"id": 3,
"name": "GPT-3.5 Turbo",
"model": "gpt-3.5-turbo",
"input_price": 0.001,
"output_price": 0.002
}
]
}

使用方法:

curl -X POST https://your-gateway.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Routing-Strategy: cost_optimization" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}]
}'
信息

成本优化策略会在成本相近的渠道中,进一步考虑健康状态和性能指标。

性能优先策略 (PerformancePriority)

选择响应速度最快的渠道,降低延迟。

工作原理:

  1. 获取所有健康渠道
  2. 查询每个渠道的平均响应时间
  3. 选择延迟最低的渠道

延迟指标:

  • P50 延迟(中位数)
  • P90 延迟(90 分位数)
  • P95 延迟(95 分位数)
  • P99 延迟(99 分位数)
  • 平均延迟

适用场景:

  • 对响应时间要求高的应用
  • 实时聊天应用
  • 交互式应用
  • 用户体验敏感的场景

配置示例:

{
"channels": [
{
"id": 1,
"name": "低延迟渠道",
"avg_latency_ms": 500,
"p95_latency_ms": 800
},
{
"id": 2,
"name": "中等延迟渠道",
"avg_latency_ms": 1200,
"p95_latency_ms": 2000
},
{
"id": 3,
"name": "高延迟渠道",
"avg_latency_ms": 3000,
"p95_latency_ms": 5000
}
]
}

使用方法:

curl -X POST https://your-gateway.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Routing-Strategy: performance_priority" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}]
}'
提示

性能优先策略会持续学习各渠道的延迟表现,自动适应网络环境变化。

性能监控图表

均衡策略 (Balanced)

综合考虑性能、成本和可靠性,选择最均衡的渠道。

工作原理:

  1. 获取所有健康渠道
  2. 计算每个渠道的综合得分:
    得分 = α × 性能得分 + β × 成本得分 + γ × 可靠性得分
  3. 选择得分最高的渠道

权重配置:

  • 性能权重(α): 默认 0.4
  • 成本权重(β): 默认 0.3
  • 可靠性权重(γ): 默认 0.3

得分计算:

基于响应时间计算,延迟越低得分越高:

性能得分 = 1 - (渠道延迟 / 最大延迟)
  • 最快渠道: 1.0
  • 最慢渠道: 接近 0

适用场景:

  • 没有明确的单一优化目标
  • 需要平衡多个因素
  • 生产环境的通用策略
  • 长期稳定运行

使用方法:

curl -X POST https://your-gateway.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Routing-Strategy: balanced" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}]
}'

自定义权重:

curl -X POST https://your-gateway.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Routing-Strategy: balanced" \
-H "X-Performance-Weight: 0.5" \
-H "X-Cost-Weight: 0.2" \
-H "X-Reliability-Weight: 0.3" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}]
}'
信息

均衡策略是推荐用于生产环境的策略,它能在各种场景下提供较好的综合表现。

健康检查

健康检查机制

健康检查器持续监控所有启用渠道的健康状态:

1

定期心跳

每 30 秒向每个渠道发送一个轻量级测试请求。

2

记录结果

记录每次心跳的响应时间和状态(成功/失败)。

3

计算健康分数

基于最近 N 次心跳的成功率计算健康分数:

健康分数 = 成功次数 / 总次数
4

标记状态

根据健康分数标记渠道状态:

  • 健康分数 >= 0.8: 健康
  • 0.5 ≤ 健康分数 < 0.8: 警告
  • 健康分数 < 0.5: 不健康
5

自动恢复

不健康的渠道会继续被检查,恢复后自动标记为健康。

健康检查配置

健康检查行为可以通过系统设置调整:

配置项默认值说明
检查间隔30 秒两次心跳之间的间隔
超时时间10 秒心跳请求的超时时间
历史窗口10 次用于计算健康分数的历史记录数
不健康阈值0.5低于此分数标记为不健康
警告阈值0.8低于此分数标记为警告
健康检查配置页面

查看健康状态

在渠道管理页面,每个渠道都显示健康状态指示器:

  • 绿色对勾: 健康
  • 黄色感叹号: 警告
  • 红色叉号: 不健康

点击渠道可以查看详细的健康历史:

渠道健康状态

指标收集

收集的指标

指标收集器为每个渠道收集以下指标:

🕰️
延迟指标
  • 平均响应时间
  • P50/P90/P95/P99 延迟
  • 最小/最大响应时间
  • 延迟分布直方图
💲
成本指标
  • 总 token 使用量
  • 输入/输出 token 分布
  • 估算总成本
  • 平均每次请求成本
🛡️
可靠性指标
  • 请求总数
  • 成功请求数
  • 失败请求数
  • 成功率
  • 错误率
🔀
并发指标
  • 当前活跃连接数
  • 队列长度
  • 峰值并发数

指标聚合

指标在多个时间维度上聚合:

  • 实时: 最近 5 分钟
  • 短期: 最近 1 小时
  • 中期: 最近 24 小时
  • 长期: 最近 7 天、30 天
指标聚合时间线

查看指标

在渠道详情页面,查看该渠道的所有指标:

渠道指标仪表板

使用指南

选择合适的路由策略

不同场景下推荐使用不同的路由策略:

场景推荐策略理由
生产环境通用均衡策略综合考虑多个因素,稳定可靠
成本敏感成本优化最小化 API 调用费用
性能优先性能优先最低延迟,最佳用户体验
高可用场景优先级 + 自动降级主备渠道,自动故障转移
流量分散负载均衡避免单点过载,提高吞吐量
A/B 测试加权负载均衡按比例分配流量

指定路由策略

可以通过多种方式指定路由策略:

在每次请求中通过请求头指定:

curl -X POST https://your-gateway.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Routing-Strategy: performance_priority" \
-H "Content-Type: application/json" \
-d '{...}'

优先级: 请求头 > Token 配置 > 全局默认

配置渠道优先级

合理设置渠道优先级可以优化路由效果:

1

确定主备关系

根据渠道的性能、稳定性、成本等因素,确定主备关系。

2

设置优先级数值

  • 主渠道: 100
  • 备用渠道 1: 80
  • 备用渠道 2: 60
  • 测试渠道: 30
3

测试降级流程

禁用主渠道,验证系统是否正确降级到备用渠道。

4

监控和调整

根据实际运行情况,调整优先级配置。

配置负载均衡权重

设置权重实现流量按比例分配:

1

评估渠道容量

根据渠道的配额、性能、稳定性评估其承载能力。

2

计算权重比例

假设渠道容量比为 5:3:2,可以设置权重为:

  • 渠道 A: 10 (50%)
  • 渠道 B: 6 (30%)
  • 渠道 C: 4 (20%)
3

应用配置

在渠道编辑页面设置权重值。

权重配置
4

验证分配

使用负载均衡策略发送一批请求,查看实际流量分配是否符合预期。

监控路由效果

定期监控路由系统的运行状态:

📊
查看路由分布
查看请求在不同渠道之间的分布情况
🔍
分析策略效果
对比不同策略下的性能、成本、可靠性
⚠️
识别异常
发现异常流量分布或性能下降
🔧
优化配置
根据监控结果调整路由配置
路由监控仪表板

高级特性

自定义路由策略

如果内置策略不满足需求,可以开发自定义策略:

1

实现策略接口

创建新的策略类,实现 RoutingStrategy 接口:

type MyCustomStrategy struct {
*BaseStrategy
// 自定义字段
}

func (s *MyCustomStrategy) Route(ctx context.Context,
modelName string, request interface{}) (*types.ChannelInfo, error) {
// 获取可用渠道
channels := s.GetAvailableChannels(modelName)

// 应用自定义逻辑选择渠道
selectedChannel := s.selectBestChannel(channels)

return selectedChannel, nil
}

func (s *MyCustomStrategy) Name() string {
return "my_custom_strategy"
}
2

注册策略

在路由器初始化时注册新策略:

func (r *Router) initStrategies() {
// ... 其他策略
r.strategies["my_custom_strategy"] = NewMyCustomStrategy(r.collector)
}
3

使用策略

通过请求头指定自定义策略:

-H "X-Routing-Strategy: my_custom_strategy"

模型级别路由配置

可以为不同模型配置不同的路由策略:

{
"model_routing": {
"gpt-4": {
"strategy": "performance_priority",
"fallback_strategy": "priority"
},
"gpt-3.5-turbo": {
"strategy": "cost_optimization",
"fallback_strategy": "load_balance"
},
"claude-3-opus": {
"strategy": "balanced",
"fallback_strategy": "priority"
}
}
}

动态权重调整

根据实时指标自动调整渠道权重:

// 伪代码
func adjustWeights() {
for each channel {
// 根据成功率调整权重
if successRate > 0.95 {
weight = baseWeight * 1.2
} else if successRate < 0.8 {
weight = baseWeight * 0.5
}

// 根据延迟调整权重
if avgLatency < targetLatency {
weight = weight * 1.1
} else if avgLatency > targetLatency * 2 {
weight = weight * 0.8
}
}
}
注意

动态权重调整是实验性功能,需要在系统设置中启用。

条件路由

根据请求内容应用不同的路由策略:

// 伪代码
func routeByCondition(request) {
if request.estimatedTokens > 10000 {
// 大请求使用成本优化
return "cost_optimization"
} else if request.user.isPremium {
// 高级用户使用性能优先
return "performance_priority"
} else {
// 默认使用均衡策略
return "balanced"
}
}

最佳实践

生产环境配置建议

📚
配置主备渠道
为每个模型至少配置 2 个渠道,确保高可用
⚖️
使用均衡策略
生产环境推荐使用均衡策略,平衡多个因素
💗
启用健康检查
确保健康检查功能启用,自动故障转移
🔔
监控告警
配置告警规则,及时发现和处理问题

性能优化建议

  1. 合理设置优先级:

    • 低延迟渠道设置高优先级
    • 稳定性好的渠道设置高优先级
    • 避免频繁调整优先级
  2. 优化权重配置:

    • 根据渠道实际容量设置权重
    • 定期审查和调整权重
    • 使用监控数据指导权重设置
  3. 减少路由开销:

    • 指标收集异步进行
    • 缓存健康状态和指标数据
    • 避免在路由过程中进行复杂计算
  4. 充分利用缓存:

    • 路由决策结果可以短时间缓存
    • 健康状态检查结果缓存 30 秒
    • 指标数据分层缓存

成本优化建议

  1. 使用成本优化策略:

    • 对成本敏感的应用使用成本优化策略
    • 大规模调用场景优先考虑成本
  2. 配置多个低成本渠道:

    • 添加多个低成本提供商的渠道
    • 使用负载均衡分散流量
    • 高成本渠道作为备用
  3. 监控成本趋势:

    • 定期查看成本报告
    • 识别高成本的使用模式
    • 及时调整路由配置
  4. 设置配额限制:

    • 为每个渠道设置配额上限
    • 为用户设置配额限制
    • 避免意外超支

故障处理建议

单个渠道故障

现象: 某个渠道被标记为不健康

处理:

  1. 查看该渠道的健康检查日志
  2. 验证 API 密钥和配置
  3. 测试渠道连接
  4. 如果问题持续,临时禁用该渠道
  5. 系统会自动路由到其他健康渠道
多个渠道同时故障

现象: 多个渠道同时不可用

处理:

  1. 检查网络连接
  2. 查看提供商状态页面
  3. 检查防火墙和代理设置
  4. 如果是提供商侧问题,等待恢复
  5. 考虑添加不同地域或提供商的渠道
路由决策异常

现象: 请求被路由到非预期的渠道

处理:

  1. 检查渠道优先级和权重配置
  2. 查看路由策略设置
  3. 检查指标数据是否准确
  4. 查看路由日志,分析决策过程
  5. 调整配置后测试验证
性能下降

现象: 整体响应时间变长

处理:

  1. 查看各渠道的延迟指标
  2. 识别高延迟的渠道
  3. 降低高延迟渠道的优先级或权重
  4. 添加低延迟渠道
  5. 考虑使用性能优先策略

常见问题

如何测试路由策略的效果?

可以通过以下方式测试:

  1. 手动测试:

    • 使用不同的路由策略发送相同请求
    • 对比响应时间、成本等指标
    • 记录和分析结果
  2. 压力测试:

    • 使用负载测试工具(如 Apache Bench、wrk)
    • 模拟高并发场景
    • 观察不同策略下的系统表现
  3. A/B 测试:

    • 将流量按比例分配到不同策略
    • 收集和对比数据
    • 选择表现最好的策略
路由策略可以动态切换吗?

可以。路由策略支持动态切换,无需重启系统:

  • 通过请求头实时指定策略
  • 修改 Token 配置立即生效
  • 修改全局默认策略立即生效

切换策略不会影响正在处理的请求。

健康检查会影响 API 配额吗?

会,但影响很小:

  • 每个渠道每 30 秒一次心跳请求
  • 每次心跳使用非常少的 tokens(通常 < 20)
  • 每天每渠道约消耗 < 60,000 tokens
  • 相比实际业务请求,占比很小

如果对配额非常敏感,可以增加检查间隔或禁用心跳检查(不推荐)。

如何避免所有请求都路由到同一个渠道?

如果使用优先级或性能优先策略,可能出现这种情况。解决方法:

  1. 使用负载均衡策略
  2. 为渠道设置配额限制
  3. 使用均衡策略而非单一优化目标
  4. 设置相近的优先级,让健康状态和实时指标影响决策
成本优化策略如何处理不同的输入输出比例?

成本优化策略会根据历史数据估算输入输出比例:

  • 记录每个模型的平均输入输出 token 比例
  • 基于历史比例预估本次请求的成本
  • 选择预估成本最低的渠道

随着使用增加,估算会越来越准确。

可以为不同用户设置不同的路由策略吗?

可以通过以下方式实现:

  1. Token 级别: 为不同用户创建不同的 Token,设置不同的默认策略
  2. 用户组: 在用户管理中设置用户组,配置组级别的路由策略
  3. 动态路由: 在代码中根据用户属性动态选择策略

参考: 用户管理

相关页面