大数跨境

Bifrost:比 LiteLLM 快 40 倍的 LLM 网关

Bifrost:比 LiteLLM 快 40 倍的 LLM 网关 索引目录
2025-12-24
1
导读:关注「索引目录」公众号,获取更多干货。

关注「索引目录」公众号,获取更多干货。

深入剖析 Bifrost:一个开源、可自托管的 Go LLM 网关


生产 LLM 系统中的网关开销



在大多数 LLM 系统中,网关成为共享依赖项:它会影响尾延迟、路由/故障转移行为、重试机制以及跨提供商的成本分配。LiteLLM 作为轻量级 Python 代理运行良好,但在我们模拟生产环境的负载测试中,我们发现并发性越高,网关开销和运维复杂性就越明显。因此,我们迁移到 Bifrost,以获得更低的开销以及网关内置的一流功能,例如治理、成本语义和可观测性。

在我们的基准测试环境中(启用日志记录/重试机制),LiteLLM 为每个请求增加了数百微秒的额外开销。结果会因部署模式和配置而异。当每秒处理数千个请求时,这种开销会不断累积——基础设施成本增加,尾延迟增加,运维复杂性也随之提高。

Bifrost采取了不同的方法。


进入彩虹桥



Bifrost 是一个用 Go 语言编写的 LLM 网关,在我们的测试环境中,它每个请求大约会增加 11 微秒的开销。这比我们在类似配置下使用 LiteLLM 的速度快了大约 40 倍。

但性能提升只是其中的一部分。Bifrost重新设计了LLM基础设施的控制平面——它将治理、成本归因和可观测性作为一流的网关功能提供,而无需外部工具或应用级监控。

让我来详细解释一下技术细节。



maximhq / bifrost
速度最快的 LLM 网关(比 LiteLLM 快 50 倍),具有自适应负载均衡器、集群模式、防护措施、支持 1000 多个模型,并且在 5k RPS 下开销小于 100 µs。


构建永不宕机的 AI 应用的最快方法
Bifrost 是一款高性能 AI 网关,它通过一个兼容 OpenAI 的 API 统一访问 15 个以上的服务提供商(包括 OpenAI、Anthropic、AWS Bedrock、Google Vertex 等)。无需任何配置,即可在几秒钟内完成部署,并获得自动故障转移、负载均衡、语义缓存和企业级功能。
快速入门


不到一分钟即可从零开始搭建可用于生产的AI网关。
步骤 1:启动 Bifrost 网关
# Install and run locally npx -y @maximhq/bifrost # Or use Docker docker run -p 8080:8080 maximhq/bifrost
步骤 2:通过 Web 用户界面进行配置
# Open the built-in web interface open http://localhost:8080
步骤 3:进行首次 API 调用
curl -X POST http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-4o-mini", "messages": [{"role": "user", "content": "Hello, Bifrost!"}] }'
搞定!您的AI网关已运行,并配备用于可视化配置和实时监控的Web界面……
在 GitHub 上查看


设置和部署

传统的网关部署通常涉及管理 Python 环境、依赖链和配置文件。以下是 Bifrost 的方法:

npx -y @maximhq/bifrost

这条命令会下载适用于您平台的预编译二进制文件,并在 8080 端口上启动一个可用于生产的网关,并提供一个用于配置的 Web 用户界面。

这与典型的Python网关设置相比如何:

# Install Python (verify version compatibility)
pip install litellm
# Configure environment variables
# Set up configuration file
# Install additional dependencies for features
# Debug environment-specific issues

Bifrost 使用 NPX 下载适用于您平台的预编译二进制文件。无需 Python 解释器,无需虚拟环境,也无需依赖项解析。只需一个静态链接的可执行文件,即可立即运行。


为什么选择网关基础设施

选择 Go 而不是 Python 对生产系统有可衡量的影响,尤其是在并发性、内存效率和操作简便性方面。

并发模型

Python 网关通过异步和多工作线程实现扩展。在高并发情况下,其缺点体现在每个实例更高的内存占用、协调开销以及突发情况下的尾延迟上。

Go 语言没有这些限制。Go 的 goroutine 是轻量级线程,可以在所有可用的 CPU 核心上真正并行运行。当一个请求到达时,Bifrost 会生成一个 goroutine。当一千个请求同时到达时,Bifrost 会生成一千个 goroutine——所有 goroutine 并发运行,开销极小。


GIF



内存效率

大多数配置下,Python 进程启动时通常需要 30-50MB 的内存。如果添加 Flask 或 FastAPI,在处理任何请求之前,基础内存使用量通常会达到 100MB 以上,但这会根据具体的配置和依赖项而有所不同。
整个 Bifrost 二进制文件大约 20MB。在内存方面,单个 Bifrost 实例在持续负载下处理每秒数千个请求时,大约会占用 50MB 的内存。



启动时间

Python应用程序需要时间进行初始化——导入包、启动解释器、加载配置。典型的启动时间至少为2-3秒。

Bifrost 的启动速度仅需几毫秒。这对于自动扩缩容、开发迭代和无服务器部署至关重要,因为冷启动会影响用户体验。

基准测试结果

以下是对 t3.xlarge EC2 实例进行持续负载测试(每秒 5,000 个请求)的测量结果:


指标
LiteLLM
彩虹桥
改进
网关开销
440 微秒
11 微秒
速度提升 40 倍
内存使用情况
约500 MB
约 50 MB
减少10倍
网关级故障
11%
0%
未观察到故障
排队等待时间
47 微秒
1.67 微秒
速度提升 28 倍
总延迟(含服务提供商)
2.12秒
1.61秒
速度提升 24%


这些测量结果代表的是持续数小时的负载,而不是合成基准。


超越性能:生产环境中至关重要的控制平面特性

从 LiteLLM 迁移到 Bifrost 的主要原因并非语言本身,而是控制平面特性。Bifrost 在网关层(而非分散在应用程序代码中)增加了治理功能(虚拟密钥、预算、速率限制)、一致的成本归因以及面向生产的可观测性。

这种架构选择将原本需要外部服务或应用层检测才能解决的问题集中化处理:

  • 治理控制
    在网关处进行管理,而不是在每个应用程序层面进行管理。
  • 基于每次请求的跟踪和聚合进行成本归因
  • 内置结构化日志、指标和请求跟踪的可观测性
  • 利用断路器和自动故障转移实现故障隔离

让我们详细了解一下这些特点。


制作特点

自动故障转移

当您的主要提供商达到速率限制或发生故障时,请求应无缝转移到备用提供商,无需人工干预。

Bifrost 配置:

{
  "fallbacks": {
    "enabled": true,
    "order": [
      "openai/gpt-4o-mini",
      "anthropic/claude-sonnet-4",
      "mistral/mistral-large-latest"
    ]
  }
}



当 OpenAI 返回速率限制错误时,Bifrost 会自动尝试使用 Anthropic 进行重试。如果仍然失败,则会尝试使用 Mistral。您的应用程序无需实现重试逻辑即可收到成功响应。

负载均衡

将负载分散到多个 API 密钥上,可以防止单个密钥达到速率限制:

{
  "providers": {
    "openai": {
      "keys": [
        {"name": "key-1", "value": "sk-...", "weight": 2.0},
        {"name": "key-2", "value": "sk-...", "weight": 1.0},
        {"name": "key-3", "value": "sk-...", "weight": 1.0}
      ]
    }
  }
}



第一个密钥接收 50% 的流量,其余两个密钥各接收 25%。当某个密钥接近其速率限制时,Bifrost 会自动将负载转移到其他健康的密钥上。

语义缓存

语义缓存并非新概念;团队可以自行构建,但 Bifrost 将其作为一流的网关功能提供,从而减少了组件的变动。

传统缓存需要完全匹配的字符串。但用户很少会以完全相同的方式提问:

  • “天气如何?”
  • 今天天气怎么样?
  • 请告诉我目前的天气状况。

它们在语义上是等价的。Bifrost 使用向量嵌入来理解语义相似性:



  1. 收到请求:“什么是 Python?”
  2. Bifrost 使用快速模型生成嵌入。
  3. 检查向量存储中是否存在相似的嵌入向量
  4. 找到之前的请求:“给我解释一下Python”
  5. 返回缓存的响应(相似度得分:0.92)



结果:无需调用LLM。响应时间约为5毫秒,而非2秒。成本:0.00美元,而非0.0001美元。



节省的费用取决于缓存命中率和工作负载重复次数。如果缓存命中率达到 60%,超过一百万次的请求大约可以节省 60 美元。

统一接口

每个LLM提供商都有不同的API格式。OpenAI使用一种模式,Anthropic使用另一种模式,而Bedrock和Vertex AI则各自有自己的规范。

Bifrost 提供了一个可与所有提供商兼容的统一 API:

from openai import OpenAI

# Change only the base URL
client = OpenAI(
    api_key="not-needed",
    base_url="http://localhost:8080/openai"
)

# Use ANY provider with the same code
response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4",  # Not an OpenAI model
    messages=[{"role": "user", "content": "Hello"}]
)

您的应用程序代码保持不变。只需修改一行代码即可切换提供商。无需重构。无需重写集成测试。

模型上下文协议(MCP)

MCP 是 Anthropic 公司用于允许 AI 模型使用外部工具的协议。它可以集成网络搜索、文件系统访问或数据库查询等功能:

{
  "mcp": {
    "enabled": true,
    "servers": {
      "web-search": {
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-brave-search"]
      },
      "filesystem": {
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
      }
    }
  }
}

这使得人工智能模型能够执行操作,而不仅仅是生成文本回复。


Web UI 和可观测性



大多数网关都提供配置文件和命令行工具。Bifrost 包含一个全面的 Web 界面,网址为http://localhost:8080

仪表盘:实时指标显示请求次数、错误率和每个提供商的成本

提供商:所有提供商的可视化配置,支持基于点击的密钥管理



日志:包含完整的请求/响应历史记录以及令牌使用情况,可搜索和筛选。



设置:无需编辑配置文件即可配置缓存、治理和插件



所有配置、监控和调试均可通过 Web 界面完成,无需通过 SSH 访问服务器或进行手动日志分析。


建筑细节

请求流程



  1. 请求到达
    Bifrost 的 HTTP 服务器
  2. 请求验证
    在微秒内完成。
  3. 缓存查找
    会检查语义缓存(如果已启用)。
  4. 缓存命中?
    立即返回(总共大约需要 5 毫秒)
  5. 缓存未命中?
    继续选择提供商
  6. 负载均衡器
    根据权重和健康状况选择 API 密钥。
  7. 并发请求
    已分发给提供者(已生成goroutine)
  8. 如果启用,响应流将立即开始。
  9. 缓存存储
    是异步(非阻塞)进行的。
  10. 响应返回
    给客户端,其中包含元数据

所有操作尽可能采用非阻塞方式。在无存储模式下,缓存查找不会阻塞提供程序调用。缓存存储不会延迟响应交付。

并发实现

Bifrost 使用 Go 的 goroutine 来实现并发:

传统 Python 线程:

Request 1 → Thread 1 → Process (limited parallelism)
Request 2 → Thread 2 → Wait/Process (coordination overhead)
Request 3 → Thread 3 → Wait/Process (memory per thread)

Bifrost 程序:

Request 1 → Goroutine 1 ⟍
Request 2 → Goroutine 2 ⟋→ All process in parallel → Responses
Request 3 → Goroutine 3 ⟋

每个 goroutine 大约占用 2KB 内存。您可以同时运行数百万个 goroutine。

矢量商店集成

对于语义缓存,Bifrost 与 Weaviate 集成:

  1. 请求到达时带有缓存键:“user-session-123”
  2. Bifrost 提取消息内容
  3. 使用快速模型(text-embedding-3-small)生成嵌入向量
  4. 在 Weaviate 中搜索相似的嵌入(阈值:0.8)
  5. 找到相似度为 0.92 的匹配项
  6. 返回包含元数据的缓存响应

嵌入生成:约 50 毫秒。向量搜索:约 10 毫秒。总计:60 毫秒,而实际 LLM 调用需要 2000 毫秒。


设置语义缓存

步骤 1:安装 Weaviate

使用 Docker 进行本地开发:

docker run -d \
  --name weaviate \
  -p 8081:8080 \
  -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
  semitechnologies/weaviate:latest

或者使用 Weaviate Cloud(提供免费套餐),网址为https://console.weaviate.cloud/

步骤 2:配置 Bifrost

更新您的config.json

{
  "providers": {
    "openai": {
      "keys": [{
        "name": "main",
        "value": "env.OPENAI_API_KEY",
        "models": ["gpt-4o-mini"]
      }]
    }
  },
  "vector_store": {
    "enabled": true,
    "type": "weaviate",
    "config": {
      "host": "localhost:8081",
      "scheme": "http"
    }
  },
  "plugins": [{
    "enabled": true,
    "name": "semantic_cache",
    "config": {
      "provider": "openai",
      "embedding_model": "text-embedding-3-small",
      "ttl": "5m",
      "threshold": 0.8
    }
  }]
}

步骤 3:测试缓存

# First request (cache miss, calls LLM)
curl -X POST http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "x-bf-cache-key: user-123" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [{"role": "user", "content": "What is Docker?"}]
  }'

# Similar request (cache hit, fast response)
curl -X POST http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "x-bf-cache-key: user-123" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [{"role": "user", "content": "Explain Docker to me"}]
  }'

第二个请求大约在 60 毫秒内返回,而不是 2000 毫秒。

缓存命中响应

{
  "choices": [...],
  "extra_fields": {
    "cache_debug": {
      "cache_hit": true,
      "hit_type": "semantic",
      "similarity": 0.94,
      "threshold": 0.8,
      "provider_used": "openai",
      "model_used": "text-embedding-3-small"
    }
  }
}

响应中包含调试信息,显示相似度得分和阈值。请根据您的准确度要求调整阈值。


直接替换

您可以通过更改一个参数,将现有的 OpenAI 或 Anthropic SDK 调用替换为 Bifrost。

Python 示例

前:

from openai import OpenAI

client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Hello"}]
)

后:

from openai import OpenAI

client = OpenAI(
    api_key="not-needed",
    base_url="http://localhost:8080/openai"  # Only change
)
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Hello"}]
)

Node.js 示例

前:

import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY
});

后:

import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: 'not-needed',
  baseURL: 'http://localhost:8080/openai'  // Only change
});

好处

这种方法可以实现:

  • 无需重构即可将 Bifrost 添加到现有应用程序中
  • 在生产环境中进行测试,逐步推广
  • 立即访问所有 Bifrost 功能(缓存、回退、监控)
  • 如有需要,可轻松回滚

监测和可观测性

Bifrost 在以下位置公开了 Prometheus 指标/metrics

# Request metrics
bifrost_requests_total{provider="openai",model="gpt-4o-mini"} 1543
bifrost_request_duration_seconds{provider="openai"} 1.234

# Cache metrics
bifrost_cache_hits_total{type="semantic"} 892
bifrost_cache_misses_total 651

# Error metrics
bifrost_errors_total{provider="openai",type="rate_limit"} 12

Grafana 仪表盘

将 Prometheus 连接到 Grafana 以进行可视化:

  • 提供商每秒请求数
  • 潜伏期百分位数(p50、p95、p99)
  • 缓存命中率随时间变化
  • 按供应商进行成本跟踪
  • 错误率和错误类型

结构化日志

Bifrost 日志转换为结构化 JSON:

{
  "level": "info",
  "time": "2024-01-15T10:30:00Z",
  "msg": "request completed",
  "provider": "openai",
  "model": "gpt-4o-mini",
  "duration_ms": 1234,
  "tokens": 456,
  "cache_hit": false
}

此格式可与任何日志聚合服务(CloudWatch、Datadog、Elasticsearch)集成。


常见配置问题

问题 1:缺少缓存键

语义缓存需要该x-bf-cache-key请求头。如果没有该请求头,每次请求都会导致缓存未命中。

错误:

curl -X POST http://localhost:8080/v1/chat/completions -d '{...}'

正确的:

curl -X POST http://localhost:8080/v1/chat/completions \
  -H "x-bf-cache-key: user-session-123" \
  -d '{...}'

问题 2:阈值配置

初始阈值设为 0.8,然后根据缓存命中率和准确率进行调整:

{
  "threshold": 0.8  // Starting point
}

监控缓存命中率。如果低于 30%,请将阈值降低至 0.75。如果缓存结果不正确,请将阈值提高至 0.85。

问题 3:配置存储需求

某些插件需要配置存储库:

{
  "config_store": {
    "enabled": true,
    "type": "sqlite",
    "config": {"path": "./config.db"}
  }
}

问题 4:Weaviate 网络配置

确保可以从 Bifrost 访问 Weaviate。对于 Docker 部署:

{
  "vector_store": {
    "enabled": true,
    "type": "weaviate",
    "config": {
      "host": "weaviate-container:8080",  // Use correct hostname
      "scheme": "http"
    }
  }
}

对于 Weaviate Cloud:

{
  "vector_store": {
    "enabled": true,
    "type": "weaviate",
    "config": {
      "host": "<weaviate-host>.gcp.weaviate.cloud",
      "scheme": "https",
      "api_key": "<weaviate-api-key>"
    }
  }
}

何时使用Bifrost

Bifrost 可为以下方面带来即时价值:

  • 生产系统每天处理超过1000个请求。
  • 尾部延迟会影响用户体验的应用
  • 需要自动故障转移但又不想进行复杂编排的团队
  • 各组织追踪多家供应商的LLM成本
  • 需要管控的系统(速率限制、预算、虚拟密钥)
  • 部署中,操作简便性可降低维护负担。

即使对于较小的项目,Bifrost 的极低开销和内置功能也能提供强大的基础,无需将来重构即可扩展。

入门

  1. 跑步npx -y @maximhq/bifrost
  2. 打开http://localhost:8080
  3. 在用户界面中添加您的 API 密钥。
  4. 将您的申请指向http://localhost:8080/openai
  5. 通过仪表板监控绩效和成本

资源

  • GitHub:github.com/maximhq/bifrost
  • 网站:getbifrost.ai
  • 文档:docs.getbifrost.ai

关注「索引目录」公众号,获取更多干货。


【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读12
粉丝0
内容444