随着大型语言模型(LLM)和各种 AI 服务的普及,开发者在应用中集成这些能力变得越来越普遍。然而,直接调用如 OpenAI
、Hugging Face
等服务提供商的 API 端点,往往会带来一系列管理和运维上的挑战:
- 成本不透明:当 API 请求量增长时,相关费用也随之上升。但开发者往往难以精确追踪是哪些具体调用消耗了最多的资源,哪些属于无效或冗余请求,导致成本优化变得困难。
- 性能波动:在高并发时段,AI 服务的 API 响应时间可能延长,甚至出现偶尔的超时,这直接影响用户体验和应用的稳定性。
- 监控缺失:缺乏一个统一的平台来监控关键指标,例如用户最常使用的功能、效果最佳的提示词(Prompts)、错误请求的类型和频率等,使得服务优化缺乏数据支撑。
- IP 地址限制与信誉问题:部分 AI 服务对请求来源的 IP 地址有严格的限制或策略。使用共享或信誉不佳的 IP 地址发起调用,可能导致请求失败,甚至影响模型输出的质量。
为了应对这些挑战,Cloudflare
推出了 AI Gateway
服务。这是一个免费提供的智能代理层,架设在应用程序与后端 AI 服务之间,专注于 AI 请求的管理、监控和优化,而非执行 AI 计算本身。
Cloudflare AI Gateway
的核心价值在于提供统一的分析与日志、智能缓存、速率限制以及自动重试等功能。通过将 AI 请求流量路由至 AI Gateway
,开发者可以获得一个集中控制点,有效解决上述痛点。特别是其全球网络节点,有助于作为可信中继,缓解因 IP 地址限制或地理位置导致的问题。
下面将演示如何配置和使用 Cloudflare AI Gateway
。
第一步:创建 AI Gateway 实例
配置过程非常直接,前提是拥有一个 Cloudflare
账户(如果尚未注册,可以免费创建)。
- 登录 Cloudflare 控制台:访问
dashboard.cloudflare.com
。 - 导航至 AI:在左侧菜单中找到并点击 “AI” 选项。
- 选择 AI Gateway:在 AI 子菜单下,点击 “AI Gateway”。
- 创建网关:点击页面上显眼的 “Create Gateway” 按钮。
- 命名网关:为网关指定一个清晰的名称,例如
my-app-gateway
。此名称将成为后续 API 端点 URL 的一部分。 - (可选) 添加描述:可以添加描述信息,方便后续管理。
- 确认创建:完成命名和描述后,点击确认创建。
创建成功后,系统会展示网关的详细信息页面。关键信息是 Gateway Endpoint URL(网关端点 URL),请务必记录下来。其基本格式如下:
https://gateway.ai.cloudflare.com/v1/<ACCOUNT_TAG>/<GATEWAY_NAME>/<PROVIDER>
<ACCOUNT_TAG>
:Cloudflare
账户的唯一标识符,会自动填充。<GATEWAY_NAME>
:上一步中为网关设置的名称,例如my-app-gateway
。<PROVIDER>
:目标 AI 服务提供商的标识符,如openai
,workers-ai
,huggingface
等。这指示AI Gateway
将请求转发给哪个后端服务。
第二步:集成 AI Gateway 到应用程序
这是核心步骤:需要修改应用程序代码,将原来直接访问 AI 服务 API 的基础 URL (Base URL) 替换为上一步获取的 Cloudflare AI Gateway
URL。
重要提示:仅需替换基础 URL 部分。请求路径、查询参数、请求头(包括 API 密钥)等应保持不变。AI Gateway
会安全地将包含 API 密钥的请求头透传给最终的 AI 服务提供商。
示例 1:在 Python 应用中使用 OpenAI SDK
假设原先直接调用 OpenAI
API 的代码如下:
# --- 原始代码 (直接调用 OpenAI) ---
import openai
import os
# 从环境变量加载 OpenAI API Key
client = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
# 默认 base_url 指向 https://api.openai.com/v1
try:
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "你好,世界!"}]
)
print("OpenAI Direct Response:", response.choices[0].message.content)
except Exception as e:
print(f"Error: {e}")
修改后,通过 AI Gateway
发送请求:
# --- 修改后代码 (通过 Cloudflare AI Gateway) ---
import openai
import os
# Cloudflare 账户 Tag 和 网关名称 (替换为实际值)
cf_account_tag = "YOUR_CLOUDFLARE_ACCOUNT_TAG"
cf_gateway_name = "my-app-gateway"
# 构造指向 OpenAI 的 AI Gateway URL
# 注意末尾的 /openai 是提供商标识
gateway_url = f"https://gateway.ai.cloudflare.com/v1/{cf_account_tag}/{cf_gateway_name}/openai"
# OpenAI API Key 保持不变,从环境变量加载
api_key = os.environ.get("OPENAI_API_KEY")
# 核心修改:在初始化 OpenAI 客户端时传入 base_url 参数
client = openai.OpenAI(
api_key=api_key,
base_url=gateway_url # 指向 Cloudflare AI Gateway
)
try:
# 请求的模型、消息等其他参数保持不变
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "你好,世界!(通过 Gateway)"}]
)
print("Via AI Gateway Response:", response.choices[0].message.content)
except Exception as e:
print(f"Error hitting Gateway: {e}")
关键改动在于初始化 OpenAI
客户端时,通过 base_url
参数指定了 AI Gateway
的 URL。
示例 2:在 JavaScript (Node.js 或浏览器) 中使用 fetch API
假设原始代码使用 fetch
直接调用 OpenAI
:
// --- 原始代码 (直接 fetch OpenAI) ---
const apiKey = process.env.OPENAI_API_KEY; // 或其他获取方式
const openAIBaseUrl = "https://api.openai.com/v1";
fetch(`${openAIBaseUrl}/chat/completions`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify({
model: "gpt-3.5-turbo",
messages: [{"role": "user", "content": "Hello from fetch!"}]
})
})
.then(res => res.json())
.then(data => console.log("OpenAI Direct Fetch:", data.choices[0].message.content))
.catch(err => console.error("Error:", err));
修改为通过 AI Gateway
发送请求:
// --- 修改后代码 (通过 AI Gateway fetch) ---
const apiKey = process.env.OPENAI_API_KEY;
const cfAccountTag = "YOUR_CLOUDFLARE_ACCOUNT_TAG"; // 替换为实际值
const cfGatewayName = "my-app-gateway"; // 替换为实际值
// 构造 AI Gateway URL
const gatewayBaseUrl = `https://gateway.ai.cloudflare.com/v1/${cfAccountTag}/${cfGatewayName}/openai`;
// 核心修改:替换请求 URL 的基础部分
fetch(`${gatewayBaseUrl}/chat/completions`, { // URL 指向 Gateway
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}` // API Key 仍在 Header 中发送
},
body: JSON.stringify({ // 请求体不变
model: "gpt-3.5-turbo",
messages: [{"role": "user", "content": "Hello from fetch via Gateway!"}]
})
})
.then(res => res.json())
.then(data => console.log("Via AI Gateway Fetch:", data.choices[0].message.content))
.catch(err => console.error("Error hitting Gateway:", err));
不论使用何种编程语言或框架(如 LangChain
, LlamaIndex
等),集成的基本思路是一致的:找到配置 AI 服务 API 端点或基础 URL 的地方,将其替换为对应的 Cloudflare AI Gateway
URL。
完成代码修改并部署应用后,所有发往目标 AI 服务的请求都将流经 AI Gateway
。
第三步:利用 AI Gateway 的内置功能
返回 Cloudflare
控制台中的 AI Gateway
管理页面,可以观察和利用其提供的各项功能:
- 实时分析 (Analytics): 提供关于请求量、成功率、错误分布、Token 使用量、预估费用、延迟(P95/P99)等关键指标的可视化图表。这有助于快速识别性能瓶颈和成本异常点。
- 日志 (Logs): 提供详细的请求日志,记录每条请求的时间戳、状态码、目标模型、部分请求/响应元数据、耗时、缓存状态等信息。是进行问题排查和用户行为分析的重要工具。
- 缓存 (Caching): 在网关的 "Settings"(设置)页面可以启用缓存。通过设置合适的 TTL (Time-To-Live),例如 1 小时(3600 秒),
AI Gateway
可以缓存对相同请求(提示词、模型等完全一致)的响应。在 TTL 有效期内,后续相同的请求将直接由Gateway
返回缓存结果,响应速度极快,并且不会消耗后端 AI 服务提供商的 Token 或计算资源。这对于 AI 生成内容(如商品描述)等存在重复请求的场景尤其有效,能显著降低成本和延迟。 - 速率限制 (Rate Limiting): 同样在 "Settings"(设置)页面可以配置速率限制规则。可以基于 IP 地址或自定义请求头(例如传递用户 ID 或特定 API Key)来限制请求频率。例如,可以设定“单个 IP 地址每分钟最多允许 20 次请求”。这有助于防止恶意攻击或因程序错误导致的资源滥用。
战略价值
对于需要集成和管理一个或多个 AI 服务的开发者和团队而言,Cloudflare AI Gateway
提供了一个集中化、易于管理的解决方案。它不仅解决了直接调用 API 时常见的成本、性能和监控难题,还通过缓存和速率限制等功能提供了额外的优化和保护层。相比于开发者自行搭建和维护类似的代理、缓存和监控系统,AI Gateway
大大降低了复杂性和工作量。随着 AI 应用的深入,利用此类网关服务进行统一管理,对于保持系统的健壮性、控制运营成本和未来灵活扩展至关重要。